跳到主要内容
版本:4.0.0 🚧

关于 Alias Path

我们并不建议使用 Alias Path, Node 和 TS 原生不支持这个功能,即使有,现在也是通过各种 Hack 手段来实现(从 v18 开始,Node.js 已经有 exports 的方案,但是类型还未支持,可以等后续)。

如果你一定想要使用,请往下看。

本地开发的支持(dev 阶段)

tsc 将 ts 编译成 js 的时候,并不会去转换 import 的模块路径,因此当你在 tsconfig.json 中配置了 paths 之后,如果你在 ts 中使用 paths 并 import 了对应模块,编译成 js 的时候就有大概率出现模块找不到的情况。

解决办法是,要么不用 paths ,要么使用 paths 的时候只用来 import 一些声明而非具体值,再要么就可以使用 tsconfig-paths 来 hook 掉 node 中的模块路径解析逻辑,从而支持 tsconfig.json 中的 paths。

$ npm i tsconfig-paths --save-dev

使用 tsconfig-paths 可以在 src/configuration.ts 中引入。

// src/configuration.ts

import 'tsconfig-paths/register';
// ...
信息

上述的方法只会对 dev 阶段( ts-node)生效。

测试的支持(jest test)

在测试中,由于 Jest 的环境比较特殊,需要对 alias 再做一次处理,可以利用 Jest 的配置文件中的 moduleNameMapper 功能来替换加载到的模块,变相实现 alias 的功能。

module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testPathIgnorePatterns: ['<rootDir>/test/fixtures'],
coveragePathIgnorePatterns: ['<rootDir>/test/'],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
}
};

注意,这里使用的 alias 前缀是 @符号,如果是其他的 alias 名,请自行修改。

运行时的支持

tsconfig-paths 是在 ts 运行后在内存中替换路径,编译后依旧会输出带 @符号的路径,使得部署后找不到文件,社区有一些库会在 ts 编译做一些替换支持。

比如:

其他

老版本 CLI 中预埋了一个 mwcc 编译器,基于固定 TS 版本在构建器替换 Alias 内容,但是由于依赖 TS 私有 API 导致无法升级 TS 版本,无法享受到新版本的功能。

我们从 CLI 2.0 版本开始,移除了这个编译器。