如何用node.js實現動態執行指令碼
本章節介紹一下如何用node.js實現動態執行指令碼。
node.js新增了虛擬機器模組,其實也不能說是新增的,只是把一些內部介面暴露出來。
我們可以從node / src / node.js看到這些程式碼:
[JavaScript] 純文字檢視 複製程式碼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')返回的物件很相似,而實質上,vm模組就是對Script物件的封裝。
[JavaScript] 純文字檢視 複製程式碼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 相當於一個全新的環境中執行程式碼,不會影響當前作用域的物件。而runInNewContext與runInContext則能指定是上下文物件,區別是一個普通物件或一個context物件。換言之,runInNewContext與runInContext能區域性影響當前作用域的物件。要與當前環境完全進行互動的話,就需要用到危險的eval。在node.js自帶的載入體系中,顯然沒有這樣的勇氣,使用的是runInThisContext。並且在這之前做了許多工作,如把使用者的JS檔案裡面的內容再包一層( NativeModule.wrap),還有其他凌散操作,加之是同步操作,實際上是一種效率很糟的載入方式。唯一的好處是,使用了同步,讓程式碼編寫起來簡單多了。
在github中,已有人對這幾種動態執行指令碼的方法進行效能比較:
[JavaScript] 純文字檢視 複製程式碼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完勝。
相關文章
- 使用expect執行動態指令碼指令碼
- appium ios java 指令碼如何用指令執行,例如 adb 那種方式執行指令碼APPiOSJava指令碼
- spring+groovy實現動態程式碼注入執行Spring
- c#動態執行字串指令碼(最佳化版)C#字串指令碼
- sqlplus動態生成linux shell指令碼並執行SQLLinux指令碼
- Linux管理指令碼之自動執行指令碼Linux指令碼
- UNIX crontab自動執行指令碼指令碼
- redis執行lua指令碼的實現方法括饃Redis指令碼
- 案例五:shell指令碼實現定時監控http服務的執行狀態指令碼HTTP
- 如何用 ANTLR 4 實現自己的指令碼語言?指令碼
- 想在指令碼里面執行su命令,怎麼才能實現?指令碼
- C#動態執行函式:利用反射實現C#函式反射
- 動態執行c#程式碼C#
- 啟動vi時自動執行的指令碼指令碼
- jQuery實現的動態載入指令碼檔案程式碼例項jQuery指令碼
- DB2批量執行SQL指令碼的實現DB2SQL指令碼
- 定時 MYSQL 動作-LINUX下用CRON實現定時執行指令碼(轉)MySqlLinux指令碼
- 執行shell指令碼指令碼
- 指令碼執行方式指令碼
- shell動態指令碼和pl/sql動態指令碼的比較指令碼SQL
- 開機自動執行python指令碼Python指令碼
- 報警機制如何用多執行緒實現執行緒
- 如何用 Node.js 實現一個微型 CLINode.js
- 實現指令碼自動部署docker指令碼Docker
- PB程式碼動態解析執行器
- iOS安全攻防(十九):基於指令碼實現動態庫注入iOS指令碼
- linux下rman增量備份指令碼以及指令碼自動執行Linux指令碼
- 通過dylib實現iOS執行時Native程式碼注入(動態除錯)iOS除錯
- Node.js一行程式碼實現靜態檔案伺服器Node.js行程伺服器
- 使用 newman 執行 postman 匯出自動化指令碼Postman指令碼
- 使用php作linux自動執行指令碼PHPLinux指令碼
- LINUX 自動執行指令碼的命令配置Linux指令碼
- Linux啟動/關機時執行指令碼Linux指令碼
- 如何在Docker容器啟動時自動執行指令碼Docker指令碼
- mybatis執行sql指令碼MyBatisSQL指令碼
- crontab執行shell指令碼指令碼
- PowerShell 指令碼執行策略指令碼
- SQL SERVER執行指令碼SQLServer指令碼