2011-07-14 94 views
4

我知道這是非常節點/ CommonJS-Y-原諒我。 (我正在寫一個類庫,我希望我的庫的require方法在瀏覽器和NodeJS上的工作方式完全相同。)在另一個模塊的上下文中評估模塊

我希望能夠做的就是評估腳本在當前模塊的情況下 - 也就是說,如果我在模塊中說exports.a = "100";,我希望exports.a等於"100"require ing模塊中的所有代碼之後的require

如果不清楚,我很樂意詳細說明。

回答

1

這不是一個完整的答案,但希望能幫助你走向正確的方向。

我一直在搞亂Node的系統創建模塊的最後幾天。基本上我想創建一些模塊,這些模塊是在全新的上下文和變量作用域中調用的,爲此我將定義Node的有限子集和擴展。

我最終學習了their source here,並特別關注了NativeModule的構造函數及其方法。

您會注意到,模塊的源代碼是從文件中讀取的,包裝在代表函數的字符串中並被評估爲實際代碼。

封套:

NativeModule.wrapper = [ 
    '(function (exports, require, module, __filename, __dirname, define) { ', 
    '\n});' 
]; 

的函數被調用,該調用所包含的模塊的代碼。

這個函數需要6個參數,你可以從包裝器中看到,其中第一個是exports對象(它從空開始)。它也通過了require函數,這就是爲什麼即使require不是全局變量也可以訪問require作爲變量的原因。

模塊代碼填充了exports對象,然後緩存了exports,因此所有這些工作都不需要在將來完成。所以當調用require('someModule')時,它只是查找緩存的exports對象並返回它。

我相信你可以在你的代碼中做這樣的事情,只要你能得到你想要的需要的模塊的源代碼。

也許SomeModule.toString()就足夠了。不知道如何一致的瀏覽器支持。


還有一個私有API用於爲模塊設置環境。

process.binding('evals').Script 

/* 
{ [Function: Script] 
    createContext: [Function], 
    runInContext: [Function], 
    runInThisContext: [Function], 
    runInNewContext: [Function] } 
*/ 

我最終需要使用createContextrunInContext把事情的工作,但我猜你可能不會需要這樣的事。

+2

爲什麼不使用[VM](http://nodejs.org/docs/v0.5.1/api/vm.html);) – Raynos

+1

想要更靈活嗎?閱讀並查找[REPL]的私有API(https://github.com/joyent/node/blob/master/lib/repl.js),然後使用REPL構建自己的沙箱。 – Raynos

+0

你是男人@Raynos!這正是我需要的。他們是相同的功能,我只是不知道它是公開的。我從源頭上發現了他們,並沒有在文檔中爲他們付出沉重的代價。我很高興聽到它是API的一部分! – user113716

0

(我寫了各種各樣的圖書館,我想我的圖書館的要求 方法工作完全一樣的瀏覽器和的NodeJS

如果我理解正確(請原諒我如果不是;))你正在尋找像node-browserify

Browserify瀏覽器端需要()爲您的節點模塊和NPM 包

就在browserify指向一個JavaScript文件或兩個,它會走 AST遞歸讀取所有你需要()■ 。由此產生的軟件包有 您需要的一切,包括拉入庫,您可能使用npm安裝 !

相關問題