Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 试图用tsickle/Close编译angular5项目,我得到;goog.module的正文不能引用此内容。”;_Javascript_Angular_Typescript_Tsickle - Fatal编程技术网

Javascript 试图用tsickle/Close编译angular5项目,我得到;goog.module的正文不能引用此内容。”;

Javascript 试图用tsickle/Close编译angular5项目,我得到;goog.module的正文不能引用此内容。”;,javascript,angular,typescript,tsickle,Javascript,Angular,Typescript,Tsickle,我正试图用谷歌闭包编译一个相对复杂的angular5项目 首先,我使用将代码编译成谷歌闭包友好的语法,然后尝试使用谷歌闭包创建最终的包 不幸的是,tsickle似乎创建了一个与google闭包不兼容的模块格式,对于我拥有的所有模块,我都会得到以下错误: ./path/to/my.component.js:8: ERROR - The body of a goog.module cannot reference this. var __metadata = (this && thi

我正试图用谷歌闭包编译一个相对复杂的angular5项目

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

不幸的是,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) {
然而,考虑到最近使用angular5的ngc->tsickle开关有助于构建闭包的意图,我认为它应该能够工作

检查一下我的
路径/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;
};
google.module('target.path.to.MyComponent');var module=module |{id:'target/path/to/MyComponent.js'};
var _decoration=(this&&this._decoration)| |函数(decorators、target、key、desc){
var c=arguments.length,r=c<3?目标:desc==null?desc=Object.getOwnPropertyDescriptor(目标,键):desc,d;
if(typeof Reflect==“object”&&typeof Reflect.decoration==“function”)r=Reflect.decoration(decorators、target、key、desc);
如果(d=decorators[i])r=(c<3?d(r):c>3?d(target,key,r):d(target,key))| r;
返回c>3&&r&&Object.defineProperty(target,key,r),r;
};
似乎,typescript编译器(由tsickle内部调用)将此代码放在所有模块之前,它在tsickle不知情的情况下执行此操作,并且使模块格式与google闭包不兼容


怎么办?如何解决这个问题?

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

Typescript创建此标头基本上是为了解决缺少某些反射支持的问题。它将这个东西包含在所有的.js文件中,这些文件仍然没有使用,只会增加最终捆绑包的大小

在“旧”时代(angular 2.x-4),这个代码片段没有引起问题。但它与google闭包不兼容,因为它的模块格式不允许直接使用模块中的
这个

TypeScript可以选择使用关闭此功能

--noEmitHelpers=true
旗帜。由于
tsickle
在参数处理方面不是很强,最好插入一个

"noEmitHelpers": true,
进入您的
tsconfig.json