Node.js ha agregado recientemente un módulo de máquina virtual. De hecho, no se puede decir que es nuevo. Simplemente expone algunas interfaces internas, que han estado disponibles desde 2.x. Podemos ver estos códigos de nodo/src/node.js:
var script = process.binding ('evals'). nodoScript; var runinthiscontext = script.runinthiscontext; Nativemodule.wrap = function (script) {return nativemodule.wrapper [0] + script + nativemodule.wrapper [1]; }; Nativemodule.wrapper = ['(function (exports, requerir, módulo, __filename, __dirname) {', '/n});' ]; Nativemodule.prototype.compile = function () {var fource = nativemodule.getSource (this.id); fuente = nativemodule.wrap (fuente); var fn = runinthiscontext (fuente, this.fileName, true); fn (this.exports, nativemodule.require, this, this.filename); this.loaded = True; };El objeto de script en él es muy similar al objeto devuelto por requerir ('vm'), pero en esencia, el módulo VM es la encapsulación del objeto script.
var script = process.binding ('evals'). nodoescript; console.log (script)/** {[function: nodoScript] createContext: [function], runincontext: [function], runinthiscontext: [function], runinNewContext: [function]}*/console.log (requisito ('vm') {script: {[function]: createsction: creates: [Function], runincontext: [function], runinthiscontext: [function], runinNewContext: [function]}, createScript: [function], createContext: [function], runincontext: [function], runinthiscontext: [function], runinnewContext: [function]}Entre ellos, RunInthiscontext es equivalente a ejecutar código en un entorno nuevo y no afectará el objeto en el alcance actual. runinNewContext y runincontext se pueden especificar como objetos de contexto, la diferencia es un objeto normal o un objeto de contexto. En otras palabras, RuninNewContext y Runincontext pueden afectar localmente los objetos en el alcance actual. Para interactuar completamente con el entorno actual, se requieren evals peligrosas. En el sistema de carga que viene con Node.js, obviamente no es tan valiente, y usa RunTinThiscontext. E hice mucho trabajo antes de esto, como envolver el contenido del archivo JS del usuario en una capa (nativemodule.wrap) y otras operaciones de dispersión, además de operaciones sincrónicas, que en realidad es un método de carga muy eficiente. El único beneficio es que se usa la sincronización, lo que hace que el código sea mucho más fácil de escribir.
En GitHub, algunas personas han comparado el rendimiento de estos métodos para ejecutar scripts dinámicamente:
var vm = require ('vm'), code = 'var cuadro = n * n;', fn = new function ('n', code), script = vm.createScript (código), sandbox; n = 5; sandbox = {n: n}; Benchmark = function (title, funk) {var end, i, inicio; inicio = nueva fecha; para (i = 0; i <5000; i ++) {funk (); } end = nueva fecha; console.log (title + ':' + (end - start) + 'ms');} var ctx = vm.createContext (sandbox); benchmark ('vm.runinthiscontext', function () {vm.runinthiscontext (código);}); Benchmark ('vm.runinNewContex sandbox);}); benchmark ('script.runinthiscontext', function () {script.runinthiscontext ();}); benchmark ('script.runinnewcontext', function () {script.runinnewcontex function () {script.runinNewContext (sandbox);}); 2222msscript.runinthiscontext: 6msscript.runinNewContext: 1876MSScript.Runincontext: 44msfn: 0ms */¡De esto podemos ver que el método V8 es la victoria completa!
Lo anterior es todo el contenido de este artículo. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.