Node.js a récemment ajouté un module de machine virtuelle. En fait, on ne peut pas dire que c'est un nouveau. Il expose simplement certaines interfaces internes, disponibles à partir de 2.x. Nous pouvons voir ces codes de Node / Src / Node.js:
var script = process.binding ('evals'). nœudscript; var runIntHisConText = script.runIntHisConText; NativeModule.Wrap = fonction (script) {return nativeModule.wrapper [0] + script + nativeModule.wrapper [1]; }; NativeModule.wrapper = ['(fonction (exportations, require, module, __filename, __dirname) {', '/ n});' ]] NativeModule.prototype.compile = function () {var source = nativeModule.getSource (this.id); source = nativeModule.Wrap (source); var fn = runIntHisConText (source, this.filename, true); fn (this.exports, nativeModule.require, this, this.filename); this.loaded = true; };L'objet de script est très similaire à l'objet renvoyé par require («VM»), mais en substance, le module VM est l'encapsulation de l'objet de script.
var script = process.binding ('evals'). nœudscript; console.log (script) / ** {[function: nodscript] createContext: [function], runincontex RuninConText: [fonction], runIntHisConText: [fonction], runInNewContext: [fonction]}, CreateScript: [Function], CreateContext: [Function], RunInContext: [Function], RunIntHisContext: [Function], RunInNewContext: [Function]}Parmi eux, RunIntHisContext équivaut à exécuter du code dans un tout nouvel environnement et n'affectera pas l'objet dans la portée actuelle. RunInNewContext et RuninContext peuvent être spécifiés en tant qu'objets de contexte, la différence est un objet normal ou un objet de contexte. En d'autres termes, RunInNewContext et RuninConText peuvent affecter localement les objets dans la portée actuelle. Pour interagir pleinement avec l'environnement actuel, des étions dangereuses sont nécessaires. Dans le système de chargement fourni avec Node.js, il n'est évidemment pas si courageux et il utilise RunIntHisContext. Et j'ai fait beaucoup de travail avant cela, comme envelopper le contenu du fichier JS de l'utilisateur dans une couche (nativemodule.wrap), et d'autres lings et opérations synchrones, qui sont en fait une méthode de chargement très efficace. Le seul avantage est que la synchronisation est utilisée, ce qui rend le code beaucoup plus facile à écrire.
Dans GitHub, certaines personnes ont comparé les performances de ces méthodes d'exécution dynamiquement:
var vm = require ('vm'), code = 'var carré = n * n;', fn = new function ('n', code), script = vm.CreatScript (code), sandbox; n = 5; sandbox = {n: n}; benchmark = function (title, funk) {var end, i, start; start = nouvelle date; pour (i = 0; i <5000; i ++) {funk (); } end = nouvelle date; Console.log (titre + ':' + (end - start) + 'ms');} var ctx = vm.CreateContext (sandbox); benchmark ('vm.RunIntHisConText', function () {vm.RunIntHisConText (code);}); benchmark ('vm.runinnewcontext', function () {vm.RunNoncon }); benchmark ('script.runIntHisConText', function () {script.runIntHisConText ();}); benchmark ('script.runinnewContext', function () {script.runinnewContex script.runinnewcontex 2222MSScript.RunIntHisConText: 6msScript.RuninnewContext: 1876msscript.RuninContext: 44msfn: 0ms * /De cela, nous pouvons voir que la méthode V8 est la victoire complète!
Ce qui précède est l'intégralité du contenu de cet article. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.