TypeScript 导入路径别名
TypeScript Import Path Alias
我目前正在开发一个 TypeScript 应用程序,它由多个用 TypeScript 编写的 Node 模块组成,安装在 node_modules
目录中。
在继续之前,我想指出我使用的是 TypeScript 2.0,如果需要的话,我并不反对使用 2.1 开发版本。我只是想让它正常工作。
每个 Node 模块的结构大致如下:
dist/
es2015/
index.js
utils/
Calculator.js
Calculator.d.ts
Date.js
Date.d.ts
Flatpack.js
Flatpack.d.ts
src/
index.ts
utils/
Calculator.ts
Date.ts
Flatpack.ts
dist 文件夹是生成的源,此路径是使用我的 tsconfig.json
文件中的 outDir
配置的。我还将 package.json
中的 main
属性 配置为 dist/es2015/index.js
.
重要注意事项:
- 在我的项目中,我使用
moduleResolution
类型的 node
- 我正在使用 TypeScript 2.0
- 我不是在问如何从包中导入文件。我正在通过 Npm 安装包,然后通过
packagename/
从使用此模块的应用程序中导入它。
现在我的 question/issue 来了。从该模块导入文件时,我希望能够这样做:
import {Sin, Cos, Tan} from "common-utils/utils/Calculator";
但是,文件无法解析到 dist/es2015/utils
目录。理想情况下,我希望我的导入从这个特定的 dist
文件夹而不是从根目录解析,这似乎正在发生。
上面的导入需要写成下面这样才能工作:
import {Sin, Cos, Tan} from "common-utils/dist/es2015/utils/Calculator";
然而,每次写 dist/es2015
并不理想,它只会让一些导入看起来很长。有没有一种方法可以配置我的模块以解析到 dist/es2015
目录?我不想在我的项目中放置覆盖,理想情况下每个模块都会指定从哪里解析文件。
如果您在创建要与 Jspm 一起使用的 plugin/module 时仍然不确定我在 Jspm 中的要求(如果这令人困惑,我深表歉意),您可以在 package.json
模块如下所示:
"jspm": {
"registry": "npm",
"jspmPackage": true,
"main": "my-module",
"format": "amd",
"directories": {
"dist": "dist/amd"
},
我正在寻找 TypeScript 中的上述等价物(如果存在)。映射指令,因此当最终用户运行 npm install my-cool-package
然后在他们的应用程序中尝试导入某些内容时,默认情况下所有导入都会解析到 commonjs
目录(上面的 Jspm 示例使用 amd,但前提相同).
这可能吗,还是我误解了什么?我知道最新版本中添加了一些新的路径映射功能,但几乎没有关于使用它们的文档。
所以看了你的评论后,我意识到我误解了你的问题!如果您想从导入包的角度控制路径,只需将 package.json
的 main
属性 设置为正确表示模块对象图的文件。
{
"main": "common-utils/dist/es2015/index.js"
}
如果您试图从项目的角度控制导入路径,您正在寻找的是 TypeScript 2 用于模块解析的新路径映射功能。您可以通过如下配置 tsconfig.json
来启用路径映射:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"angular2/*": ["../path/to/angular2/*"],
"local/*": ["../path/to/local/modules/*"]
}
}
}
然后,在您的 TypeScript 文件中,您可以像这样导入模块:
import { bootstrap } from 'angular2/bootstrap';
import { module } from 'local/module';
有关 TypeScript 2 中路径映射功能的更多详细信息,请参阅 this Github issue。
对于您的情况,我认为以下配置应该有效:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"common-utils/utils/*": ["./node_modules/common-utils/dist/es2015/utils/*"]
}
}
}
如果您使用的是路径,您需要将绝对路径改回相对路径,以便在使用 tsc
.
将打字稿编译成普通 javascript 后,它才能正常工作
到目前为止,最受欢迎的解决方案是 tsconfig-paths。
我已经试过了,但它对我复杂的设置不起作用。
此外,它在 运行 时间内解析路径,这意味着包大小和解析性能方面的开销。
所以,我自己写了一个解决方案,tscpaths。
我会说它总体上更好,因为它在编译时替换了路径。这意味着没有 运行 时间依赖性或任何性能开销。使用起来非常简单。您只需要在 package.json
.
中的构建脚本中添加一行
这个项目还很年轻,所以如果您的设置非常复杂,可能会出现一些问题。
尽管我的设置相当复杂,但它对我的设置完美无缺。
我目前正在开发一个 TypeScript 应用程序,它由多个用 TypeScript 编写的 Node 模块组成,安装在 node_modules
目录中。
在继续之前,我想指出我使用的是 TypeScript 2.0,如果需要的话,我并不反对使用 2.1 开发版本。我只是想让它正常工作。
每个 Node 模块的结构大致如下:
dist/
es2015/
index.js
utils/
Calculator.js
Calculator.d.ts
Date.js
Date.d.ts
Flatpack.js
Flatpack.d.ts
src/
index.ts
utils/
Calculator.ts
Date.ts
Flatpack.ts
dist 文件夹是生成的源,此路径是使用我的 tsconfig.json
文件中的 outDir
配置的。我还将 package.json
中的 main
属性 配置为 dist/es2015/index.js
.
重要注意事项:
- 在我的项目中,我使用
moduleResolution
类型的node
- 我正在使用 TypeScript 2.0
- 我不是在问如何从包中导入文件。我正在通过 Npm 安装包,然后通过
packagename/
从使用此模块的应用程序中导入它。
现在我的 question/issue 来了。从该模块导入文件时,我希望能够这样做:
import {Sin, Cos, Tan} from "common-utils/utils/Calculator";
但是,文件无法解析到 dist/es2015/utils
目录。理想情况下,我希望我的导入从这个特定的 dist
文件夹而不是从根目录解析,这似乎正在发生。
上面的导入需要写成下面这样才能工作:
import {Sin, Cos, Tan} from "common-utils/dist/es2015/utils/Calculator";
然而,每次写 dist/es2015
并不理想,它只会让一些导入看起来很长。有没有一种方法可以配置我的模块以解析到 dist/es2015
目录?我不想在我的项目中放置覆盖,理想情况下每个模块都会指定从哪里解析文件。
如果您在创建要与 Jspm 一起使用的 plugin/module 时仍然不确定我在 Jspm 中的要求(如果这令人困惑,我深表歉意),您可以在 package.json
模块如下所示:
"jspm": {
"registry": "npm",
"jspmPackage": true,
"main": "my-module",
"format": "amd",
"directories": {
"dist": "dist/amd"
},
我正在寻找 TypeScript 中的上述等价物(如果存在)。映射指令,因此当最终用户运行 npm install my-cool-package
然后在他们的应用程序中尝试导入某些内容时,默认情况下所有导入都会解析到 commonjs
目录(上面的 Jspm 示例使用 amd,但前提相同).
这可能吗,还是我误解了什么?我知道最新版本中添加了一些新的路径映射功能,但几乎没有关于使用它们的文档。
所以看了你的评论后,我意识到我误解了你的问题!如果您想从导入包的角度控制路径,只需将 package.json
的 main
属性 设置为正确表示模块对象图的文件。
{
"main": "common-utils/dist/es2015/index.js"
}
如果您试图从项目的角度控制导入路径,您正在寻找的是 TypeScript 2 用于模块解析的新路径映射功能。您可以通过如下配置 tsconfig.json
来启用路径映射:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"angular2/*": ["../path/to/angular2/*"],
"local/*": ["../path/to/local/modules/*"]
}
}
}
然后,在您的 TypeScript 文件中,您可以像这样导入模块:
import { bootstrap } from 'angular2/bootstrap';
import { module } from 'local/module';
有关 TypeScript 2 中路径映射功能的更多详细信息,请参阅 this Github issue。
对于您的情况,我认为以下配置应该有效:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"common-utils/utils/*": ["./node_modules/common-utils/dist/es2015/utils/*"]
}
}
}
如果您使用的是路径,您需要将绝对路径改回相对路径,以便在使用 tsc
.
到目前为止,最受欢迎的解决方案是 tsconfig-paths。
我已经试过了,但它对我复杂的设置不起作用。 此外,它在 运行 时间内解析路径,这意味着包大小和解析性能方面的开销。
所以,我自己写了一个解决方案,tscpaths。
我会说它总体上更好,因为它在编译时替换了路径。这意味着没有 运行 时间依赖性或任何性能开销。使用起来非常简单。您只需要在 package.json
.
这个项目还很年轻,所以如果您的设置非常复杂,可能会出现一些问题。 尽管我的设置相当复杂,但它对我的设置完美无缺。