javascript - 在另一个模块的上下文中评估模块

标签 javascript node.js

我知道这很不符合 Node/CommonJS-y——请原谅我。 (我正在编写各种类型的库,我希望我的库的 require 方法在浏览器和 NodeJS 上的工作方式完全相同。)

我想要做的是在当前模块的上下文中评估脚本——也就是说,如果我在模块中说 exports.a = "100"; ,我希望 exports.arequireing 模块中的所有代码中都等于 "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] }
*/

我最终需要使用 createContextrunInContext 来让事情正常进行,但我猜你可能不需要这样的东西。

关于javascript - 在另一个模块的上下文中评估模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700591/

相关文章:

javascript - Mediaelement.js 在 IE 上倒回后隐藏控件

node.js - Passport-Twitter - 错误 : Failed to find request token in session

javascript - slim /工兵 : Body empty on POST

javascript - DRF 在嵌套序列化器中创建用户

node.js - 在 NodeJS 中下载大文件的最佳方式是什么?

javascript - 在物理 Android 设备上运行 Meteor 移动应用

javascript - 从 Meteor 中的另一个模板获取 react 变量

javascript - Node.js 错误 "terminate called after throwing an instance of ' std::bad_alloc' what(): std::bad_alloc"

javascript - 如何在 Three.js 中剪切立方体

JavaScript document.links 已损坏