O Node.JS adicionou recentemente um módulo de máquina virtual. De fato, não se pode dizer que é novo. Ele apenas expõe algumas interfaces internas, que estão disponíveis a partir de 2.x. Podemos ver esses códigos do node/src/node.js:
var script = process.binding ('evals'). modescript; var runInthiscOntext = script.runinthiscOntext; Nativemodule.wrap = function (script) {return nativemodule.wrapper [0] + script + nativemodule.wrapper [1]; }; Nativemodule.wrapper = ['(função (exporta, requer, módulo, __filename, __dirname) {', '/n});' ]; Nativemodule.prototype.compile = function () {var fonte = nativemodule.getSource (this.id); fonte = nativemodule.wrap (fonte); var fn = runinthiscOntext (fonte, this.FileName, true); fn (this.exports, nativemodule.require, this, this.FileName); this.loaded = true; };O objeto de script nele é muito semelhante ao objeto retornado por requer ('vm'), mas, em essência, o módulo VM é o encapsulamento do objeto de script.
var script = process.binding ('evals'). sodescript; console.log (script)/** {[function: sodescript] createContext: [function], runincontext: [function], runinthiscOntext: [function], runinNewContext: [function]}*/console.og.Gonte ([function], runinNewContext: [function]}*/console.og.Gonte ([function], runinnewContext: [function]}*/console.og.Og ([function], runinnewContext: [function]}*/console.og.Gonte ([function], runinnewContext: [function]}*/console.og. CreateContext: [function], runincontext: [function], runinthiscOntext: [function], runinnewContext: [function]}, createScript: [function], createContext: [function], runincontext: [function], runinthiscOntext: [função], runinNewContext: [function], runinthontext: [função], runinNewContext: [function], functionTontexEntre eles, o RuninthiscOntext é equivalente a executar o código em um ambiente novo e não afetará o objeto no escopo atual. RunInNewContext e RuniContext podem ser especificados como objetos de contexto, a diferença é um objeto normal ou um objeto de contexto. Em outras palavras, o RuninNewContext e o RUNINCONTEXT podem afetar localmente os objetos no escopo atual. Para interagir totalmente com o ambiente atual, são necessários evalas perigosos. No sistema de carregamento que vem com o Node.js, obviamente não é tão corajoso e usa RuninthiscOntext. E eu trabalhei muito antes disso, como envolver o conteúdo do arquivo JS do usuário em uma camada (nativemodule.wrap) e outras operações de dispersão, além de operações síncronas, que na verdade é um método de carregamento muito eficiente. O único benefício é que a sincronização é usada, facilitando muito o código.
No Github, algumas pessoas compararam o desempenho desses métodos de execução dinâmica de scripts:
var vm = requer ('vm'), code = 'var square = n * n;', fn = new function ('n', código), script = vm.createscript (code), sandbox; n = 5; sandbox = {n: n}; benchmark = function (título, funk) {var end, i, start; start = nova data; for (i = 0; i <5000; i ++) {funk (); } end = nova data; console.log (título + ':' + (end - start) + 'ms');} var ctx = vm.createContext (sandbox); benchmark ('vm.runinthiscontext', function () {vmninNnnNenNnNenNnNenNnnNenNnnNenNNNNNnNenNnnNenNnnNenNnnNeNC (Code); sandbox); }); benchmark ('script.runinNewContext', function () {script.runinnewContext (sandbox);}); benchmark ('script.runincontext', function () {script.runinconText (ctx);}); });/** vm.runinthiscOntext: 212msVm.RuninNewContext: 2222mScript.RuninthiscOntext: 6mScript.runinNewContext: 1876mScript.RuniNContext: 44msfn: 0ms*//A partir disso, podemos ver que o método V8 é a vitória completa!
O acima é o conteúdo inteiro deste artigo. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.