使用esnext模块在Angular 9升级后不再编译Typescript文件

时间:2020-04-27 14:43:56

标签: angular angular9

我在项目的根目录下有一个打字稿文件(git-version.ts),该文件在Jenkins CI管道中用于读取触发CI构建的最新提交/修订(它使用ts-node运行此ts文件)。以下是我的项目结构的一瞥:

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

以前,它曾经在Angular 7上可以很好地工作,但是似乎被Angular 9的笨拙的esnext模块加载器破坏了。当我在当前的angular 9 tsconfig设置中将模块更改为'commonjs'时,它可以正常工作。但是,然后我失去了差异加载功能的优势,因为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:无法在模块外部使用import语句” 。显然,我需要一种使用'commonjs'加载此ts文件,并且仍将'esnext'用于整个应用程序其余部分的方法。

1 个答案:

答案 0 :(得分:2)

由于所讨论的文件位于src文件夹之外,并且可以像您提到的那样与commonjs正常运行,因此很可能是打字稿导入出现问题。

如果您想使用ts-node加载打字稿文件,则可以为特定文件定义其他加载器。像这样:

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

您可以将其添加为npm脚本,并在Jenkins文件内用于CI管道。