JavaScriptをJSONのスーパーセットにシリアル化し、正規表現、日付、機能を含む。
このパッケージのコードは、明示的な状態の内部モジュールとしての生活を始めました。その有用性を拡大するために、現在はserialize-javascriptとして存在します。これは、NPMの独立したパッケージです。
あなたはおそらく疑問に思っています: JSON.stringify()はどうですか?!? JavaScript関数、 regexps 、日付、セット、またはマップをシリアル化する必要がある場合があることがわかりました。優れた例は、クライアント側のURLルーティングを使用するWebアプリです。ここでは、ルート定義がサーバーからクライアントに共有する必要があるRegexpsです。ただし、このモジュールは、ノードプロセス間で通信するのにも最適です。
このパッケージの単一のエクスポート関数から返される文字列は、 <script>要素のコンテンツを作成して、 .jsファイルに保存するか、HTMLドキュメントに埋め込まれることができるリテラルJavaScriptです。
HTML文字とJavaScriptラインターミネーターは自動的に逃げられます。
ES6セットとマップのシリアル化には、 Array.fromのサポートが必要であることに注意してください(IEまたはノード<0.12では使用できません)、またはArray.from PolyFill。
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/")}'注:美化された文字列を作成するには、オプションの2番目の引数を渡してserialize()に渡して、インデントに使用するスペースの数を定義できます。
このパッケージの主な機能は、 <script>要素の内容として追加してHTMLドキュメントに埋め込むことができる一連のリテラルJavaScriptにコードをシリアル化することです。これを安全にするために、HTML文字とJavaScriptラインターミネーターが自動的に逃げられます。
serialize ( {
haxorXSS : '</script>'
} ) ;上記は、インラインスクリプト要素を終了させないため、HTMLドキュメントに安全に入力するのに安全な次の文字列であるHTML-ESCAPED出力を生成します。
'{"haxorXSS":"\u003C\u002Fscript\u003E"}'オプションの
unsafe引数をserialize()に渡すと、ストレートシリアル化ができます。
serialize()関数は、 optionsオブジェクトを2番目の引数として受け入れます。すべてのオプションはデフォルトでundefinedになっています:
options.spaceこのオプションは、 JSON.stringifyに渡すことができるspace引数と同じです。シリアル化された出力に白人とインデントを追加して、より読みやすくするために使用できます。
serialize ( obj , { space : 2 } ) ; options.isJSONこのオプションは、シリアル化されているオブジェクトには関数またはRegexps値が含まれていないというserialize()への信号です。これにより、シリアル化が3倍以上の速さを可能にするホットパスが可能になります。多くのデータをシリアル化し、その純粋なJSONを知っている場合は、このオプションをスピードアップのために有効にすることができます。
注:このオプションを使用する場合、XSSから保護するために出力が逃げられます。
serialize ( obj , { isJSON : true } ) ; options.unsafeこのオプションは、XSS保護なしに、直線的な変換を行うことをserialize()信号することです。このオプションは、明示的にtrueに設定する必要があります。 HTML文字とJavaScriptラインターミネーターは逃げられません。あなたはあなた自身のものを転がさなければなりません。
serialize ( obj , { unsafe : true } ) ; options.ignoreFunctionこのオプションは、JavaScript関数をシリアル化したくないことをserialize()信号することです。 JSON.stringifyのように機能を扱うだけですが、他の機能は予想どおりに機能します。
serialize ( obj , { ignoreFunction : true } ) ; 一部のユースケースでは、文字列を脱上する必要がある場合もあります。これは明示的にこのモジュールの一部ではありません。ただし、簡単に自分で書くことができます。
function deserialize ( serializedJavascript ) {
return eval ( '(' + serializedJavascript + ')' ) ;
}注:オープニングブラケット{は、ボディの始まりと見なされるため、シリアル化されたJavaScriptの周りの括弧を忘れないでください。
このソフトウェアはYahoo!で無料で使用できますInc. BSDライセンス。ライセンステキストと著作権情報については、ライセンスファイルを参照してください。