当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js new vm.SourceTextModule(code[, options])用法及代码示例


new vm.SourceTextModule(code[, options])

历史
版本变化
v17.0.0、v16.12.0

importModuleDynamically 参数添加了对导入断言的支持。


参数
  • code <string> JavaScript 模块代码解析
  • options
    • identifier <string> 堆栈跟踪中使用的字符串。 默认: 'vm:module(i)' 其中 i 是 context-specific 升序索引。
    • cachedData <Buffer> | <TypedArray> | <DataView> 为提供的源提供可选的 BufferTypedArrayDataView 以及 V8 的代码缓存数据。 code 必须与创建此 cachedData 的模块相同。
    • context <Object> vm.createContext() 方法返回的 contextified 对象,用于在其中编译和评估此 Module
    • lineOffset <integer> 指定在此 Module 生成的堆栈跟踪中显示的行号偏移量。 默认: 0
    • columnOffset <integer> 指定在此 Module 生成的堆栈跟踪中显示的 first-line 列号偏移量。 默认: 0
    • initializeImportMeta <Function>在评估这个时调用Module初始化import.meta.
    • importModuleDynamically <Function>在评估此模块时调用import()叫做。如果未指定此选项,则调用import()会拒绝ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING.

创建一个新的 SourceTextModule 实例。

分配给作为对象的 import.meta 对象的属性可能允许模块访问指定 context 之外的信息。使用 vm.runInContext() 在特定上下文中创建对象。

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);
})();

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 new vm.SourceTextModule(code[, options])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。