7

闭包编译器内联一个函数,但如果该函数没有内联,代码大小会更小(我只关心代码大小 - 这是针对JS1k的)。我可以告诉编译器我不想内联该函数吗?

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

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

a画布上下文中的位置。因为代码里的s太多a.lineTo了,使用这个函数是值得的。像这样,我的代码是 1019 字节(所有的lineTos 都替换为a.lineTo)。如果我将功能更改为:

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

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

4

2 回答 2

4

教程

如果...您发现 Closure Compiler 正在删除您想要保留的函数,有两种方法可以防止:
* 将您的函数调用移动到 Closure Compiler 处理的代码中。
* 导出您想要保留的符号。

您可能想要第二个,在这里讨论,但基本上归结为将其显式设置为window属性:

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

对于您的 JS1k 提交,您只需将最后一行去掉,因为它是不需要的。请注意,Closure 仍然会重命名函数,但是当它开始使用名称重命名符号a并从那里继续时,它不太可能使您的名称整体更长

您可以使用在线编译器服务进行尝试。如果将其粘贴到:

// ==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;
于 2010-11-28T16:24:03.460 回答
2

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

在您的原始示例中,您只需要在不应内联的函数前面添加带有此注释的 jsdoc:

/** @noinline */
function hello(name) {
  alert('Hello, ' + name);
}
hello('New user');
于 2020-09-19T21:47:39.593 回答