在我的 Express 项目中,我从路径中导入 @common/foo
。得益于 tsconfig.json
中的 paths
,它只是一个别名,指向 ../common/src/foo
。这非常棒,在开发中可以使用 nodemon.json
中的此脚本:
{
"watch": ["src", "../common/src"],
"ext": "ts",
"ignore": ["src/public"],
"exec": "ts-node -r tsconfig-paths/register src/index.ts"
}
问 题 是 我 无 法 在 生 产 模 式 下 使 它 工 作 。
我 使 用
tsc
构建 项 目 , 如 果 我 检 查 产 生 的 文 件 , 它 们 从 @common/
导 入 内 容 而 不 是 从 ../common/src/
。 起 初 我 认 为 这 没 问 题 , 因 为 tsconfig-paths
在 运 行 时 工 作 , 所 以 我 只 需 将 其 包 含 在start
脚本中即可:node -r tsconfig-paths/register dist/index.js
很遗憾,它没有起作用,而且我在控制台中收到了这些“Cannot find module '@common/foo'”错误消息。
问题出在哪里?是我的配置有误吗?
我的package.json
(省略了所有不相关的部分):
{
"main": "index.js",
"scripts": {
"start": "cross-env NODE_ENV=prod node dist/index.js",
"build": "rimraf ./dist/ && cross-env NODE_ENV=prod tsc"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"@types/express": "^4.17.4",
"@types/node": "^13.11.0",
"cross-env": "^6.0.3",
"rimraf": "^3.0.2",
"ts-node": "^8.8.2",
"tsconfig-paths": "^3.9.0",
"typescript": "^3.8.3"
}
}
以下是我去除了所有无关部分后的tsconfig.json
文件:
{
"compilerOptions": {
"module": "commonjs",
"baseUrl": "./",
"outDir": "dist",
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"noImplicitAny": false,
"target": "es6",
"emitDecoratorMetadata": true,
"moduleResolution": "node",
"importHelpers": true,
"types": [
"node"
],
"typeRoots": [
"node_modules/@types"
],
"paths": {
"@common/*": [
"../common/src/*"
]
}
},
"include": [
"./src/**/*.ts"
],
"exclude": [
"./src/dist/"
],
"references": [
{
"path": "../common"
}
]
}