使用不带WebPack的TypeScript的baseurl属性使用非相对导入

时间:2018-11-25 22:49:13

标签: node.js typescript

我正在使用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文件,以便绝对导入正常工作。

2 个答案:

答案 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"
  }
...