欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

node.js 動態(tài)執(zhí)行腳本

 更新時間:2016年06月02日 15:24:04   作者:司徒正美  
其中的Script對象,就與require('vm')返回的對象很相似,而實質(zhì)上,vm模塊就是對Script對象的封裝。

node.js最近新增了虛擬機(jī)模塊,其實也不能說是新增的,只是把一些內(nèi)部接口暴露出來罷了,從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(source, this.filename, true);
  fn(this.exports, NativeModule.require, this, this.filename);
 
  this.loaded = true;
 };

其中的Script對象,就與require('vm')返回的對象很相似,而實質(zhì)上,vm模塊就是對Script對象的封裝。

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],
 runInThisContext: [Function],
 runInNewContext: [Function] }

其中,runInThisContext 相當(dāng)于一個全新的環(huán)境中執(zhí)行代碼,不會影響當(dāng)前作用域的對象。而runInNewContext與runInContext則能指定是上下文對象,區(qū)別是一個普通對象或一個context對象。換言之,runInNewContext與runInContext能局部影響當(dāng)前作用域的對象。要與當(dāng)前環(huán)境完全進(jìn)行交互的話,就需要用到危險的eval。在node.js自帶的加載體系中,顯然沒有這樣的勇氣,使用的是runInThisContext。并且在這之前做了許多工作,如把用戶的JS文件里面的內(nèi)容再包一層( NativeModule.wrap),還有其他凌散操作,加之是同步操作,實際上是一種效率很糟的加載方式。唯一的好處是,使用了同步,讓代碼編寫起來簡單多了。

在github中,已有人對這幾種動態(tài)執(zhí)行腳本的方法進(jìn)行性能比較:

var vm = require('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 = new Date;
 for (i = 0; i < 5000; i++) {
  funk();
 }
 end = new Date;
 console.log(title + ': ' + (end - start) + 'ms');
}
 
var ctx = vm.createContext(sandbox);
benchmark('vm.runInThisContext',   function() { vm.runInThisContext(code); });
benchmark('vm.runInNewContext',   function() { vm.runInNewContext(code, sandbox); });
benchmark('script.runInThisContext', function() { script.runInThisContext(); });
benchmark('script.runInNewContext', function() { script.runInNewContext(sandbox); });
benchmark('script.runInContext', function() { script.runInContext(ctx); });
benchmark('fn',           function() { fn(n); });
/**
vm.runInThisContext: 212ms
vm.runInNewContext: 2222ms
script.runInThisContext: 6ms
script.runInNewContext: 1876ms
script.runInContext: 44ms
fn: 0ms
 
*/

由此可見,還是v8自帶的方法Function完勝!

以上就是本文的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • nodejs和php實現(xiàn)圖片訪問實時處理

    nodejs和php實現(xiàn)圖片訪問實時處理

    這篇文章主要為大家詳細(xì)介紹了nodejs和php分別實現(xiàn)圖片訪問實時處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • mongoose設(shè)置unique不生效問題的解決及如何移除unique的限制

    mongoose設(shè)置unique不生效問題的解決及如何移除unique的限制

    這篇文章主要給大家介紹了關(guān)于mongoose數(shù)據(jù)庫設(shè)置unique不生效問題的解決方法,以及Mongoose如何移除unique限制的方法示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • nodejs aes 加解密實例

    nodejs aes 加解密實例

    今天小編就為大家分享一篇nodejs aes 加解密實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 解決使用node命令提示:'node'不是內(nèi)部或外部命令,也不是可運行的程序

    解決使用node命令提示:'node'不是內(nèi)部或外部命令,也不是可運行的程序

    最近在工作中遇到了個常見的問題,分享給大家,這篇文章主要給大家介紹了關(guān)于如何解決使用node命令提示:'node'不是內(nèi)部或外部命令,也不是可運行的程序的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 在Mac OS下使用Node.js的簡單教程

    在Mac OS下使用Node.js的簡單教程

    這篇文章主要介紹了在Mac OS下使用Node.js的簡單教程,Node.js是讓JavaScript應(yīng)用運行于服務(wù)器端的框架,需要的朋友可以參考下
    2015-06-06
  • 基于Node的Axure文件在線預(yù)覽的實現(xiàn)代碼

    基于Node的Axure文件在線預(yù)覽的實現(xiàn)代碼

    這篇文章主要介紹了基于Node的Axure文件在線預(yù)覽的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • node.js超時timeout詳解

    node.js超時timeout詳解

    本文介紹了nodejs中超時timeout事件,并給出了詳細(xì)的示例分析,非常的詳盡,推薦給需要的小伙伴參考下
    2014-11-11
  • 服務(wù)端nodejs抓取jsonp接口數(shù)據(jù)實現(xiàn)示例

    服務(wù)端nodejs抓取jsonp接口數(shù)據(jù)實現(xiàn)示例

    這篇文章主要為大家介紹了服務(wù)端nodejs抓取jsonp接口數(shù)據(jù)實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • autojs的nodejs打包成品app經(jīng)驗分享

    autojs的nodejs打包成品app經(jīng)驗分享

    這篇文章主要為大家介紹了autojs的nodejs打包成品app經(jīng)驗分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 解決Mac node版本升級失敗的問題

    解決Mac node版本升級失敗的問題

    今天小編就為大家分享一篇解決Mac node版本升級失敗的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論