Как сделать ссылку на 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;
};