Module 的加載實現

<!-- 頁面內嵌的腳本 -->
<script type="application/javascript">
  // module code
</script>

<!-- 外部腳本 -->
<script type="application/javascript" src="path/to/myModule.js">
</script>

兩種異步加載的語法。

<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>

 deferasync的區別是:defer要等到整個頁面在內存中正常渲染結束(DOM 結構完全生成,以及其他腳本執行完成),纔會執行;async一旦下載完,渲染引擎就會中斷渲染,執行這個腳本以後,再繼續渲染。一句話,defer是“渲染完再執行”,async是“下載完就執行”。另外,如果有多個defer腳本,會按照它們在頁面出現的順序加載,而多個async腳本是不能保證加載順序的。

瀏覽器加載 ES6 模塊,也使用<script>標籤,但是要加入type="module"屬性。

<script type="module" src="./foo.js"></script>

 

覽器加載 ES6 模塊,也使用<script>標籤,但是要加入type="module"屬性。

<script type="module" src="./foo.js"></script>

上面代碼在網頁中插入一個模塊foo.js,由於type屬性設爲module,所以瀏覽器知道這是一個 ES6 模塊。

瀏覽器對於帶有type="module"<script>,都是異步加載,不會造成堵塞瀏覽器,即等到整個頁面渲染完,再執行模塊腳本,等同於打開了<script>標籤的defer屬性。

<script type="module" src="./foo.js"></script>
<!-- 等同於 -->
<script type="module" src="./foo.js" defer></script>

如果網頁有多個<script type="module">,它們會按照在頁面出現的順序依次執行。

<script>標籤的async屬性也可以打開,這時只要加載完成,渲染引擎就會中斷渲染立即執行。執行完成後,再恢復渲染。

<script type="module" src="./foo.js" async></script>

一旦使用了async屬性,<script type="module">就不會按照在頁面出現的順序執行,而是隻要該模塊加載完成,就執行該模塊。

ES6 模塊也允許內嵌在網頁中,語法行爲與加載外部腳本完全一致。

<script type="module">
  import utils from "./utils.js";

  // other code
</script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章