我知道这很不符合 Node/CommonJS-y——请原谅我。 (我正在编写各种类型的库,我希望我的库的 require
方法在浏览器和 NodeJS 上的工作方式完全相同。)
我想要做的是在当前模块的上下文中评估脚本——也就是说,如果我在模块中说 exports.a = "100";
,我希望 exports.a
在 require
ing 模块中的所有代码中都等于 "100"
要求
。
如果不清楚,我很乐意详细说明。
最佳答案
这不是一个完整的答案,但希望能帮助您找到正确的方向。
最近几天我一直在搞乱 Node 的模块创建系统。基本上,我想创建一些在全新的上下文和变量范围内调用的模块,为此我将定义 Node 功能的有限子集和扩展。
我结束了学习 their source here ,并特别注意 NativeModule
构造函数及其方法。
您会注意到,模块的源代码是从文件中读取的,包裹在表示函数的字符串中,并评估为实际代码。
包装器:
NativeModule.wrapper = [
'(function (exports, require, module, __filename, __dirname, define) { ',
'\n});'
];
调用函数,调用包含的模块代码。
正如您从包装器中看到的那样,该函数需要六个参数,第一个是 exports
对象(开始时为空)。它还被传递给 require
函数,这就是为什么您可以将 require
作为变量访问,即使 require
不是全局的。
模块代码填充 exports
对象,然后 exports
被缓存,这样所有这些工作都不需要在将来完成。因此,当 require( 'someModule' )
被调用时,它只是查找缓存的 exports
对象并返回它。
我相信您可以在您的代码中做类似的事情,只要您可以获得您想要需要的模块的源代码。
也许 SomeModule.toString()
对您来说就足够了。虽然不确定浏览器支持的一致性如何。
还有一个私有(private) API,用于为模块设置环境。
process.binding('evals').Script
/*
{ [Function: Script]
createContext: [Function],
runInContext: [Function],
runInThisContext: [Function],
runInNewContext: [Function] }
*/
我最终需要使用 createContext
和 runInContext
来让事情正常进行,但我猜你可能不需要这样的东西。
关于javascript - 在另一个模块的上下文中评估模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700591/