Serialize JavaScript ไปยัง Superset ของ JSON ที่มีการแสดงออกปกติวันที่และฟังก์ชั่น
รหัสในแพ็คเกจนี้เริ่มต้นชีวิตเป็นโมดูลภายในเพื่อแสดงสถานะ เพื่อขยายประโยชน์ของมันตอนนี้มันใช้ชีวิตเป็น serialize-javascript แพ็คเกจอิสระใน NPM
คุณอาจสงสัยว่า: แล้ว JSON.stringify() !? เราพบว่าบางครั้งเราจำเป็นต้องทำให้ฟัง ก์ชั่น JavaScript, regexps , วันที่ , ชุด หรือ แผนที่ ตัวอย่างที่ดีคือเว็บแอปที่ใช้การกำหนดเส้นทาง URL ฝั่งไคลเอ็นต์ซึ่งคำจำกัดความของเส้นทางคือ regexps ที่ต้องใช้ร่วมกันจากเซิร์ฟเวอร์ไปยังไคลเอนต์ แต่โมดูลนี้ก็ยอดเยี่ยมสำหรับการสื่อสารระหว่างกระบวนการโหนด
สตริงที่ส่งคืนจากฟังก์ชั่นการส่งออกเดี่ยวของแพ็คเกจนี้คือจาวาสคริปต์ตัวอักษรซึ่งสามารถบันทึกลงในไฟล์ .js หรือฝังลงในเอกสาร HTML โดยการสร้างเนื้อหาขององค์ประกอบ <script>
อักขระ HTML และ Terminators สาย JavaScript จะถูกหลบหนีโดยอัตโนมัติ
โปรดทราบว่าการทำให้เป็นอนุกรมสำหรับชุดและแผนที่ ES6 ต้องการการสนับสนุนสำหรับ Array.from (ไม่สามารถใช้ได้ใน IE หรือ Node <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/")}' หมายเหตุ: ในการผลิตสตริงที่สวยงามคุณสามารถผ่านอาร์กิวเมนต์ที่สองเสริมเพื่อ serialize() เพื่อกำหนดจำนวนช่องว่างที่จะใช้สำหรับการเยื้อง
คุณสมบัติหลักของแพ็คเกจนี้คือการทำให้รหัสเป็นอนุกรมเป็นสตริงของจาวาสคริปต์ตัวอักษรซึ่งสามารถฝังอยู่ในเอกสาร 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() ว่าวัตถุที่เป็นอนุกรมไม่มีฟังก์ชันหรือค่า regexps ใด ๆ สิ่งนี้ช่วยให้เส้นทางร้อนที่ช่วยให้การทำให้เป็นอนุกรมเร็วกว่า 3 เท่า หากคุณเป็นอนุกรมข้อมูลจำนวนมากและรู้ว่า JSON บริสุทธิ์คุณสามารถเปิดใช้งานตัวเลือกนี้สำหรับการเร่งความเร็ว
หมายเหตุ: เมื่อใช้ตัวเลือกนี้เอาต์พุตจะยังคงถูกหลบหนีเพื่อป้องกัน XSS
serialize ( obj , { isJSON : true } ) ; options.unsafe ตัวเลือกนี้คือการส่งสัญญาณ serialize() ที่เราต้องการทำการแปลงตรงโดยไม่มีการป้องกัน XSS ตัวเลือกนี้จะต้องตั้งค่าเป็น true อย่างชัดเจน อักขระ HTML และ Terminators สาย JavaScript จะไม่ถูกหลบหนี คุณจะต้องม้วนตัวเอง
serialize ( obj , { unsafe : true } ) ; options.ignoreFunction ตัวเลือกนี้คือการส่งสัญญาณ serialize() ที่เราไม่ต้องการฟังก์ชั่น JavaScript สำหรับอนุกรม เพียงแค่รักษาฟังก์ชั่นเช่น JSON.stringify ทำ แต่คุณสมบัติอื่น ๆ จะทำงานได้ตามที่คาดไว้
serialize ( obj , { ignoreFunction : true } ) ; สำหรับบางกรณีการใช้งานคุณอาจต้อง deserialize สตริง นี่ไม่ใช่ส่วนหนึ่งของโมดูลนี้อย่างชัดเจน อย่างไรก็ตามคุณสามารถเขียนด้วยตัวเองได้อย่างง่ายดาย:
function deserialize ( serializedJavascript ) {
return eval ( '(' + serializedJavascript + ')' ) ;
} หมายเหตุ: อย่าลืมวงเล็บรอบ ๆ จาวาสคริปต์ที่เป็นอนุกรมเนื่องจากวงเล็บเปิด { จะถือว่าเป็นจุดเริ่มต้นของร่างกาย
ซอฟต์แวร์นี้ใช้งานได้ฟรีภายใต้ Yahoo! ใบอนุญาต BSD Inc. ดูไฟล์ใบอนุญาตสำหรับข้อความใบอนุญาตและข้อมูลลิขสิทธิ์