// @ts-ignore import common from "common-prefix" export interface IUrlPack { __p: string [name: string]: string } export interface IUrlMap { [name: string]: string } export const urlsPacker = { /** * 把多个 url 组成的表,序列化为特殊格式的 JSON 文本 * 这个文本会复用多个 url 的共同前缀,节省空间 * * @example * { "32":"32-56c4fb498d439255a209d5b0d26d06d7.png", * "72":"72-22dc147ceb29dfdd990fb031fec4ee64.png", * "144":"144-39fff0a4372bc98c2d501a43179b01c1.png", * "__p":"https://file-cn.moonvy.com/t/38cedb9e-f2f0-40d5-8964-2108d7dbc549/c/icons/icon-@" * } * @param urlMap */ pack(urlMap: { [name: string]: string }): string { let urlPack: any = {} let prefix let prefixReg let urls: string[] = Object.values(urlMap).map((x) => x) let lcp = common(urls) if (lcp && lcp.length > 0) { prefix = lcp urlPack.__p = lcp prefixReg = RegExp("^" + prefix) } // console.log("lcp", lcp) for (let name in urlMap) { let url = urlMap[name] if (prefixReg) url = url.replace(prefixReg, "") urlPack[name] = url } return JSON.stringify(urlPack) }, /** * 把特殊格式的 Url JSON 文本还原成对象 * @param urlpack */ unpack(urlpack: string): { [name: string]: string } { let data: IUrlPack = JSON.parse(urlpack) let prefix = data.__p delete (data).__p if (prefix) { for (let key in data) { data[key] = prefix + data[key] } } return data }, }