首页 > 解决方案 > 将大型 JSON/JS 对象从内容脚本压缩到 background.js - chrome 扩展

问题描述

我想将一个大型 JSON/JS 对象从 content.js 发送到 background.js

我已经尝试使用库lz-string来压缩对象。

内容.js

var compressedJSON = LZString.compress(JSON.stringify(largeObject));
chrome.runtime.sendMessage({type: "type1", result: compressedJSON}, function(response){
  // handle response
});

背景.js

var uncompressedJSON = JSON.parse(LZString.decompress(request.result));

这样做,我得到nulluncompressedJSONbackground.js

compressedJSON但是,如果我使用 解压缩 content.js 中的相同字符串LZString.decompress(),它可以工作!

我想知道 UTF 编码是否与此有关。这个库似乎工作得很好,因为我能够将我的对象压缩大约 78%。

也欢迎对其他图书馆提出建议!

标签: javascriptgoogle-chrome-extensionjavascript-objectscompression

解决方案


使用LZString.compressToUTF16LZString.decompressFromUTF16

compressToUTF16 产生“有效”的 UTF-16 字符串,因为所有浏览器都可以安全地存储它们。因此它们可以存储在所有经过测试的浏览器(IE9-10、Firefox、Android、Chrome、Safari)上的 localStorage 中。可以用 decompressFromUTF16 解压。这可以通过每个字符仅使用 15 位存储来实现。因此,产生的琴弦比 compress 产生的琴弦大 6.66%

但是,以 32MB 字符串块(连同块编号)发送未压缩的 JSON.stringify 结果,然后在后台脚本中组合它们仍然会快得多。


推荐阅读