Typescript 和 Google 关闭

2024-02-21

我使用 Typescript 命令 (tsc) 创建一个包含所有平台类的 Javascript 文件。

tsc "./Main.ts" -out "./script/myProject_debug.js" --declarations

然后,我想用 Google Closure (compiler.jar) 混淆这个文件,如下所示:

java -jar ./compiler/compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js "./script/myProject_debug.js" > "./script/myProject.js".

但是,当我执行生成的混淆/优化代码时,出现以下错误:未捕获的类型错误:无法读取未定义的属性“原型”

它匹配以下非混淆的 JS 代码(由 tsc 命令生成):

var __extends = this.__extends || function (d, b) {
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
}

这部分用于翻译“extends”Typescript 关键字,而 b 的等效项未定义。

有没有人遇到类似的错误或/并获得解决方案,以便能够使用 Typescript 编译文件来混淆 Google Closure?

我尝试使用 uglifyjs 命令,输出文件工作正常,但我想要完全混淆(类、参数、变量、方法等)。此外,Google Closure 提供的额外优化也将受到欢迎。

感谢您!


的定义__extends存在很可能导致您看到的错误的问题。

var __extends = this.__extends || function (d, b) { ... };

The this.__extends参考的含义与window.__extends,但是闭包编译器不知道(或者甚至尝试)意识到对this在全球范围内实际上是window目的。编译为--warning_level=VERBOSE编译器将发出警告:

Dangerous use of the global this object at line 1 character 16
var __extends = this.__extends || function (d, b) {
                ^

除此之外this.__extends是对外部/未定义属性的引用,编译器也会对此发出警告VERBOSE level.

我已经修改并注释了定义,以便在没有警告的情况下使用闭包编译器服务 UI http://closure-compiler.appspot.com/home:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @warning_level VERBOSE
// @output_file_name default.js
// @formatting pretty_print
// ==/ClosureCompiler==

var __extends = window['__extends'] || function (d, b) {
  /** @constructor */
  function __() { this.constructor = d; }
  __.prototype = b.prototype;
  d.prototype = new __();
}

/**
 * @constructor
 * @extends {String}
 */
function foo2() {this.foo = 'bar'; }
__extends(foo2, String);

var bar2 = new foo2;
alert(bar2.toLowerCase);

修改编译后的代码的 JSFiddle http://jsfiddle.net/wXBLB/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 和 Google 关闭 的相关文章