上一章介紹了模塊的語法次哈,本章介紹如何在瀏覽器和 Node 之中加載 ES6 模塊,以及實(shí)際開發(fā)中經(jīng)常遇到的一些問題(比如循環(huán)加載)。
1 瀏覽器加載
defer與async的區(qū)別是:defer要等到整個(gè)頁面在內(nèi)存中正常渲染結(jié)束(DOM 結(jié)構(gòu)完全生成正歼,以及其他腳本執(zhí)行完成),才會執(zhí)行拷橘;async一旦下載完局义,渲染引擎就會中斷渲染,執(zhí)行這個(gè)腳本以后冗疮,再繼續(xù)渲染萄唇。一句話,defer是“渲染完再執(zhí)行”术幔,async是“下載完就執(zhí)行”另萤。另外,如果有多個(gè)defer腳本诅挑,會按照它們在頁面出現(xiàn)的順序加載四敞,而多個(gè)async腳本是不能保證加載順序的。
2 加載規(guī)則
瀏覽器加載 ES6 模塊拔妥,也使用<script>標(biāo)簽忿危,但是要加入type="module"屬性。
瀏覽器對于帶有type="module"的<script>没龙,都是異步加載癌蚁,不會造成堵塞瀏覽器,即等到整個(gè)頁面渲染完兜畸,再執(zhí)行模塊腳本努释,等同于打開了<script>標(biāo)簽的defer屬性。
<script type="module" src="./foo.js"></script>
<!-- 等同于 -->
<script type="module" src="./foo.js" defer></script>
如果網(wǎng)頁有多個(gè)<script type="module">咬摇,它們會按照在頁面出現(xiàn)的順序依次執(zhí)行伐蒂。
ES6 模塊也允許內(nèi)嵌在網(wǎng)頁中,語法行為與加載外部腳本完全一致肛鹏。
<script type="module">
import utils from "./utils.js";
// other code
</script>