تمت إضافة Node.js مؤخرًا وحدة آلة افتراضية. في الواقع ، لا يمكن القول أنها جديدة. إنه يكشف فقط بعض الواجهات الداخلية ، التي كانت متوفرة من 2.x. يمكننا أن نرى هذه الرموز من العقدة/src/node.js:
var script = process.binding ('evals'). newescript ؛ var runinthiscontext = script.runinthiscontext ؛ nativemodule.wrap = function (script) {return nativemodule.wrapper [0] + script + 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.esports ، nativemodule.require ، this ، this.filename) ؛ this.loaded = true ؛ } ؛يشبه كائن البرنامج النصي فيه إلى حد كبير الكائن الذي تم إرجاعه بواسطة المتطلبات ('VM') ، ولكن في جوهرها ، تكون وحدة VM هي تغليف كائن البرنامج النصي.
var script = process.binding ('evals'). nodescript ؛ console.log (script)/** {[function: nodescript] createContext: [function] ، runincontext: CreateContext: [function] ، runincontext: [function] ، runinthiscontext: [function] ، runinnewContext:من بينها ، يعادل RunInthiscontext تنفيذ التعليمات البرمجية في بيئة جديدة ولن يؤثر على الكائن في النطاق الحالي. يمكن تحديد RunInnewContext و RuninContext ككائنات سياق ، والفرق هو كائن عادي أو كائن سياق. بمعنى آخر ، يمكن لـ RuninnewContext و RuninContext أن يؤثر محليًا على الكائنات في النطاق الحالي. للتفاعل الكامل مع البيئة الحالية ، مطلوب evals الخطيرة. في نظام التحميل الذي يأتي مع Node.js ، من الواضح أنه ليس شجاعًا للغاية ، ويستخدم RunInthiscontext. لقد قمت بالكثير من العمل قبل ذلك ، مثل لف محتويات ملف JS الخاص بالمستخدم في طبقة (nativemodule.wrap) ، وغيرها من العمليات المبعثرة ، بالإضافة إلى العمليات المتزامنة ، والتي هي في الواقع طريقة تحميل فعالة للغاية. الفائدة الوحيدة هي أن التزامن يستخدم ، مما يجعل الكود أسهل بكثير في الكتابة.
في Github ، قارن بعض الأشخاص أداء طرق تنفيذ البرامج النصية هذه:
var vm = require ('vm') ، code = 'var square = n * n ؛' ، fn = new function ('n' ، code) ، script = vm.createscript (code) ، sandbox ؛ n = 5 ؛ sandbox = {n: n} ؛ Benchmark = function (title ، funk) {var end ، i ، start ؛ ابدأ = تاريخ جديد ؛ لـ (i = 0 ؛ i <5000 ؛ i ++) {funk () ؛ } نهاية = تاريخ جديد ؛ console.log (title + ':' + (end - start) + 'ms') ؛} var ctx = vm.createContext (sandbox) ؛ stistmark ('vm.runinthiscontext' ، function () {vm.runinthiscontex Sandbox) ؛}) ؛ المعيار ('script.runinthiscontext' }) ؛ Benchmark ('script.runinnewcontext' ، function () {script.runinnewcontext (sandbox) ؛}) ؛ المعايير ('script.runincontext' ، function () {script.runincontext (ctx) ؛}) ؛ }) ؛/** vm.runinthiscontext: 212msvm.RuninnewContext: 2222msscript.runinthiscontext: 6msscript.runinnewContext: 1876msscript.runincontext: 44mmsfn: 0ms*/من هذا يمكننا أن نرى أن طريقة V8 هي النصر الكامل!
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.