Node.js baru -baru ini menambahkan modul mesin virtual. Bahkan, tidak dapat dikatakan bahwa itu adalah yang baru. Ini hanya memperlihatkan beberapa antarmuka internal, yang telah tersedia dari 2.x. Kita dapat melihat kode -kode ini dari node/src/node.js:
var skrip = process.binding ('evals'). nodescript; var runinthiscontext = script.runinthiscontext; NativeModule.wrap = function (skrip) {return nativeModule.wrapper [0] + skrip + nativeModule.wrapper [1]; }; NativeModule.wrapper = ['(fungsi (ekspor, membutuhkan, modul, __filename, __dirname) {', '/n});' ]; NativeModule.prototype.compile = function () {var source = nativeModule.getSource (this.id); sumber = nativeModule.wrap (sumber); var fn = runinthiscontext (sumber, this.filename, true); fn (ini.Exports, nativeModule.require, this, this.filename); this.Loaded = true; };Objek skrip di dalamnya sangat mirip dengan objek yang dikembalikan oleh membutuhkan ('VM'), tetapi pada dasarnya, modul VM adalah enkapsulasi objek skrip.
Var Script = Process.Binding ('Evals'). Nodescript; Console.log (Script)/** {[Fungsi: NodeScript] CreateContext: [Function], Runincontext: [Function], RunInTiscontext: [function], runinNewContext: [function]}*/console.log (wajib ('VM') (function] {function] {function] {function: {function] {function: {function] {function: {function {function {function {function {function: [Function], runincontext: [function], runinthiscontext: [function], runinnewContext: [function]}, createScript: [function], createContext: [function], runincontext: [function], runinthiscontext: [function], runinnewContext: [function]}Di antara mereka, runinthiscontext setara dengan mengeksekusi kode di lingkungan baru dan tidak akan mempengaruhi objek dalam ruang lingkup saat ini. RuninNewContext dan RunIncontext dapat ditentukan sebagai objek konteks, perbedaannya adalah objek normal atau objek konteks. Dengan kata lain, RuninNewContext dan Runincontext dapat secara lokal mempengaruhi objek dalam ruang lingkup saat ini. Untuk sepenuhnya berinteraksi dengan lingkungan saat ini, eval berbahaya diperlukan. Dalam sistem pemuatan yang dilengkapi dengan Node.js, itu jelas tidak begitu berani, dan menggunakan runinthiscontext. Dan saya melakukan banyak pekerjaan sebelum ini, seperti membungkus konten file JS pengguna dalam lapisan (nativeModule.wrap), dan ling lainnya serta operasi sinkron, yang sebenarnya merupakan metode pemuatan yang sangat efisien. Satu -satunya manfaat adalah bahwa sinkronisasi digunakan, membuat kode lebih mudah untuk ditulis.
Di GitHub, beberapa orang telah membandingkan kinerja metode -metode yang dijalankan secara dinamis ini:
var vm = membutuhkan ('vm'), kode = 'var square = n * n;', fn = fungsi baru ('n', kode), skrip = vm.createScript (kode), kotak pasir; n = 5; sandbox = {n: n}; Benchmark = function (title, funk) {var end, i, start; mulai = tanggal baru; untuk (i = 0; i <5000; i ++) {funk (); } end = tanggal baru; console.log (title + ':' + (end - start) + 'ms');} var ctx = vm.createContext (sandbox); benchmark ('vm.runintiscontext', function () {vm.runintiscontext (kode);}); Benchmark ('vm.runinnewcontext (code); Benchmark (' vm.runinnewcext (code); Benchmark ('vm.runinnewContext (code); Benchmark (' vm.runinnewContext (code); Sandbox);}); Benchmark ('Script.RunintHiscontext', function () {script.runinthiscontext ();}); Benchmark ('Script.runinNewContext', function () {script.runinnewcontext ', function () {script.runinncontex function () {Script.RuninNewContext (Sandbox);}); Benchmark ('Script.Runincontext', function () {Script.runincontext (ctx);}); Benchmark ('fn', function () {fn (n);});/** vm.ricex 2222MSscript.runinthiscontext: 6msscript.runinNewContext: 1876MSScript.runincontext: 44msfn: 0ms */Dari sini kita dapat melihat bahwa metode V8 adalah kemenangan lengkap!
Di atas adalah seluruh konten artikel ini. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.