TypeScript/JavaScript 缩小

TypeScript/JavaScript minification

我有一个用 TypeScript 编写的 Web 应用程序,在某些时候,编译的 .ts 文件的所有输出都将被缩小。

现在,在我的代码中的某个时刻,我做了这样的事情:

class Test {
    testProperty: any;
    constructor() {
        this.getMethods();
    }
    private getMethods(){
        for (var method in this) {
            if (method.endsWith("Method")) {
                alert(method);
            }
        }
    }

    doSomethingMethod(){}
}

var x = new Test();

虽然我自己没有做过任何测试,但根据我所读到的 (this blog post, the first comment of this SO answer ),在缩小时,所有函数名称、属性等都会被更改。

.ts 文件输出的缩小会改变这种获取方法名称的方式吗?它取决于缩小的类型吗?

编辑:我在缩小器 (jscompress.com) 中引入了上面 .ts 文件的输出,结果如下:

var Test=function(){function t(){this.getMethods()}return t.prototype.getMethods=function(){for(var t in this)t.endsWith("Method")&&alert(t)},t.prototype.doSomethingMethod=function(){},t}(),x=new Test;

如您所见,此缩小版本不会影响变量名称,并且代码保留了其预期功能。

我想知道的是:是否有可以改变对象命名的缩小工具?

缩小器不会更改公开可用的名称,它只会更改在范围内隔离的名称,以便无法从外部代码访问它们。缩小后的代码在功能上应该是等效的。

如您在示例中所见,缩小器并未更改全局变量,例如 Test,但它已将局部变量 method 更改为 t

Minifiers 通常不会更改可在当前闭包外访问的变量名。这可能会导致问题,例如,如果您在一个文件中定义 Test class,而在它之外您尝试使用相同的名称 Test.

来调用它

因此,例如,以下代码的缩小版本:

function myFunction() {
  var myVariable = 'hello world';
  alert(myVariable);
}

myFunction();

将缩小为:

function myFunction(){var n="hello world";alert(n)}myFunction();

变量myVariable被重命名为n,因为它不能在函数外部访问,但是myFunction继续使用它的名字以确保它可以在任何地方访问。

如果你知道这个函数不会在其他地方被调用,你可以把它放在一个闭包中,像这样:

(function() {
  function myFunction() {
    var myVariable = 'hello world';
    alert(myVariable);
  }

  myFunction();
})()

// myFunction won't be accessible here

那么您的代码将被缩小为:

!function(){function l(){var l="hello world";alert(l)}l()}();

正如其他答案中所述 - 大多数 JavaScript 压缩器不会更改公开可用符号的名称,因为它可能会破坏外部代码。

但是,一些压缩器提供了更激进的压缩模式,这些模式实际上可能会重命名可能对外部范围可见的符号,除非您使用特殊注释或其他一些技术来保护它们。例如,查看高级编译模式下的 Google Closure 编译器 - https://developers.google.com/closure/compiler/docs/api-tutorial3