gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:25:54 25 4
gpt4 key购买 nike

我知道这很不符合 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com