2013-06-04 44 views
1

我試圖將使用V8(D8)二進制文件構建的JS應用程序轉換爲節點。NodeJS運行所有包含在相同的範圍/上下文

在V8中,您可以簡單地使用load('path/to/file.js');,它將包含與當前上下文相同範圍內的文件。

包含的文件具有許多全局變量和函數。我真的不想去重寫所有這些文件(數百個文件,數千行)來使用Node的模塊模式。

他們還需要讀取和寫入全局範圍內的變量。

那麼如何在Node中包含文件,但是在相同的範圍/上下文中。

這裏是腳本的一個示例:

bootstrap.js:

var entityID = 12345; 
load("environment.js"); 
function readEntity(id) { ... } 
load("config.js"); 
writeEntity(entity); 

environment.js:

function writeEntity(entity) { ... } 
entityID += 1; 

config.js:

var entity = readEntity(entityID); 

D8信息:http://www.sandeepdatta.com/2011/10/using-v8-javascript-shell-d8.html

回答

2

註冊一個全球load功能的代碼程序中的第一個位:

var fs = require('fs'); 

global.load = function (file) { 
    var body = fs.readFileSync(file, {encoding:'utf8'}); 
    eval.call(global, body); 
}; 

調用從代碼的任何地方load('./file.js');將導致文件被加載的一部分全球範圍。即使您提供了與eval.call()不同的範圍,代碼似乎仍然是全球性的。我不確定是否有真正的方法將範圍限制爲單個模塊,除非直接就地調用eval(而不是通過load函數)。

如果這是一個問題,您可能還需要添加一個條件來防止同一個文件被「加載」兩次。

最後,即使你說你不想要,重新編寫模塊範例的代碼很可能在長期運行中是值得的。我不會直接拒絕它。