ts-node 是否支持 '@' 样式导入?如果可以,如何设置?
Does ts-node support '@' style import? If so, how to set it up?
我正在使用主 Express 应用程序中的 类 创建一个命令行脚本。
脚本位于文件夹中:
bin/utils/
├── sync-buyers.ts
└── tsconfig.json
主要的 Express 应用程序正在 /app
使用 import '@/foo/bar/thing
。
这个是在主app的tsconfig.json
里面设置的,如下:
"paths": {
"@/*": ["*"],
"*": [
"node_modules/*",
"app/typings/*"
]
}
},
"include": ["app/**/*", "test/**/*"],
"exclude": ["app/**/*.test.ts", "/__tests__/", "/__mocks__/", "/__snapshots__/", "app/**/__mocks__/"],
"files": ["typings/global.d.ts"]
脚本执行
我正在测试是否可以从主应用程序导入,因此我创建了一个 sayHello()
函数。
#!/usr/bin/env ts-node
/* tslint:disable */
import { sayHello } from '../../app/services/v2/oapp';
sayHello();
当我运行它:
TSError: ⨯ Unable to compile TypeScript:
../../app/services/v2/oapp.ts(9,19): error TS2307: Cannot find module
'@/helpers/fetch'.
../../app/services/v2/oapp.ts(10,31): error TS2307: Cannot find module
'@/services/v2/buyer'.
../../app/services/v2/oapp.ts(11,51): error TS2307: Cannot find module
'@/http/HttpHeader'.
总结:
ts-node 支持 '@' 导入方式吗?如果是这样,我该如何设置?
因此 TypeScript paths
配置仅适用于 TypeScript 的类型解析和检查,这意味着它将允许 TypeScript 理解那些仅用于类型检查目的的导入,但它生成的代码不会自动将这些导入重写到正确的位置。
有两种常见的解决方法:
更新节点解析器以理解 TypeScript paths
配置。生成的文件仍将通过它们的 @-name 引用这些路径。
最常见的是,tsconfig-paths
模块用于此。您可以直接从 node
命令中要求该模块:
node -r tsconfig-paths/register main.js
重写生成的文件,以便将 @-names 替换为 "real" 本地相对路径位置。
有一个独立的模块,tspath
- 你只需 运行 tspath
在编译你的 TypeScript 之后,它就会用正确的路径更新生成的文件。
如果您使用的是 Webpack,您还可以使用 tsconfig-paths-webpack-plugin
,它将负责配置 Webpack 的解析器以正确定位那些 @-name 路径。
最后,如果您使用的是 Babel,您可能会对 babel-plugin-module-resolver
感兴趣,它为 Babel 工具链做类似的事情,但这里的缺点是它不读取 paths
来自 tsconfig.json
的配置,所以你基本上必须在这个插件的 alias
配置中复制你的 paths
配置。
如果这是直接使用 tsc
编译的 Node 脚本或服务器,我个人推荐 tsconfig-paths
;如果这是前端 Webpack 构建,我推荐 tsconfig-paths-webpack-plugin
。
我正在使用主 Express 应用程序中的 类 创建一个命令行脚本。
脚本位于文件夹中:
bin/utils/
├── sync-buyers.ts
└── tsconfig.json
主要的 Express 应用程序正在 /app
使用 import '@/foo/bar/thing
。
这个是在主app的tsconfig.json
里面设置的,如下:
"paths": {
"@/*": ["*"],
"*": [
"node_modules/*",
"app/typings/*"
]
}
},
"include": ["app/**/*", "test/**/*"],
"exclude": ["app/**/*.test.ts", "/__tests__/", "/__mocks__/", "/__snapshots__/", "app/**/__mocks__/"],
"files": ["typings/global.d.ts"]
脚本执行
我正在测试是否可以从主应用程序导入,因此我创建了一个 sayHello()
函数。
#!/usr/bin/env ts-node
/* tslint:disable */
import { sayHello } from '../../app/services/v2/oapp';
sayHello();
当我运行它:
TSError: ⨯ Unable to compile TypeScript:
../../app/services/v2/oapp.ts(9,19): error TS2307: Cannot find module
'@/helpers/fetch'.
../../app/services/v2/oapp.ts(10,31): error TS2307: Cannot find module
'@/services/v2/buyer'.
../../app/services/v2/oapp.ts(11,51): error TS2307: Cannot find module
'@/http/HttpHeader'.
总结:
ts-node 支持 '@' 导入方式吗?如果是这样,我该如何设置?
因此 TypeScript paths
配置仅适用于 TypeScript 的类型解析和检查,这意味着它将允许 TypeScript 理解那些仅用于类型检查目的的导入,但它生成的代码不会自动将这些导入重写到正确的位置。
有两种常见的解决方法:
更新节点解析器以理解 TypeScript
paths
配置。生成的文件仍将通过它们的 @-name 引用这些路径。最常见的是,
tsconfig-paths
模块用于此。您可以直接从node
命令中要求该模块:node -r tsconfig-paths/register main.js
重写生成的文件,以便将 @-names 替换为 "real" 本地相对路径位置。
有一个独立的模块,
tspath
- 你只需 运行tspath
在编译你的 TypeScript 之后,它就会用正确的路径更新生成的文件。如果您使用的是 Webpack,您还可以使用
tsconfig-paths-webpack-plugin
,它将负责配置 Webpack 的解析器以正确定位那些 @-name 路径。最后,如果您使用的是 Babel,您可能会对
babel-plugin-module-resolver
感兴趣,它为 Babel 工具链做类似的事情,但这里的缺点是它不读取paths
来自tsconfig.json
的配置,所以你基本上必须在这个插件的alias
配置中复制你的paths
配置。
如果这是直接使用 tsc
编译的 Node 脚本或服务器,我个人推荐 tsconfig-paths
;如果这是前端 Webpack 构建,我推荐 tsconfig-paths-webpack-plugin
。