當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。