Отображение пути Typescript не переводится в приложение узла
В настоящее время используется машинопись в приложении node.js. Я скомпилировал свое приложение и использую функцию отображения пути машинописи.
Вместо этого "api/*" следует искать в корневой папке. Используя следующее в разработках:
nodemon --watch src -e ts,tsx --exec ts-node -r tsconfig-paths/register --disableWarnings ./src/index.ts
tsconfig-paths/register
позволяет правильно преобразовать требование, и ts-node выполнит / запустит приложение должным образом. Теперь проблема возникает, когда я перехожу на производство. В прошлом на производстве я просто бегал tsc
в папке, и переместил содержимое outDir (dist/) в /app в моем образе докера, и запустил node /app/index.js
, Это работало до тех пор, пока я не начал использовать функцию отображения пути машинописи. Теперь я просто получаю ошибку:
Ошибка: не удается найти модуль 'api / module / path / here'
Из этого комментария github имена модулей, по-видимому, не сопоставлены с выходным скомпилированным javascript.
Мой файл tsconfig.json:
{
"compilerOptions": {
"target": "es2015",
"module": "commonjs",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"jsx": "react",
"allowJs": true,
"alwaysStrict": true,
"sourceMap": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitAny": false,
"noImplicitThis": false,
"strictNullChecks": false,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"lib": ["es2017", "dom"],
"baseUrl": "src",
"outDir": "dist",
"types": [
"node"
],
"paths": {
"universal/*": ["../../universal/*"],
"api/*": ["*"],
"*": ["node_modules/*"]
},
"typeRoots": [
"./node_modules/@types",
"./src/types"
]
},
"include": [
"src/**/*"
]
}
Каков рекомендуемый подход к использованию относительного сопоставления путей в среде node.js? Если машинный перевод выполняет разрешение, то почему бы ему не переписать операторы require? Глупо было бы включать еще один шаг, такой как babel или webpack, просто чтобы добавить функциональность, которую обеспечивает машинопись с разрешением модуля.
РЕДАКТИРОВАТЬ: После дополнительного копания я обнаружил, что я мог бы использовать -r tsconfig-paths/register
в моей среде узла (мне просто нужно скопировать в мой файл tsconfig.json). Я могу переключить свою точку входа в Docker на:
ENTRYPOINT [ "node", "-r", "tsconfig-paths/register", "index.js" ]
Проблема в том, что мне нужно изменить tsconfig.json
baseUrl, как каталог src/
не существует Кроме того, я заметил, что разрешение не работает для модуля 'util' (очевидно, он использует util в моей папке node_modules вместо библиотеки util.js), что приводит к сбою моего приложения.
1 ответ
В соответствии с источником, который вы указали, вы можете использовать (например, определить последний путь как первый путь):
"rootDirs": [
"src/api/module/path/here",
"api/module/path/here"
]
Проблема в том, что теперь мне нужно изменить свой tsconfig.json baseUrl, так как каталог src/ не существует.
Состояние отображения пути машинописи:
Гибкость rootDirs не ограничивается указанием списка каталогов физических источников, которые логически объединяются. Предоставленный массив может включать в себя любое количество произвольных произвольных имен каталогов, независимо от того, существуют они или нет. Это позволяет компилятору захватывать сложные функции пакетирования и времени выполнения, такие как условное включение и плагины загрузчика для конкретного проекта, безопасным способом.
Кроме того, вы пробовали разрешение модуля трассировки: tsc --traceResolution