Closure编译器正在内联函数,但如果没有内联函数,代码大小会更小(我只关心代码大小 - 这是JS1k)。我可以告诉编译器我不希望内联函数吗?
编辑:为了更好地解释一下,这是我的功能:
function lineTo(x,y) {
a.lineTo(x,y);
}
画布上下文中的a
。因为代码中有这么多a.lineTo
s,所以使用这个函数是值得的。像这样,我的代码是1019个字节(所有lineTo
都被a.lineTo
替换)。如果我将功能更改为:
function lineTo(x,y) {
a.lineTo(x,y);
console.log();
}
新行以某种方式强制编译器不内联此函数,这给了我993个字节。所以,如果我能摆脱console.log();
,我将另外保存14个字节。
答案 0 :(得分:4)
来自the tutorial:
如果......你发现Closure Compiler正在删除你想要保留的函数,有两种方法可以防止这种情况:
*将函数调用移动到Closure Compiler处理的代码中。
*导出要保留的符号。
您可能想要第二个,即discussed here,但基本上归结为明确将其设置为window
属性:
function foo() {
}
window['foo'] = foo;
对于您的JS1k提交,您只需关闭最后一行,因为它不需要。请注意,Closure仍然会重命名该功能,但是当它开始重命名名称为a
的符号并从那里继续时,它不太可能使您的名字更长。
您可以使用online compiler service进行试用。如果您将其粘贴到:
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// ==/ClosureCompiler==
// ADD YOUR CODE HERE
function hello(name) {
alert('Hello, ' + name);
}
hello('New user');
...编译结果为
alert("Hello, New user");
但是如果你添加
window['hello'] = hello;
...到最后,编译结果为:
function a(b){alert("Hello, "+b)}a("New user");window.hello=a;
答案 1 :(得分:1)