首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图用tsickle/闭包编译angular5项目时,我得到了“goog.module的主体不能引用它”。

试图用tsickle/闭包编译angular5项目时,我得到了“goog.module的主体不能引用它”。
EN

Stack Overflow用户
提问于 2017-11-23 17:51:23
回答 1查看 184关注 0票数 0

我试图编译一个相对复杂的angular5项目与谷歌关闭。

首先,我使用茶匙将代码编译成对google闭包友好的语法,然后尝试使用google闭包来创建最后的包。

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

代码语言:javascript
复制
./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 -> tsickle与angular5的切换的意图,以帮助关闭建设,我认为它应该是可行的。

检查一下我的path/to/component.js,我在一开始就发现了这个:

代码语言:javascript
复制
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内部调用)将此代码放在所有模块之前,它在不了解tsickle的情况下这样做,使得模块格式与google闭包不兼容!

该怎么办呢?怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-23 17:51:23

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

由于缺少一些反射支持,类型记录创建这个标题本质上是一种解决办法。它将此内容包含到所有的..js文件中,这些文件仍然未使用,只会增加最终包的大小。

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

TypeScript可以使用

代码语言:javascript
复制
--noEmitHelpers=true

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

代码语言:javascript
复制
"noEmitHelpers": true,

进入你的tsconfig.json

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47461124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档