new vm.SourceTextModule(code[, options])


  • code <string> 解析 JavaScript 模块的代码
  • options
    • identifier <string> 用于堆栈跟踪的字符串。 默认值: 'vm:module(i)',其中 i 是上下文特定的递增索引。
    • cachedData <Buffer> | <TypedArray> | <DataView> 提供可选的 BufferTypedArray,或带有 V8 代码缓存数据的 DataView,用于提供的源代码。code 必须与创建该 cachedData 的模块相同。
    • context <Object>vm.createContext() 方法返回的 情境化 对象,用于在其中编译和评估此 Module
    • lineOffset <integer> 指定此 Module 生成的堆栈跟踪中显示的行号偏移量。默认值: 0
    • columnOffset <integer> 指定在此 Module 生成的堆栈跟踪中显示的首行列号偏移量。默认值: 0
    • initializeImportMeta <Function> 在评估此 Module 时被调用,用于初始化 import.meta
    • importModuleDynamically <Function> 在评估此模块时调用,当 import() 被调用时触发。如果未指定此选项,调用 import() 将会以 ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING 拒绝。

创建一个新的 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);
})();