devalue深度解析:超越JSON.stringify的终极JavaScript序列化解决方案

📅 2026/8/23 15:54:09
devalue深度解析:超越JSON.stringify的终极JavaScript序列化解决方案
devalue深度解析超越JSON.stringify的终极JavaScript序列化解决方案【免费下载链接】devalueGets the job done when JSON.stringify cant项目地址: https://gitcode.com/gh_mirrors/de/devaluedevalue 是一款零依赖的 JavaScript 序列化库当前版本 5.9.1它的口号就是当 JSON.stringify 束手无策时交给我。循环引用、Date、Map/Set、BigInt、正则、ArrayBuffer这些让 JSON失语的数据类型devalue 都能妥善序列化还内置了 XSS 防护是 Svelte 团队出品、SvelteKit 生态中久经考验的选择。 为什么 JSON.stringify 不够用在写数据传递代码时你是否遇到过这些翻车现场数据类型JSON.stringify 的表现循环引用obj.self obj直接抛错栈溢出 Date对象变成字符串拿不回来Map/Set变成空对象{}undefined/NaN/Infinity丢失或被替换成nullBigInt直接抛错正则、URL、ArrayBuffer变成空对象{}devalue 一次性解决了上面所有问题这就是JavaScript 序列化方案里它被称为终极选手的原因。⚡ 两种核心用法总有一种适合你用法一uneval —— 最紧凑的代码级序列化uneval把值转换成能创建出等价值的一段 JavaScript 代码相当于 eval 的逆操作输出极度紧凑适合直接内嵌到页面的script标签中。import { uneval } from devalue; const obj { message: hello }; obj.self obj; // 故意制造循环引用 uneval(obj); // (function(a){a.messagehello;a.selfa;return a}({}))循环引用被优雅地转写成了代码实现位于 src/uneval.js约 600 行是项目里最核心的文件。用法二stringify parse —— 安全免 evalstringify先把对象摊平成一个可被纯 JSON 解析的数组每个唯一对象只存一份重复/循环引用用数字索引代替parse再按索引把它们复原回来。import { stringify, parse } from devalue; const obj { message: hello }; obj.self obj; const s stringify(obj); // [{message:1,self:0},hello] parse(s); // { message: hello, self: [Circular] }怎么选追求输出体积最小、且允许 eval → 用uneval环境不允许执行代码如受 CSP 限制的页面→ 用stringifyparse。相关实现分别在src/stringify.js和src/parse.js。附加技能stringifyAsync 序列化 Promise5.8 版本起stringifyAsync会先await完 Promise 再序列化服务器端取数据 传前端一步到位const s await stringifyAsync({ slow: fetch(/api/data).then(r r.json()) }); 自定义类型把你的 Class 也序列化stringify可传入reducers、parse可传入revivers即可序列化任意自定义类比如向量、颜色、金额。uneval则对应 replacer。序列化时把实例降级为普通数组反序列化时再升级回实例方法照常可用。 天然防 XSS 的序列化安全特性详解这是 devalue 最被低估的卖点。做服务端渲染时把用户输入塞进script是经典 XSS 入口JSON.stringify不会转义/script一行恶意输入就能逃逸出脚本标签。而 devalue 会自动把、、换行等危险字符转成 Unicode 转义如\u003C并拒绝序列化函数和未处理的未知对象从根源上堵死代码注入。两个安全提示README 原话精神uneval只建议用于服务器 → 浏览器方向不要用它接收客户端上传的数据。如果必须 eval请使用间接调用(0, eval)(code)避免代码触碰外层作用域。 项目结构一览index.js— 统一出口uneval、stringify、stringifyAsync、parse、unflattensrc/uneval.js— 代码级序列化最小输出体积src/stringify.js/src/parse.js— 摊平与复原免 eval 方案src/operations.js— 5.9 新增的可插拔 operations 接口支持无副作用序列化、跨运行时vm/WASM/远程进程序列化与复原src/base64.js—ArrayBuffer与 TypedArray 的 Base64 编解码test/— 基于 uvu 的完整测试benchmarking/— 与同类库的性能基准对比 快速上手安装 devalue 最快步骤git clone https://gitcode.com/gh_mirrors/de/devalue cd devalue pnpm install pnpm test日常开发中一行npm i devalue即可使用想跑基准对比可执行pnpm bench。✨ 总结什么时候该选 devalue✅ 服务端渲染SvelteKit 等需要把状态注入浏览器✅ 数据里有循环引用、Date、Map/Set、BigInt等JSON 难题✅ 有 XSS 防护需求用户输入也要安全下发✅ 想要可插拔的序列化/复原机制沙箱、跨 Realm 场景一句话收尾JSON.stringify 搞定的它能搞定JSON.stringify 搞不定的它也能搞定——这就是 devalue 的终极含义。【免费下载链接】devalueGets the job done when JSON.stringify cant项目地址: https://gitcode.com/gh_mirrors/de/devalue创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考