闭包编译器:它如何决定何时内联?
Closure compiler: How does it decided when to inline?
我正在尝试让闭包编译器在没有任何类型注释的情况下以 SIMPLE 模式内联一些包含在配置对象中的代码。 React does this 并设法降低了包大小
我观察到以下情况:
a.js
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
log('jere');
}
reconciler(config);
}())
编译时returns
a.min.js
(function() {
(function(a) {
a = a.log;
a("jere");
})({
log: function(a) {
console.log(a);
}
});
})();
并且,
b.js
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
c.log('here');
// log('jere');
}
reconciler(config);
}())
编译后给出,
b.min.js
(function() {
console.log("here");
})();
另一方面,
function main(){
const config = {
log: function log(m) {
console.log(m);
}
};
const log = config.log;
log('m');
log('m');
log('m');
log('m');
}
main()
给予
function main() {
console.log("m");
console.log("m");
console.log("m");
console.log("m");
}
main();
Closure Compiler 如何内联?有没有明确的方法让它内联包装函数?
更新:
As suggested,我使用了 --assume_function_wrapper
,它更好地内联了代码。但是如果函数 returns 一个值,CC 无法内联。
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
log('jere');
return {
foo() {
// More side effects
}
}
}
reconciler(config);
}())
没有人回答。编译器使用启发式和副作用计算来决定何时内联。与嵌套范围相比,编译器也不太可能在全局范围内内联。
我正在尝试让闭包编译器在没有任何类型注释的情况下以 SIMPLE 模式内联一些包含在配置对象中的代码。 React does this 并设法降低了包大小
我观察到以下情况:
a.js
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
log('jere');
}
reconciler(config);
}())
编译时returns
a.min.js
(function() {
(function(a) {
a = a.log;
a("jere");
})({
log: function(a) {
console.log(a);
}
});
})();
并且,
b.js
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
c.log('here');
// log('jere');
}
reconciler(config);
}())
编译后给出,
b.min.js
(function() {
console.log("here");
})();
另一方面,
function main(){
const config = {
log: function log(m) {
console.log(m);
}
};
const log = config.log;
log('m');
log('m');
log('m');
log('m');
}
main()
给予
function main() {
console.log("m");
console.log("m");
console.log("m");
console.log("m");
}
main();
Closure Compiler 如何内联?有没有明确的方法让它内联包装函数?
更新:
As suggested,我使用了 --assume_function_wrapper
,它更好地内联了代码。但是如果函数 returns 一个值,CC 无法内联。
(function main() {
const config = {
log(m) {
console.log(m);
}
}
function reconciler(c) {
const log = c.log;
log('jere');
return {
foo() {
// More side effects
}
}
}
reconciler(config);
}())
没有人回答。编译器使用启发式和副作用计算来决定何时内联。与嵌套范围相比,编译器也不太可能在全局范围内内联。