考虑以下代码:
vm = require('vm');
context = vm.createContext({});
vm.runInContext("Buffer.from('abc').toString()", context);
观察到这会产生
ReferenceError: Buffer is not defined
因为 Buffer 是 Node.js 特定的构造,Node.js 已添加为 Node Specific Global Object . (请注意,其他 JS 全局变量,如 Math
和 Array
不存在此问题。)可以通过将上述代码修改为vm = require('vm');
context = vm.createContext({Buffer});
vm.runInContext("Buffer.from('abc').toString()", context);
但是,如果我希望导入每个特定于 Node 的全局变量,那么似乎我必须一一列出它们。鉴于 Node.js 相对频繁地添加全局对象,有没有一种方法可以将所有 Node.JS 的全局对象传递给 vm 上下文?或者,是否有一种编程方式来构建所有 Node Globals 的列表?
注意:使用
global
在不同的 Node 版本之间不一致:例如Buffer
在 global
适用于 Node v8 和 v10,但不适用于 v12。
最佳答案
我懂了。
const cloneGlobal = () => Object.defineProperties(
{...global},
Object.getOwnPropertyDescriptors(global)
)
测试:> const nG = cloneGlobal()
> nG.myVar = 'a';
'a'
> myVar
Uncaught ReferenceError: myVar is not defined
> 'myVar' in global
false
> 'myVar' in nG
true
> 'Buffer' in nG
true
关于node.js - 是否可以在 Node 的 VM 上下文中提供所有 Node.js Globals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59049140/