Typescript 文件停止转译 post Angular 9 使用 esnext 模块升级

Typescript file stopped getting transpiled post Angular 9 upgrade with esnext module

我在项目的根位置有一个打字稿文件 (git-version.ts),它在 Jenkins CI 管道中用于读取最新的 commit/revision 触发了 CI 构建(它使用 ts-node 来 运行 这个 ts 文件)。下面是我的项目结构的一瞥:

root
 |_src/
 |_angular.json
 |_git-version.ts
 |_package.json
 |_tsconfig.json

以前它在 Angular 7 上工作得很好,但似乎在 Angular 9 的默认 esnext 模块加载器上坏了。当我将我的模块更改为 'commonjs' 时当前 angular 9 tsconfig 设置,它工作得很好。但是,我失去了差异加载功能的优势,因为 commnjs 倾向于为我的整个应用程序创建一个包。所以,我不得不切换回 'esnext'。以下是我当前的 tsconfig.json 设置:

{
  "compileOnSave": false,
  "compilerOptions": {
    "downlevelIteration": true,
    "importHelpers": true,
    "module": "esnext",
    "outDir": "./dist/out-tsc",
    "baseUrl": "src",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es2015",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2016",
      "dom"
    ]
  },
  "angularCompilerOptions": {
    "enableIvy": true
  }
}

我也试过把说的ts文件的扩展名改成js,但是又开始抛异常,"SyntaxError: Cannot use import statement outside a module"。显然,我需要一种方法来使用 'commonjs' 加载此 ts 文件,并且仍然对整个应用程序的其余部分使用 'esnext'。

由于有问题的文件在您的 src 文件夹之外,并且如您所提到的,它与 commonjs 一起工作正常,很可能是 typescript 导入问题。

如果您愿意使用 ts-node 加载打字稿文件,您可以为特定文件定义不同的加载器。像这样:

ts-node -O '{\"module\": \"commonjs\"}' git.version.ts

您可以将其添加为 npm 脚本并在 Jenkinsfile 中用于您的 CI 管道。