无法使用 ngc 和 tsc 创建 AOT ES5 兼容代码
Unable to create AOT ES5 compatible code using ngc and tsc
我相信在来这里提问之前我已经尝试了几种选择。我有一个 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 的当前行为,我们能否将这些 aot 工厂暴露给 ES5?
是的,鉴于 ngc 的当前行为,您可以将这些 aot 工厂暴露给 ES5。
您不必在 ngc 之后 运行 tsc,因为 ngc 运行s tsc 适合您。您应该在 outDir (out-tsc) 而不是 genDir (aot) 中查看最终结果。如果使用 Angular 5 你甚至看不到那个 aot 目录。
还建议将 "module" 参数设置为 "es2015" 而不是 "commonjs",然后 运行 rollup 进行 tree-shaking 和最终的 es5 捆绑。
您不需要 node_modules/aot 的排除项,因为这些需要与最终包一起编译。
您可以在此处查看带有 ngc 和 rollup 的完整示例:
https://github.com/fintechneo/angular2-templates
目前升级到Angular5,但是如果你看以前的版本可以按照配置回Angular2.
我相信在来这里提问之前我已经尝试了几种选择。我有一个 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 的当前行为,我们能否将这些 aot 工厂暴露给 ES5?
是的,鉴于 ngc 的当前行为,您可以将这些 aot 工厂暴露给 ES5。
您不必在 ngc 之后 运行 tsc,因为 ngc 运行s tsc 适合您。您应该在 outDir (out-tsc) 而不是 genDir (aot) 中查看最终结果。如果使用 Angular 5 你甚至看不到那个 aot 目录。
还建议将 "module" 参数设置为 "es2015" 而不是 "commonjs",然后 运行 rollup 进行 tree-shaking 和最终的 es5 捆绑。
您不需要 node_modules/aot 的排除项,因为这些需要与最终包一起编译。
您可以在此处查看带有 ngc 和 rollup 的完整示例:
https://github.com/fintechneo/angular2-templates
目前升级到Angular5,但是如果你看以前的版本可以按照配置回Angular2.