<!-- 頁面內嵌的腳本 -->
<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>
defer
與async
的區別是: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>