Как сделать ссылку на SourceTextModule без его импорта?

Я обнаружил здесь , что импортированные модули принимаются как SyntheticModule()-s при связывании с SourceTextModule(), но мне удалось заставить его работать и как SourceTextModule()-s, как описано в документации: https: // nodejs.org/api/vm.html#class-vmmodule .

В любом случае, мне нужно нормальноimportмодуль, чтобы сделать его значения доступными из контекста. Это немного противоречит цели создания модуля, основанного только на тексте, особенно когда речь идет об импорте исходного текста: компоновщик всегда найдет только несвязанную версию. Как мне создать приемлемую версию самого vm.Module для компоновщика?

      export async function modularise(resource, identifier, home, globals = {}) {
  // uses --experimental-vm-modules 
  let {SourceTextModule,createContext,SyntheticModule} = await import("vm");
  let {default: {resolve}} = await import("path");
  let module = new SourceTextModule(resource || "", {
    identifier,
    context: createContext({imports: new Map(),...globals}),
    initializeImportMeta: meta => Object.assign(meta, {url: resolve(identifier)}),
    importModuleDynamically: identifier => import(identifier)
  });
  // saving reference to unlinked self
  module.context.imports[identifier] = module;
  await module.link((identifier, {context}) => context.imports.has(
      identifier = /^\./.test(identifier) ? resolve(identifier) : identifier
    ) 
    // the self-referential import will always remain unlinked
    ? context.imports.get(identifier) 
    : import(identifier).then(module =>
      context.imports.set(identifier, module) &&
      new SourceTextModule(Object.getOwnPropertyNames(module)
        .sort(name => name != "default" || -1)
        .map((name, index, exports) => name == "default"
        ? "export default imports.get(\"" + identifier + "\").default;" 
        : "export const {" + exports.splice(index).join(",") + `}=
        imports.get("` + identifier + "\");")
        .join("\n"), {identifier, context}
      )
    )
  );
  // statement never reached. 
  await module.evaluate();
  return module;
};

0 ответов

Другие вопросы по тегам