Node.js hat kürzlich ein virtuelles Maschinenmodul hinzugefügt. In der Tat kann nicht gesagt werden, dass es neu ist. Es enthält nur einige interne Schnittstellen, die von 2.x erhältlich waren. Wir können diese Codes von Node/SRC/Node.js sehen:
var script = process.binding ('evals'). nodescript; var runinThiscontext = script.runinThiscontext; Nativemodule.wrap = function (script) {return nativemodule.wrapper [0] + script + nativemodule.wrapper [1]; }; Nativemodule.wrapper = ['(Funktion (exportiert, erfordern, modul, __FileName, __dirname) {', '/n});' ]; Nativemodule.prototype.compile = function () {var source = nativemodule.getSource (this.id); Source = nativemodule.Wrap (Quelle); var fn = runinThiscontext (Quelle, this.filename, true); fn (this.exports, nativemodule.require, this, this.fileName); this.loaded = true; };Das darin enthaltene Skriptobjekt ist dem von Request ('VM') zurückgegebenen Objekt sehr ähnlich, aber im Wesentlichen ist das VM -Modul die Kapselung des Skriptobjekts.
var Script = process.binding('evals').NodeScript;console.log(Script)/**{ [Function: NodeScript] createContext: [Function], runInContext: [Function], runInThisContext: [Function], runInNewContext: [Function] } */console.log(require('vm')){ Script: { [Function: NodeScript] createContext: [function], runincontext: [function], runinThiscontext: [function], runInNewcontext: [function]}, createScript: [function], createContext: [function], runincontext: [function], runIntiscontext: [functionUnter ihnen ist RuninThiscontext gleichbedeutend mit der Ausführung von Code in einem brandneuen Umfeld und wird das Objekt im aktuellen Bereich nicht beeinflussen. RunInNewContext und RunContext können als Kontextobjekte angegeben werden, der Unterschied ist ein normales Objekt oder ein Kontextobjekt. Mit anderen Worten, RunInNewContext und Runincontext können sich lokal im aktuellen Bereich auswirken. Um mit der aktuellen Umgebung vollständig zu interagieren, sind gefährliche Evals erforderlich. Im Ladesystem, das mit Node.js geliefert wird, ist es offensichtlich nicht so mutig und verwendet RuninThiscontext. Und ich habe zuvor viel Arbeit geleistet, z. B. den Inhalt der JS -Datei des Benutzers in eine Ebene (Nativemodule.Wrap) und andere Lings und Synchronoperationen, die eigentlich eine sehr effiziente Lademethode sind. Der einzige Vorteil ist, dass die Synchronisation verwendet wird, wodurch der Code viel einfacher zu schreiben ist.
In GitHub haben einige Menschen die Leistung dieser Methoden zur dynamischen Ausführung von Skripten verglichen:
var vm = required ('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; Start = neues Datum; für (i = 0; i <5000; i ++) {Funk (); } End = neues Datum; console.log (title + ':' + (end - start) + 'ms');} var ctx = vm.createContext (sandbox); Benchmark ('vm.runinThiscontext', function () {vm.runinThiscontext (Code);}; Sandbox); }); Benchmark ('script.runinNewcontext', function () {script.runinNewContext (sandbox);}); Benchmark ('script.runincontext', function () {script.runincontext (ctx); }).Daraus können wir sehen, dass die V8 -Methode der vollständige Sieg ist!
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.