node.js เพิ่งเพิ่มโมดูลเครื่องเสมือน ในความเป็นจริงมันไม่สามารถพูดได้ว่ามันเป็นใหม่ มันเพียงแค่เปิดเผยอินเทอร์เฟซภายในซึ่งมีให้ตั้งแต่ 2.x เราสามารถดูรหัสเหล่านี้ได้จาก Node/Src/Node.js:
var script = process.binding ('evals'). nodescript; var runinthiscontext = script.runinthiscontext; nativeModule.wrap = ฟังก์ชั่น (สคริปต์) {return nativeModule.wrapper [0] + สคริปต์ + nativeModule.wrapper [1]; - nativeModule.wrapper = ['(ฟังก์ชั่น (การส่งออก, ต้องการ, โมดูล, __filename, __dirName) {', '/n});' - nativeModule.prototype.compile = function () {var source = nativeModule.getSource (this.id); แหล่งที่มา = nativeModule.wrap (แหล่งที่มา); var fn = runinthiscontext (แหล่งที่มา this.filename, true); fn (this.exports, nativemodule.require, this.filename); this.loaded = true; -วัตถุสคริปต์ในนั้นคล้ายกับวัตถุที่ส่งคืนโดยต้องการ ('VM') แต่ในสาระสำคัญโมดูล VM คือการห่อหุ้มของวัตถุสคริปต์
var script = process.binding ('evals'). nodescript; console.log (สคริปต์)/** {[ฟังก์ชั่น: nodescript] createContext: [ฟังก์ชั่น], runincontext: [ฟังก์ชั่น], runinthiscontext: [ฟังก์ชัน], runinNewContext: [ฟังก์ชั่น]}*/console.log runinContext: [ฟังก์ชั่น], runinthiscontext: [ฟังก์ชั่น], runinNewContext: [ฟังก์ชั่น]}, createScript: [ฟังก์ชั่น], createContext: [ฟังก์ชั่น], runinContext: [ฟังก์ชั่น], runinthiscontext: [ฟังก์ชั่น]ในหมู่พวกเขา runinthiscontext เทียบเท่ากับการเรียกใช้รหัสในสภาพแวดล้อมใหม่ล่าสุดและจะไม่ส่งผลกระทบต่อวัตถุในขอบเขตปัจจุบัน RuninNewContext และ RuninConText สามารถระบุได้ว่าเป็นวัตถุบริบทความแตกต่างคือวัตถุปกติหรือวัตถุบริบท กล่าวอีกนัยหนึ่ง RuninNewContext และ RuninConText สามารถส่งผลกระทบต่อวัตถุในขอบเขตปัจจุบัน ในการโต้ตอบกับสภาพแวดล้อมในปัจจุบันอย่างเต็มที่จำเป็นต้องมี Evals อันตราย ในระบบการโหลดที่มาพร้อมกับ node.js เห็นได้ชัดว่ามันไม่กล้าหาญและใช้ runinthiscontext และฉันทำงานหลายอย่างก่อนหน้านี้เช่นการห่อเนื้อหาของไฟล์ JS ของผู้ใช้ในเลเยอร์ (nativeModule.wrap) และ lings และการทำงานแบบซิงโครนัสอื่น ๆ ซึ่งเป็นวิธีการโหลดที่มีประสิทธิภาพมาก ประโยชน์เพียงอย่างเดียวคือการใช้การซิงโครไนซ์ทำให้โค้ดเขียนง่ายขึ้นมาก
ใน GitHub บางคนได้เปรียบเทียบประสิทธิภาพของวิธีการเหล่านี้ในการดำเนินการสคริปต์แบบไดนามิก:
var vm = ต้องการ ('vm'), code = 'var square = n * n;', fn = ฟังก์ชั่นใหม่ ('n', รหัส), script = vm.createscript (รหัส), sandbox; n = 5; sandbox = {n: n}; benchmark = function (ชื่อ, funk) {var end, i, start; เริ่ม = วันที่ใหม่; สำหรับ (i = 0; i <5000; i ++) {funk (); } end = วันที่ใหม่; console.log (title + ':' + (end - start) + 'ms');} var ctx = vm.createContext (sandbox); benchmark ('vm.runinthiscontext', function () {vm.runinthiscontext (code);}; }); benchmark ('script.runinthiscontext', function () {script.runinthiscontext ();}); benchmark ('script.runinnewcontext', ฟังก์ชัน () {script.runinewcontext ', ฟังก์ชัน () script.runinneWcontext (Sandbox);}); benchmark ('script.runincontext', function () {script.runincontext (ctx);}); benchmark ('fn', function () {fn (n);}); 2222MSScript.runinthiscontext: 6MSScript.RunInNewContext: 1876MSScript.runinconText: 44MSFN: 0MS *//จากนี้เราจะเห็นได้ว่าวิธี V8 เป็นชัยชนะที่สมบูรณ์!
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น