是否有可能使Google Closure编译器*不*内联某些函数?

时间:2010-11-28 16:15:55

标签: javascript google-closure-compiler js1k

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个字节。

2 个答案:

答案 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)

这是一个古老的问题,但是从v20180101开始,Google Closure Compiler具有防止内联的注释:@noinline

在原始示例中,您需要做的是在不应内联的函数之前添加带有此批注的jsdoc:

Add-Member