new vm.SourceTextModule(code[, options])


  • code <string> 要解析的 JavaScript 模块代码

    ¥code <string> JavaScript Module code to parse

  • options

    • identifier <string> 用于堆栈跟踪的字符串。默认值:'vm:module(i)',其中 i 是上下文特定的升序索引。

      ¥identifier <string> String used in stack traces. Default: 'vm:module(i)' where i is a context-specific ascending index.

    • cachedData <Buffer> | <TypedArray> | <DataView> 为所提供的源提供可选的 BufferTypedArrayDataView,其中包含 V8 的代码缓存数据。code 必须与创建此 cachedData 的模块相同。

      ¥cachedData <Buffer> | <TypedArray> | <DataView> Provides an optional Buffer or TypedArray, or DataView with V8's code cache data for the supplied source. The code must be the same as the module from which this cachedData was created.

    • context <Object> vm.createContext() 方法返回的 contextified 对象,用于编译和评估此 Module 中的对象。

      ¥context <Object> The contextified object as returned by the vm.createContext() method, to compile and evaluate this Module in.

    • lineOffset <integer> 指定在此 Module 产生的堆栈跟踪中显示的行号偏移量。默认值:0

      ¥lineOffset <integer> Specifies the line number offset that is displayed in stack traces produced by this Module. Default: 0.

    • columnOffset <integer> 指定在此 Module 生成的堆栈跟踪中显示的第一行列号偏移量。默认值:0

      ¥columnOffset <integer> Specifies the first-line column number offset that is displayed in stack traces produced by this Module. Default: 0.

    • initializeImportMeta <Function> 在评估此 Module 期间调用以初始化 import.meta

      ¥initializeImportMeta <Function> Called during evaluation of this Module to initialize the import.meta.

    • importModuleDynamically <Function> 在调用 import() 时在评估此模块期间调用。如果未指定此选项,则调用 import() 将使用 ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING 拒绝。

      ¥importModuleDynamically <Function> Called during evaluation of this module when import() is called. If this option is not specified, calls to import() will reject with ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING.

      • specifier <string> 说明符传递给 import()

        ¥specifier <string> specifier passed to import()

      • module <vm.Module>

      • importAssertions <Object> 传给 optionsExpression 可选参数的 "assert" 值,如果没有提供值,则为空对象。

        ¥importAssertions <Object> The "assert" value passed to the optionsExpression optional parameter, or an empty object if no value was provided.

      • 返回:<Module Namespace Object> | <vm.Module> 建议返回 vm.Module 以利用错误跟踪,并避免包含 then 函数导出的命名空间出现问题。

        ¥Returns: <Module Namespace Object> | <vm.Module> Returning a vm.Module is recommended in order to take advantage of error tracking, and to avoid issues with namespaces that contain then function exports.

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