Node.js недавно добавил модуль виртуальной машины. На самом деле, нельзя сказать, что это новое. Он просто раскрывает некоторые внутренние интерфейсы, которые были доступны с 2.x. Мы можем увидеть эти коды из Node/src/node.js:
var script = process.binding ('evals'). nodescript; var runinthiscontext = script.runinthiscontext; Nativemodule.wrap = function (script) {return nativemodule.wrapper [0] + script + nativemodule.wrapper [1]; }; Nativemodule.wrapper = ['(function (exports, require, module, __filename, __dirname) {', '/n});' ]; Nativemodule.prototype.compile = function () {var source = nativemodule.getsource (this.id); source = nativemodule.wrap (source); var fn = runinthiscontext (источник, this.filename, true); fn (this.exports, nativemodule.require, это, this.filename); this.laded = true; };Объект сценария в нем очень похож на объект, возвращаемый require ('vm'), но, по сути, модуль виртуальной машины - это инкапсуляция объекта сценария.
var script = process.binding ('evals'). nodescript; console.log (script)/** {[function: nodescript] createcontext: [function], runincontext: [function], Runinthiscontext: [function], RuninNewContext: [function]}*/stisole.log (vmail '). [Function], runincontext: [function], runinthiscontext: [function], runinnewcontext: [function]}, createScript: [function], createContext: [function], RuninContext: [function], RunThiscontext: [function], RuninNewContext: [function]}}}}}}}}}}}}}}}}Среди них Runinthiscontext эквивалентен выполнению кода в совершенно новой среде и не повлияет на объект в текущей области. RuninnewContext и Runincontext могут быть указаны как объекты контекста, разница - это нормальный объект или объект контекста. Другими словами, RuninnewContext и Runincontext могут локально влиять на объекты в текущей области. Чтобы полностью взаимодействовать с текущей средой, требуются опасные эвалы. В системе загрузки, которая поставляется с 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}; bender = function (title, funk) {var end, i, start; Start = новая дата; for (i = 0; i <5000; i ++) {funk (); } end = новая дата; console.log (title + ':' + (end - start) + 'ms');} var ctx = vm.createcontext (sandbox); bender ('vm.runinthiscontext', function () {vm.runithiscontext (code);}); Benchmark ('vm.runnewContextextext (function () {vm.runneNnepclexexeclox; }); bendal ('script.runithiscontext', function () {script.runinthiscontext ();}); bendal ('script.runinnewcontext', function () {script.runinnewcontext ', function () {script.runinnewcontext ();}); script.runinnewcontext (Sandbox); 2222msscript.runinthiscontext: 6msscript.runinnewcontext: 1876msscript.runincontext: 44msfn: 0ms */Из этого мы видим, что метод V8 - полная победа!
Вышеуказанное - все содержание этой статьи. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.