javascript - 将大型 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));
这样做,我得到null
了uncompressedJSON
background.js
compressedJSON
但是,如果我使用 解压缩 content.js 中的相同字符串LZString.decompress()
,它可以工作!
我想知道 UTF 编码是否与此有关。这个库似乎工作得很好,因为我能够将我的对象压缩大约 78%。
也欢迎对其他图书馆提出建议!
解决方案
使用LZString.compressToUTF16
和LZString.decompressFromUTF16
:
compressToUTF16 产生“有效”的 UTF-16 字符串,因为所有浏览器都可以安全地存储它们。因此它们可以存储在所有经过测试的浏览器(IE9-10、Firefox、Android、Chrome、Safari)上的 localStorage 中。可以用 decompressFromUTF16 解压。这可以通过每个字符仅使用 15 位存储来实现。因此,产生的琴弦比 compress 产生的琴弦大 6.66%
但是,以 32MB 字符串块(连同块编号)发送未压缩的 JSON.stringify 结果,然后在后台脚本中组合它们仍然会快得多。
推荐阅读
- android - Firebase/Flutter - 无法将数据写入数据库
- python - Django 错误 - 未找到带有参数 '('',)' 的 'new_bid' 的反向。尝试了 1 种模式:
- python - Discord.py 角色编辑
- mysql - 多对多和分层数据库设计
- haskell - 如何在特定情况下使用高阶构造
- machine-learning - 如何正确验证机器学习模型?
- reactjs - 是否可以从 Firestore 到 React/Redux 应用程序的“自动”更新(绑定)?
- spring - Io.jsonwebtoken.security.SignatureException:JWT 签名与本地计算的签名不匹配
- sql - SQL : 我如何加入足球比赛中的不同表格?
- c# - 由于 Time.deltaTime,C#/Unity 相机跟随抖动