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 理解那些仅用于类型检查目的的导入,但它生成的代码不会自动将这些导入重写到正确的位置。

有两种常见的解决方法:

  1. 更新节点解析器以理解 TypeScript paths 配置。生成的文件仍将通过它们的 @-name 引用这些路径。

    最常见的是,tsconfig-paths 模块用于此。您可以直接从 node 命令中要求该模块:

    node -r tsconfig-paths/register main.js
    
  2. 重写生成的文件,以便将 @-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