是否可以让 Google Closure 编译器*不*内联某些函数?

2024-04-02

闭包编译器正在内联一个函数,但如果该函数未内联,则代码大小会更小(我只关心代码大小 - 这是为了JS1k http://js1k.com/2010-xmas/)。我可以告诉编译器我不想内联该函数吗?

Edit:为了更好地解释一下,这是我的功能:

function lineTo(x,y) {
  a.lineTo(x,y);
}

where a在画布上下文中。因为有太多a.lineTos 在代码中,使用这个函数是值得的。像这样,我的代码是 1019 字节(以及所有lineTos 被替换为a.lineTo)。如果我将函数更改为:

function lineTo(x,y) {
  a.lineTo(x,y);
  console.log();
}

新行以某种方式强制编译器不内联此函数,这给了我 993 个字节。所以如果我能摆脱console.log();我会再节省 14 个字节。


From 教程 http://code.google.com/closure/compiler/docs/api-tutorial3.html:

如果...您发现闭包编译器正在删除您想要保留的函数,有两种方法可以防止这种情况:
* 将函数调用移至闭包编译器处理的代码中。
* 导出您想要保留的符号。

您可能想要第二个,即在这里讨论 http://code.google.com/closure/compiler/docs/api-tutorial3.html#export,但基本上归结为明确将其设置为window财产:

function foo() {
}
window['foo'] = foo;

对于您的 JS1k 提交,您只需保留最后一行即可,因为它是不需要的。请注意,闭包仍然会重命名该函数,但当它开始使用名称重命名您的符号时a从那里继续,你不太可能出名longer全面的。

你可以尝试一下在线编译服务 http://closure-compiler.appspot.com/home。如果您将其粘贴到:

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

是否可以让 Google Closure 编译器*不*内联某些函数? 的相关文章