0

我正在使用主快递应用程序中的类创建一个命令行脚本。

脚本位于文件夹中:

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 是否支持 '@' 样式的导入?如果是这样,我该如何设置?

4

1 回答 1

1

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

解决这个问题有两种常见的方法:

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

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

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

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

    如果你使用的是 Webpack,你也可以使用tsconfig-paths-webpack-plugin,它将负责配置 Webpack 的解析器以正确定位那些 @-name 路径。

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

我个人建议这是直接tsconfig-paths编译的 Node 脚本或服务器,以及前端 Webpack 构建。tsctsconfig-paths-webpack-plugin

于 2019-02-08T08:34:21.827 回答