簡體   English   中英

封閉編譯器:如何確定何時內聯?

[英]Closure compiler: How does it decided when to inline?

我試圖讓閉包編譯器以簡單模式內聯一些包裹在配置對象中的代碼,而沒有任何類型注釋。 React做到了這一點,並設法降低了捆綁包的大小

我觀察到以下幾點:

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編譯器如何內聯? 是否有確定的方法可以將其用於內聯包裝函數?

更新: 根據建議 ,我使用了--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);

}())

沒有答案。 編譯器使用試探法和副作用計算來決定何時內聯。 與嵌套作用域相比,編譯器在全局作用域內聯的可能性也較小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM