You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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实现,兼容性好):

  1. 在脚本开头添加依赖声明:
// @require      https://cdn.jsdelivr.net/npm/pako@2.1.0/dist/pako.min.js
  1. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:53:28