封闭编译器:如何确定何时内联?

时间:2018-07-17 13:50:23

标签: javascript google-closure-compiler

我正在尝试让闭包编译器以简单模式内联一些包裹在配置对象中的代码,而没有任何类型注释。 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);

}())

编译后返回

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编译器如何内联?有没有确定的方法可以将其用于内联包装函数?

更新: As suggested,我使用了--assume_function_wrapper,它可以更好地内联代码。但是,如果该函数返回值,则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);

}())

1 个答案:

答案 0 :(得分:1)

没有一个答案。编译器使用试探法和副作用计算来决定何时内联。与嵌套作用域相比,编译器在全局作用域内联的可能性也较小。