ts-node支持'@'样式导入吗?如果是这样,如何设置?

时间:2019-02-08 05:08:04

标签: javascript typescript ts-node

我正在使用主要Express应用程序中的类创建命令行脚本。

脚本位于文件夹中:

bin/utils/
├── sync-buyers.ts
└── tsconfig.json

主要的快速应用在/app中使用import '@/foo/bar/thing

这是在主应用程序的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是否支持“ @”导入样式?如果是这样,我该如何设置?

2 个答案:

答案 0 :(得分:1)

因此TypeScript paths配置仅适用于TypeScript的类型解析和检查,这意味着它将允许TypeScript仅出于类型检查的目的而理解那些导入,但其生成的代码不会自动重写这些导入到正确的位置。

有两种常见的解决方法:

  1. 更新节点解析器以了解TypeScript paths配置。生成的文件仍将通过其@名称引用这些路径。

    通常,tsconfig-paths模块用于此目的。您可以直接通过node命令要求该模块:

    node -r tsconfig-paths/register main.js
    
  2. 重写生成的文件,以便将@名称替换为“真实”的本地相对路径位置。

    有一个tspath的独立模块-您只需在编译TypeScript之后运行tspath,它就会使用正确的路径更新生成的文件。

    如果您使用的是Webpack,还可以使用tsconfig-paths-webpack-plugin,它将用于配置Webpack的解析器以正确定位那些@名称路径。

    最后,如果您使用的是Babel,您可能会对babel-plugin-module-resolver感兴趣,它对Babel工具链也有类似的作用,但是缺点是它不会读取paths的配置tsconfig.json,因此您基本上必须在此插件的paths配置中复制alias配置。

如果是直接使用tsconfig-paths编译的Node脚本或服务器,如果是前端Webpack构建的,则我建议使用tsc

答案 1 :(得分:1)

使用tsmon

的简短答案
tsmon bin/utils/sync-buyers.ts