闭包编译器:它如何决定何时内联?

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);

}())

没有人回答。编译器使用启发式和副作用计算来决定何时内联。与嵌套范围相比,编译器也不太可能在全局范围内内联。