无法使用ngc和tsc创建AOT ES5兼容代码

时间:2017-11-24 15:23:47

标签: angular typescript aot

我相信在来这里询问查询之前我已经尝试了几个选项。我有一个angular2库,我使用ngc编译了AOT。我使用普通的npm脚本,目前没有webpack。下面是使用的tsconfig,



{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "lib": ["dom","es2015"],
    "outDir": "tsc-out"
  },
  "compileOnSave": true,
  "exclude": [
    "node_modules/*",
    "aot/",
    "app/boot-aot.ts"
  ],
  "angularCompilerOptions": {
    "genDir": "aot/",
    "strictMetadataEmit" : true
  }
}




执行ngc会产生一个名为" aot"的文件夹。它还有一个" node_modules"文件夹如下

aot文件夹内容

app
node_modules
 @angular
 @ngbootstrap 
 rxjs

到目前为止,工厂看起来还不错,但它们是ts文件。但是我打算在这个输出上做一个tsc,这样我就可以在原生的ES5环境中使用这些工厂了。所以我想我可以使用不同的tsconfig文件在这个文件夹上运行一个tsc。

此步骤不会生成node_modules文件夹。由于这个原因,一些生成的工厂文件不正确,因为它仍然引用了应该生成的node_modules文件夹。例如,生成的app.module.ngfactory.js(内部app文件夹)具有类似的引用,

var import59 = require("../node_modules/@ng-bootstrap/ng-
bootstrap/tooltip/tooltip.ngfactory");
var import60 = require("../node_modules/@ng-bootstrap/ng-
bootstrap/typeahead/typeahead-window.ngfactory");

我在这里搞砸了什么?我尝试了几种不同的组合,但似乎我在这里缺少一些信息。考虑到ngc和tsc的当前行为,我们可以将这些工厂暴露给ES5吗?

1 个答案:

答案 0 :(得分:2)

是的,考虑到ngc的当前行为,你可以将这些工厂暴露给ES5。

你不必在ngc之后运行tsc,因为ngc会为你运行tsc。您应该在outDir(out-tsc)而不是genDir(aot)中查看最终结果。如果使用Angular 5你甚至看不到那个dir。

还建议将“模块”参数设置为“es2015”而不是“commonjs”,然后运行汇总以进行树状抖动和最终es5捆绑。

您不需要node_modules / aot的排除项,因为这些需要使用最终的bundle进行编译。

您可以在此处查看包含ngc和汇总的完整示例:

https://github.com/fintechneo/angular2-templates

目前升级到Angular 5,但是如果你看一下以前的版本,你可以按照配置回到Angular 2。