如何在Violentmonkey脚本中压缩字符串?
Violentmonkey脚本字符串压缩方案
不依赖外部库的原生方案
1. 原生Compression Streams API(推荐,现代浏览器支持)
利用浏览器原生的压缩/解压API,无需任何外部依赖,压缩率和性能都不错,支持gzip/deflate算法。
// 压缩字符串为base64格式 async function compressString(str) { const encoder = new TextEncoder(); const rawData = encoder.encode(str); const compressedStream = new Blob([rawData]).stream().pipeThrough(new CompressionStream('gzip')); const compressedBlob = await new Response(compressedStream).blob(); const arrayBuffer = await compressedBlob.arrayBuffer(); return btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); } // 解压base64格式的压缩字符串 async function decompressString(base64Str) { const uint8Data = Uint8Array.from(atob(base64Str), char => char.charCodeAt(0)); const decompressedStream = new Blob([uint8Data]).stream().pipeThrough(new DecompressionStream('gzip')); const decompressedBlob = await new Response(decompressedStream).blob(); return await decompressedBlob.text(); }
兼容性:Chrome 80+、Firefox 113+、Edge 80+,主流现代浏览器都支持,Violentmonkey在这些环境下可直接使用。
2. 自定义简单压缩(适合高重复内容)
针对有大量重复子串的文本,通过字符映射实现轻量压缩,实现简单但压缩率依赖内容重复度:
// 压缩(返回压缩数据和映射表) function simpleCompress(str) { const wordMap = new Map(); let index = 0; const splitWords = str.split(/\s+/); const compressedData = splitWords.map(word => { if (!wordMap.has(word)) { wordMap.set(word, index++); } return wordMap.get(word); }).join(','); return { data: compressedData, map: Array.from(wordMap.keys()) }; } // 解压 function simpleDecompress(compressedObj) { const { data, map } = compressedObj; return data.split(',').map(idx => map[parseInt(idx)]).join(' '); }
使用轻量外部库的方案
Violentmonkey支持通过@require指令引入外部库,推荐用pako(轻量zlib实现,兼容性好):
- 在脚本开头添加依赖声明:
// @require https://cdn.jsdelivr.net/npm/pako@2.1.0/dist/pako.min.js
- 调用pako进行压缩/解压:
// 压缩为base64 function compressWithPako(str) { const compressedStr = pako.gzip(str, { to: 'string' }); return btoa(compressedStr); } // 解压base64压缩串 function decompressWithPako(base64Str) { const rawCompressed = atob(base64Str); return pako.ungzip(rawCompressed, { to: 'string' }); }
优势:兼容性覆盖更多老浏览器,压缩效果稳定,实现成本低。
方案选择建议
- 优先选原生Compression Streams API:无依赖、性能优,适合现代浏览器环境。
- 需要兼容老浏览器:用pako库,引入简单,压缩效果可靠。
- 字符串有大量重复内容:用自定义简单压缩,完全自主实现,无需额外依赖。
内容的提问来源于stack exchange,提问作者Der_Floh
相关产品推荐
相关产品推荐

