Serialize JavaScript на суперсет JSON, который включает в себя регулярные выражения, даты и функции.
Код в этом пакете начал свою жизнь как внутренний модуль для экспресса. Чтобы расширить свою полезность, теперь он живет как serialize-javascript -независимый пакет на NPM.
Вам, наверное, интересно: как насчет JSON.stringify() !? Мы обнаружили, что иногда нам нужно сериализовать функции JavaScript, REGEXP , даты , наборы или карты . Отличным примером является веб-приложение, которое использует маршрутизацию URL на стороне клиента, где определения маршрута представляют собой Regexps, которые необходимо обмениваться с сервера к клиенту. Но этот модуль также отлично подходит для общения между процессами узлов.
Строка, возвращаемая из единой экспортной функции этого пакета, представляет собой буквальный JavaScript, который можно сохранить в файле .js или быть встроенным в HTML -документ, создав содержание элемента <script> .
HTML -символы и терминаторы линии JavaScript автоматически сбежаются.
Обратите внимание, что сериализация для наборов и карт ES6 требует поддержки для Array.from (недоступна в IE или узле <0,12) или Array.from полифилла.
Установите, используя 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() .
Основной особенностью этого пакета является сериализация кода на строку буквального 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() , который сериализованный объект не содержит никаких значений функции или повторных экспозиций. Это обеспечивает горячую дорожку, которая позволяет сериализации быть более в 3 раза быстрее. Если вы сериализуете много данных и знаете его чистый JSON, то вы можете включить эту опцию для ускорения.
Примечание. При использовании этой опции вывод все еще будет избежал защиты от XSS.
serialize ( obj , { isJSON : true } ) ; options.unsafe Этот вариант состоит в том, чтобы сигнализировать serialize() , который мы хотим сделать прямое преобразование, без защиты XSS. Эти параметры должны быть явно установлены на true . HTML -символы и терминаторы JavaScript не будут сбежать. Вам придется бросить свой собственный.
serialize ( obj , { unsafe : true } ) ; options.ignoreFunction Этот вариант состоит в том, чтобы сигнализировать serialize() , что мы не хотим сериализовать функцию JavaScript. Просто относитесь к функции, как JSON.stringify do, но другие функции будут работать, как и ожидалось.
serialize ( obj , { ignoreFunction : true } ) ; Для некоторых вариантов использования вам также может понадобиться десериализировать строку. Это явно не является частью этого модуля. Однако вы можете легко написать это самостоятельно:
function deserialize ( serializedJavascript ) {
return eval ( '(' + serializedJavascript + ')' ) ;
} Примечание. Не забывайте о скобках вокруг сериализованного JavaScript, так как открывающий кронштейн { будет считаться началом тела.
Это программное обеспечение может бесплатно использовать под Yahoo! Inc. BSD Лицензия. См. Файл лицензии для текста лицензии и информации об авторском праве.