我正在使用TypeScript和Express编写节点Web应用程序。
我设法使所有工作正常进行,但是我遇到的问题是我的导入似乎不尊重我的baseUrl
的{{1}}选项。
这是我的tsconfig.json
的样子:
tsconfig.json
作为一个例子,假设我有以下文件:
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"pretty": true,
"sourceMap": true,
"target": "es6",
"outDir": "./dist",
"baseUrl": "./src"
},
"exclude": [
"node_modules"
]
}
在- dist/
- a/
- car.js
- b/
- hat.js
中,我可以轻松地通过以下方式要求car.js
:
hat.js
这按预期工作。
但是,我还希望能够执行以下操作:
import hat from '../../b/hat'; // relative version
这不会在编译期间产生任何问题,也不会显示任何IDE错误,因为import hat from 'b/hat'; // absolute version
将tsconfig.json
指定为baseUrl
。因此,上面的代码是完全有效的TypeScript代码。
但是,我希望代码可以编译为相对版本:
./src
不幸的是,它编译为:
const hat = require('../../b/hat');
因此无法预测。
其他用户已通过使用第三方工具(例如:https://github.com/s-panferov/awesome-typescript-loader)解决了此问题 https://decembersoft.com/posts/say-goodbye-to-relative-paths-in-typescript-imports/
但是这些工具中的大多数都是为与WebPack一起使用而设计的,它实际上并不适合于节点后端应用程序。这是因为我们正在运行一台运行时间较长的服务器,因此无法将其捆绑到一个文件中而不能捆绑到多个文件中(与前端Web开发不同)。
我的问题是,如何在没有WebPack的情况下编译我的TypeScript文件,以便绝对导入正常工作。
答案 0 :(得分:1)
我的问题是,如何在没有WebPack的情况下编译我的TypeScript文件,以便绝对导入正常工作。
不要。实际上,即使使用webpack,也不要这样做。
节点解析算法非常复杂:https://nodejs.org/api/modules.html#modules_all_together,不需要用“而且哦,现在我们有了baseurl”进一步复杂。
如果您仍然想要这样做,请here are your options。
答案 1 :(得分:0)
OP我还没有解决这个问题,但是本文可能会提供一些指导:https://levelup.gitconnected.com/get-rid-of-relative-import-path-hell-in-your-typescript-project-9952adec2e84
TL; DR
yarn add link-module-alias
package.json
...
"_moduleAliases": {
"~": "dist"
}
...