序列化 Java 脚本
将 JavaScript 序列化为 a 超级集 包括正则表达式、日期和函数.
概览
此套件中的代码开始其作为一个内部模块的寿命到 表达式为了扩大其作用,它现在生活在 serialize-javascript —— npm上的独立软件包.
你也许在想: 怎么样 JSON.stringify()来啊? 我们发现有时我们需要序列化 JavaScript 函数, (中文(简体) ), 正则说明, (中文(简体) ), 日期, (中文(简体) ), 套装 或者说 地图一个伟大的例子是使用客户端 URL 路由的网络应用程序,其中路由定义为regexps,需要从服务器共享到客户端.
从此软件包的单导出函数返回的字符串是文字 JavaScript, 可以保存到一个 .js 文件,或者通过制作一个文件的内容被嵌入到 HTML 文档中 <script> 键.
HTML字符和JavaScript行终止符自动被逃脱.
请注意,ES6 Sets & Maps的序列化需要支持 Array.from (不见于IE或节点 < 0.12)或a Array.from 混合填充剂.
[尖叫声] 利用这个软件包将任意函数传递到 工人线程,因为你不能直接通过
postMessage()然而,在一般情况下,无法在工人线条之间传递功能。 此软件包允许您序列化 有点 函数,但它有局限性.例如,如果一个函数引用了函数体外的东西,如果序列化和去序列化,它就不会正常运行. 这可包括: 关闭变量 或从其他包件进口。 序列化功能要正常运行,必须完全自成一体.
一般来说,不可能将任意的JavaScript发送到一个工人线程,并假装它运行的方式与在主线程上运行的方式相同. 这个包裹不会让你这么做的.
安装
使用 npm 安装 :
$ npm install serialize-javascript
使用量
var serialize = require('serialize-javascript');
serialize({
str : 'string',
num : 0,
obj : {foo: 'foo'},
arr : [1, 2, 3],
bool : true,
nil : null,
undef: undefined,
inf : Infinity,
date : new Date("Thu, 28 Apr 2016 22:02:17 GMT"),
map : new Map([['hello', 'world']]),
set : new Set([123, 456]),
fn : function echo(arg) { return arg; },
re : /([^\s]+)/g,
big : BigInt(10),
url : new URL('https://example.com/'),
});
以上将产生以下字符串输出:
'{"str":"string","num":0,"obj":{"foo":"foo"},"arr":[1,2,3],"bool":true,"nil":null,"undef":undefined,"inf":Infinity,"date":new Date("2016-04-28T22:02:17.000Z"),"map":new Map([["hello","world"]]),"set":new Set([123,456]),"fn":function echo(arg) { return arg; },"re":new RegExp("([^\\\\s]+)", "g"),"big":BigInt("10"),"url":new URL("https://example.com/")}'
注意: 要生成被美化的字符串, 您可以将可选的第二个参数传递给 serialize() 以定义缩进所用的空格数.
HTML 字符自动退出
此软件包的一个主要特点是将代码序列化为一串可嵌入 HTML 文档的文字 JavaScript, 将其添加为 HTML 文档的内容 <script> 键。 为了让这个安全,HTML字符和JavaScript行终止符自动被逃脱.
serialize({
haxorXSS: '</script>'
});
上面将产生以下字符串, HTML 逃逸输出, 它可以安全地放入 HTML 文档, 因为它不会导致内置脚本元素终止 :
'{"haxorXSS":"\\u003C\\u002Fscript\\u003E"}'
你可以通过一个可选的
unsafe参数到serialize()直接连载.
选项
这个 serialize() 函数接受一个 options 对象作为其第二个参数。 所有选项都默认为 undefined数字 :
options.space
此选项与 space 可转至 JSON.stringify。它可用于在序列化输出中添加白空间和缩进,使其更可读.
serialize(obj, {space: 2});
options.isJSON
此选项是给 serialize() 表示正在序列化的对象不包含任何函数或正则exps值。 这使得热通路可以使序列化速度快于3x. 如果你正在序列化很多数据,并且知道它的纯JSON,那么你就可以启用这个选项来加速.
说明: 当使用此选项时, 输出会仍然被逃脱以防范 XSS .
serialize(obj, {isJSON: true});
options.unsafe
此选项用于信号 serialize() 我们想要做一个直接的转换, 没有 XSS 的保护。 这一选项需要明确设定为: true。 HTML 字符和 JavaScript 线词终止符将不会被逃脱。 你必须自己滚.
serialize(obj, {unsafe: true});
options.ignoreFunction
此选项用于信号 serialize() 我们不想序列化 JavaScript 函数.
只要把功能像 JSON.stringify 做,但其他特性将如预期的那样发挥作用.
serialize(obj, {ignoreFunction: true});
淡化
对于某些用法来说,你可能需要将字符串去序列化。 这显然不是本单元的一部分。 不过,你可以轻松地自己写:
function deserialize(serializedJavascript){
return eval('(' + serializedJavascript + ')');
}
说明: 别忘了连环画的括号 作为开口的括号 { 将被视为一个机构的开始.
许可证
这个软件可以在雅虎下自由使用! BSD许可证. 见 自由文件 许可证文本和版权信息.