一个前端项目通常会演变成复杂的嵌套目录结构。因此,使用相对路径导入可能会变得更长且更混乱,这可能会对代码的外观产生负面影响,并让辨识代码的来源变得更加困难,更加重要的是代码文件位置变动相对路径就得改变。
使用路径别名即绝对路径导入,不仅解决了理解导入路径的问题,而且还简化了重构期间代码移动的过程,美丽且直观。
// from this
import { SearchForm } from "./../../src/components/searchForm";
// to this
import { SearchForm } from "@src/components/searchForm";
路径别名固然是非常好,但是在项目中却需要在多处指定,即使你的项目足够简单,只要用了 TypeScript 本上也需要指定两次。
例如你使用 Webpack + TypeScript,你需要在 ebpack.config.js
和 tsconfig.json
中分别指定,如果你使用 Vite 也是要在 vite.config.ts
中指定,多处指定就有可能漏写导致出错,当然我们可以通过 tsconfig-paths-webpack-plugin 和 vite-tsconfig-paths 分别来解决别名统一的问题。
但是现在我们有一种无需依赖第三方库即可配置路径别名的方法。此外,这种方法允许使用别名而不需要构建步骤,重要的是一处指定,四处生效。
从 Node.js v12.19.0 开始,开发人员可以使用 Subpath Imports[1] 在 npm 包中声明路径别名。这可以通过 package.json
文件中的 imports
字段来完成。不需要在 npm 上发布包。在任何目录中创建一个 package.json
文件就足够了。因此,这种方法也适用于私人项目。
配置路径别名,假如有项目结构如下:
my-awesome-project
├── src/
│ ├── components/
│ │ └── searchForm/
│ │ └── form/
│ │ └── index.ts
│ ├── pages/
│ │ └── login/
│ │ └── about/
│ │ └── home/
│ └── mock/
│ └── api/
│ └── index.ts
└── package.json
我们可以在 package.json
中这么配置:
{
"name": "my-awesome-project",
"imports": {
"#*": "./*"
}
}
接下来就是愉快的使用了:
import { SearchForm } from "#src/components/searchForm";
别名从未如此简单。
这样设置的原生支持路径别名理论上有以下优点:
Webpack从 v5.0 开始支持[2]导入字段。路径别名无需任何额外配置即可使用。
Vite 4.2.0 版本添加了[3]对导入字段的支持。
目前正在开发 github.com/microsoft/T…[4] 将要作为 5.3 版本的功能发布。
参考资料
[1]
Subpath Imports:https://nodejs.org/api/packages.html#subpath-imports
[2]
支持:https://github.com/webpack/webpack/releases/tag/v5.0.0-beta.31
[3]
添加了:https://github.com/vitejs/vite/pull/7770
[4]
github.com/microsoft/T…:https://github.com/microsoft/TypeScript/pull/55015
[5]
031-imports:https://github.com/epicweb-dev/epic-stack/blob/main/docs/decisions/031-imports.md
[6]
typescript path aliasing is a mistake:https://twitter.com/kentcdodds/status/1695447127533797437
[7]
the-native-way-to-configure-path-aliases-in-frontend-projects:https://betterprogramming.pub/the-native-way-to-configure-path-aliases-in-frontend-projects-5db70f19a6e0