new vm.SourceTextModule(code[, options])
code<string> 解析 JavaScript 模块的代码optionsidentifier<string> 用于堆栈跟踪的字符串。 默认值:'vm:module(i)',其中i是上下文特定的递增索引。cachedData<Buffer> | <TypedArray> | <DataView> 提供可选的Buffer或TypedArray,或带有 V8 代码缓存数据的DataView,用于提供的源代码。code必须与创建该cachedData的模块相同。context<Object> 由vm.createContext()方法返回的 情境化 对象,用于在其中编译和评估此Module。lineOffset<integer> 指定此Module生成的堆栈跟踪中显示的行号偏移量。默认值:0。columnOffset<integer> 指定在此Module生成的堆栈跟踪中显示的首行列号偏移量。默认值:0。initializeImportMeta<Function> 在评估此Module时被调用,用于初始化import.meta。meta<import.meta>module<vm.SourceTextModule>
importModuleDynamically<Function> 在评估此模块时调用,当import()被调用时触发。如果未指定此选项,调用import()将会以ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING拒绝。specifier<string> 传递给import()的指定符module<vm.Module>- 'importAssertions' <Object> 'assert' 值传递给
optionsExpression可选参数,若未提供值则为空对象。 - 返回值:<Module Namespace Object> | <vm.Module> 推荐返回
vm.Module,以便利用错误跟踪,并避免包含then函数导出的命名空间出现问题。
创建一个新的 SourceTextModule 实例。
🌐 Creates a new SourceTextModule instance.
分配给 import.meta 对象的属性如果是对象,可能允许模块访问指定 context 之外的信息。使用 vm.runInContext() 可以在特定上下文中创建对象。
🌐 Properties assigned to the import.meta object that are objects may
allow the module to access information outside the specified context. Use
vm.runInContext() to create objects in a specific context.
import vm from 'node:vm';
const contextifiedObject = vm.createContext({ secret: 42 });
const module = new vm.SourceTextModule(
'Object.getPrototypeOf(import.meta.prop).secret = secret;',
{
initializeImportMeta(meta) {
// Note: this object is created in the top context. As such,
// Object.getPrototypeOf(import.meta.prop) points to the
// Object.prototype in the top context rather than that in
// the contextified object.
meta.prop = {};
}
});
// Since module has no dependencies, the linker function will never be called.
await module.link(() => {});
await module.evaluate();
// Now, Object.prototype.secret will be equal to 42.
//
// To fix this problem, replace
// meta.prop = {};
// above with
// meta.prop = vm.runInContext('{}', contextifiedObject);const vm = require('node:vm');
const contextifiedObject = vm.createContext({ secret: 42 });
(async () => {
const module = new vm.SourceTextModule(
'Object.getPrototypeOf(import.meta.prop).secret = secret;',
{
initializeImportMeta(meta) {
// Note: this object is created in the top context. As such,
// Object.getPrototypeOf(import.meta.prop) points to the
// Object.prototype in the top context rather than that in
// the contextified object.
meta.prop = {};
}
});
// Since module has no dependencies, the linker function will never be called.
await module.link(() => {});
await module.evaluate();
// Now, Object.prototype.secret will be equal to 42.
//
// To fix this problem, replace
// meta.prop = {};
// above with
// meta.prop = vm.runInContext('{}', contextifiedObject);
})();