我知道這是非常節點/ CommonJS-Y-原諒我。 (我正在寫一個類庫,我希望我的庫的require
方法在瀏覽器和NodeJS上的工作方式完全相同。)在另一個模塊的上下文中評估模塊
我希望能夠做的就是評估腳本在當前模塊的情況下 - 也就是說,如果我在模塊中說exports.a = "100";
,我希望exports.a
等於"100"
在require
ing模塊中的所有代碼之後的require
。
如果不清楚,我很樂意詳細說明。
我知道這是非常節點/ CommonJS-Y-原諒我。 (我正在寫一個類庫,我希望我的庫的require
方法在瀏覽器和NodeJS上的工作方式完全相同。)在另一個模塊的上下文中評估模塊
我希望能夠做的就是評估腳本在當前模塊的情況下 - 也就是說,如果我在模塊中說exports.a = "100";
,我希望exports.a
等於"100"
在require
ing模塊中的所有代碼之後的require
。
如果不清楚,我很樂意詳細說明。
這不是一個完整的答案,但希望能幫助你走向正確的方向。
我一直在搞亂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] }
*/
我最終需要使用createContext
和runInContext
把事情的工作,但我猜你可能不會需要這樣的事。
(我寫了各種各樣的圖書館,我想我的圖書館的要求 方法工作完全一樣的瀏覽器和的NodeJS
如果我理解正確(請原諒我如果不是;))你正在尋找像node-browserify。
Browserify瀏覽器端需要()爲您的節點模塊和NPM 包
就在browserify指向一個JavaScript文件或兩個,它會走 AST遞歸讀取所有你需要()■ 。由此產生的軟件包有 您需要的一切,包括拉入庫,您可能使用npm安裝 !
爲什麼不使用[VM](http://nodejs.org/docs/v0.5.1/api/vm.html);) – Raynos
想要更靈活嗎?閱讀並查找[REPL]的私有API(https://github.com/joyent/node/blob/master/lib/repl.js),然後使用REPL構建自己的沙箱。 – Raynos
你是男人@Raynos!這正是我需要的。他們是相同的功能,我只是不知道它是公開的。我從源頭上發現了他們,並沒有在文檔中爲他們付出沉重的代價。我很高興聽到它是API的一部分! – user113716