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
我有一个用 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