尝试用tsickle / closure编译angular5项目,我得到了#34; goog.module的主体不能引用它。"

时间:2017-11-23 17:51:24

标签: javascript angular typescript tsickle

我正在尝试用谷歌关闭来编译一个相对复杂的angular5项目。

首先,我使用tsickle将代码编译成谷歌封闭友好语法,然后我尝试使用谷歌闭包创建最终捆绑。

不幸的是,tsickle似乎创建了一个与google闭包不兼容的模块格式,我得到了以下所有模块的错误:

./path/to/my.component.js:8: ERROR - The body of a goog.module cannot reference this.
var __metadata = (this && this.__metadata) || function (k, v) {

然而,考虑到最近ngc的意图 - >带有angular5的tsickle开关可以帮助闭合构建,我认为它应该可以工作。

稍微检查一下path/to/component.js,我在开始时发现了这一点:

goog.module('target.path.to.MyComponent');var module = module || {id: 'target/path/to/MyComponent.js'};
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};

看来,打字稿编译器(由tsickle内部调用)将此代码放在 all 模块之前,它是在没有tsickle知识的情况下完成的,它使模块格式与之不兼容谷歌关闭!

怎么办?如何解决它?

1 个答案:

答案 0 :(得分:1)

经过几个小时的谷歌搜索,包括一些挖掘tsc源代码,我找到了解决方案。

Typescript创建此标头主要是为了缺少一些反射支持的解决方法。它包含了所有未使用的.js文件,只增加了最终包的大小。

在&#34; old&#34; ngc时代(角度2.x - 4),此代码片段没有引起问题。但它与谷歌关闭不兼容,因为它的模块格式不允许直接使用模块中的this

TypeScript可以选择使用

关闭此功能
--noEmitHelpers=true

标记。由于tsickle在参数处理方面不是很强,所以最好插入

"noEmitHelpers": true,

进入tsconfig.json