У меня есть монорепозиторий NX с библиотеками, которые все построены из ESM TypeScript в простой JS ESM с SWC.
- libs
- lib1
- lib2
- lib3
lib1
импортирует как lib2
, так и lib3
, до сборки все работает нормально, но после сборки, когда я запускаю:
node dist/libs/lib1/src/main.js
Я получаю следующую ошибку:
Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@myorg/lib2' imported from /code/dist/libs/lib1/src/main.js
В предыдущем проекте монорепозитория, в котором использовалась lerna, я смог воспользоваться подъемом модуля, который, насколько я понимаю, создавал символическую ссылку внутри node_modules, указывающую на скомпилированную версию. Какое решение мне нужно, чтобы воспроизвести это поведение в nx и заставить работать импорт узлов? Это работает в моем внешнем приложении из-за объединения, но я бы не хотел идти по этому пути для приложения узла.
Большое спасибо! :)
Для потомков я использовал эту библиотеку: https://www.npmjs.com/package/esm-module-alias?activeTab=versions
С пользовательской функцией, которая читает tsconfig и указывает каждой библиотеке ее местоположение в dist
:
import generateAliasesResolver from "esm-module-alias"
import tsconfig from "tsconfig.base.json" assert { type: "json" }
const aliases = {}
Object.entries(tsconfig.compilerOptions.paths).forEach(([libName, libPath]) => {
aliases[libName] =
libPath[0]
.replace("/src/index.ts", "")
.replace("libs/", "dist/libs/")
})
export const resolve = generateAliasesResolver(aliases)
И затем я запускаю его с помощью:
node --loader ./path-to-script.mjs --experimental-specifier-resolution=node --no-warnings dist/.../script.js