ç°ä»£çç½ç«ä¸ï¼èæ¬å¾å¾æ¯ HTML æ´âéâï¼å®ä»¬ç大å°é常æ´å¤§ï¼å¤çæ¶é´ä¹æ´é¿ã
彿µè§å¨å è½½ HTML æ¶éå° <script>...</script> æ ç¾ï¼æµè§å¨å°±ä¸è½ç»§ç»æå»º DOMãå®å¿
é¡»ç«å»æ§è¡æ¤èæ¬ã对äºå¤é¨èæ¬ <script src="..."></script> 乿¯ä¸æ ·çï¼æµè§å¨å¿
é¡»çèæ¬ä¸è½½å®ï¼å¹¶æ§è¡ç»æï¼ä¹åæè½ç»§ç»å¤çå©ä½ç页é¢ã
è¿ä¼å¯¼è´ä¸¤ä¸ªéè¦çé®é¢ï¼
- èæ¬ä¸è½è®¿é®å°ä½äºå®ä»¬ä¸é¢ç DOM å ç´ ï¼å æ¤ï¼èæ¬æ æ³ç»å®ä»¬æ·»å å¤çç¨åºçã
- 妿页é¢é¡¶é¨æä¸ä¸ªç¬¨éçèæ¬ï¼å®ä¼âé»å¡é¡µé¢âãå¨è¯¥èæ¬ä¸è½½å¹¶æ§è¡ç»æåï¼ç¨æ·é½ä¸è½çå°é¡µé¢å 容ï¼
<p>...content before script...</p>
<script src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script>
<!-- This isn't visible until the script loads -->
<p>...content after script...</p>
è¿éæä¸äºè§£å³åæ³ãä¾å¦ï¼æä»¬å¯ä»¥æèæ¬æ¾å¨é¡µé¢åºé¨ãæ¤æ¶ï¼å®å¯ä»¥è®¿é®å°å®ä¸é¢çå ç´ ï¼å¹¶ä¸ä¸ä¼é»å¡é¡µé¢æ¾ç¤ºå 容ï¼
<body>
...all content is above the script...
<script src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script>
</body>
使¯è¿ç§è§£å³æ¹æ¡è¿éå®ç¾ãä¾å¦ï¼æµè§å¨åªæå¨ä¸è½½äºå®æ´ç HTML ææ¡£ä¹åæä¼æ³¨æå°è¯¥èæ¬ï¼å¹¶ä¸å¯ä»¥å¼å§ä¸è½½å®ï¼ã对äºé¿ç HTML ææ¡£æ¥è¯´ï¼è¿æ ·å¯è½ä¼é æææ¾çå»¶è¿ã
è¿å¯¹äºä½¿ç¨é«éè¿æ¥ç人æ¥è¯´ï¼è¿ä¸å¼ä¸æï¼ä»ä»¬ä¸ä¼æåå°è¿ç§å»¶è¿ã使¯è¿ä¸ªä¸çä¸ä»ç¶æå¾å¤å°åºç人们æä½¿ç¨çç½ç»éåº¦å¾æ ¢ï¼å¹¶ä¸ä½¿ç¨çæ¯è¿éå®ç¾çç§»å¨äºèç½è¿æ¥ã
幸è¿çæ¯ï¼è¿éæä¸¤ä¸ª <script> ç¹æ§ï¼attributeï¼å¯ä»¥ä¸ºæä»¬è§£å³è¿ä¸ªé®é¢ï¼defer å asyncã
defer
defer ç¹æ§åè¯æµè§å¨ä¸è¦çå¾
èæ¬ãç¸åï¼æµè§å¨å°ç»§ç»å¤ç HTMLï¼æå»º DOMãèæ¬ä¼âå¨åå°âä¸è½½ï¼ç¶åç DOM æå»ºå®æåï¼èæ¬æä¼æ§è¡ã
è¿æ¯ä¸ä¸é¢é£ä¸ªç¸åç示ä¾ï¼ä½æ¯å¸¦æ defer ç¹æ§ï¼
<p>...content before script...</p>
<script defer src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script>
<!-- ç«å³å¯è§ -->
<p>...content after script...</p>
æ¢å¥è¯è¯´ï¼
- å
·æ
deferç¹æ§çèæ¬ä¸ä¼é»å¡é¡µé¢ã - å
·æ
deferç¹æ§çèæ¬æ»æ¯è¦çå° DOM è§£æå®æ¯ï¼ä½å¨DOMContentLoadedäºä»¶ä¹åæ§è¡ã
ä¸é¢è¿ä¸ªç¤ºä¾æ¼ç¤ºäºä¸é¢æè¯´ç第äºå¥è¯ï¼
<p>...content before scripts...</p>
<script>
document.addEventListener('DOMContentLoaded', () => alert("DOM ready after defer!"));
</script>
<script defer src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script>
<p>...content after scripts...</p>
- 页é¢å 容ç«å³æ¾ç¤ºã
DOMContentLoadedäºä»¶å¤çç¨åºçå¾ å ·ædeferç¹æ§çèæ¬æ§è¡å®æãå®ä» å¨èæ¬ä¸è½½ä¸æ§è¡ç»æåæä¼è¢«è§¦åã
å
·æ defer ç¹æ§çèæ¬ä¿æå
¶ç¸å¯¹é¡ºåºï¼å°±å常è§èæ¬ä¸æ ·ã
åè®¾ï¼æä»¬æä¸¤ä¸ªå
·æ defer ç¹æ§çèæ¬ï¼long.js å¨åï¼small.js å¨åã
<script defer src="https://javascript.info/article/script-async-defer/long.js"></script>
<script defer src="https://javascript.info/article/script-async-defer/small.js"></script>
æµè§å¨æ«æé¡µé¢å¯»æ¾èæ¬ï¼ç¶åå¹¶è¡ä¸è½½å®ä»¬ï¼ä»¥æé«æ§è½ãå æ¤ï¼å¨ä¸é¢ç示ä¾ä¸ï¼ä¸¤ä¸ªèæ¬æ¯å¹¶è¡ä¸è½½çãsmall.js å¯è½ä¼å
ä¸è½½å®æã
â¦â¦ä½æ¯ï¼defer ç¹æ§é¤äºåè¯æµè§å¨âä¸è¦é»å¡é¡µé¢âä¹å¤ï¼è¿å¯ä»¥ç¡®ä¿èæ¬æ§è¡çç¸å¯¹é¡ºåºãå æ¤ï¼å³ä½¿ small.js å
å è½½å®æï¼å®ä¹éè¦çå° long.js æ§è¡ç»ææä¼è¢«æ§è¡ã
彿们éè¦å å è½½ JavaScript åºï¼ç¶ååå è½½ä¾èµäºå®çèæ¬æ¶ï¼è¿å¯è½ä¼å¾æç¨ã
defer ç¹æ§ä»
éç¨äºå¤é¨èæ¬å¦æ <script> èæ¬æ²¡æ srcï¼åä¼å¿½ç¥ defer ç¹æ§ã
async
async ç¹æ§ä¸ defer æäºç±»ä¼¼ãå®ä¹è½å¤è®©èæ¬ä¸é»å¡é¡µé¢ã使¯ï¼å¨è¡ä¸ºä¸äºè
æçéè¦çåºå«ã
async ç¹æ§æå³çèæ¬æ¯å®å
¨ç¬ç«çï¼
- æµè§å¨ä¸ä¼å
asyncèæ¬èé»å¡ï¼ä¸defer类似ï¼ã - å
¶ä»èæ¬ä¸ä¼çå¾
asyncèæ¬å è½½å®æï¼åæ ·ï¼asyncèæ¬ä¹ä¸ä¼çå¾ å ¶ä»èæ¬ã DOMContentLoadedå弿¥èæ¬ä¸ä¼å½¼æ¤çå¾ ï¼DOMContentLoadedå¯è½ä¼åçå¨å¼æ¥èæ¬ä¹åï¼å¦æå¼æ¥èæ¬å¨é¡µé¢å®æåæå è½½å®æï¼DOMContentLoadedä¹å¯è½åçå¨å¼æ¥èæ¬ä¹åï¼å¦æå¼æ¥èæ¬å¾çï¼æè æ¯ä» HTTP ç¼åä¸å è½½çï¼
æ¢å¥è¯è¯´ï¼async èæ¬ä¼å¨åå°å è½½ï¼å¹¶å¨å 载就绪æ¶è¿è¡ãDOM åå
¶ä»èæ¬ä¸ä¼çå¾
å®ä»¬ï¼å®ä»¬ä¹ä¸ä¼çå¾
å
¶å®çä¸è¥¿ãasync èæ¬å°±æ¯ä¸ä¸ªä¼å¨å è½½å®ææ¶æ§è¡çå®å
¨ç¬ç«çèæ¬ãå°±è¿ä¹ç®åï¼ç°å¨æç½äºå§ï¼
ä¸é¢æ¯ä¸ä¸ªç±»ä¼¼äºæä»¬å¨è®² defer æ¶æçå°çä¾åï¼long.js å small.js ä¸¤ä¸ªèæ¬ï¼åªæ¯ç°å¨ defer åæäº asyncã
å®ä»¬ä¸ä¼çå¾
对æ¹ãå
å è½½å®æçï¼å¯è½æ¯ small.jsï¼ââ å
æ§è¡ï¼
<p>...content before scripts...</p>
<script>
document.addEventListener('DOMContentLoaded', () => alert("DOM ready!"));
</script>
<script async src="https://javascript.info/article/script-async-defer/long.js"></script>
<script async src="https://javascript.info/article/script-async-defer/small.js"></script>
<p>...content after scripts...</p>
- 页é¢å
容ç«å»æ¾ç¤ºåºæ¥ï¼å è½½åæ
asyncçèæ¬ä¸ä¼é»å¡é¡µé¢æ¸²æã DOMContentLoadedå¯è½å¨asyncä¹åæä¹å触åï¼ä¸è½ä¿è¯è°å è°åã- è¾å°çèæ¬
small.jsæå¨ç¬¬äºä½ï¼ä½å¯è½ä¼æ¯long.jsè¿ä¸ªé¿èæ¬å å è½½å®æï¼æä»¥small.jsä¼å æ§è¡ãè½ç¶ï¼å¯è½æ¯long.jså å è½½å®æï¼å¦æå®è¢«ç¼åäºçè¯ï¼é£ä¹å®å°±ä¼å æ§è¡ãæ¢å¥è¯è¯´ï¼å¼æ¥èæ¬ä»¥âå è½½ä¼å âçé¡ºåºæ§è¡ã
彿们å°ç¬ç«çç¬¬ä¸æ¹èæ¬éæå°é¡µé¢æ¶ï¼æ¤æ¶éç¨å¼æ¥å è½½æ¹å¼æ¯é常æ£çï¼è®¡æ°å¨ï¼å¹¿åçï¼å 为å®ä»¬ä¸ä¾èµäºæä»¬çèæ¬ï¼æä»¬çèæ¬ä¹ä¸åºè¯¥çå¾ å®ä»¬ï¼
<!-- Google Analytics èæ¬é常æ¯è¿æ ·åµå
¥é¡µé¢ç -->
<script async src="https://google-analytics.com/analytics.js"></script>
async ç¹æ§ä»
éç¨äºå¤é¨èæ¬å°±å defer 䏿 ·ï¼å¦æ <script> æ ç¾æ²¡æ src ç¹æ§ï¼attributeï¼ï¼é£ä¹ async ç¹æ§ä¼è¢«å¿½ç¥ã
å¨æèæ¬
æ¤å¤ï¼è¿æä¸ç§å页颿·»å èæ¬çéè¦çæ¹å¼ã
æä»¬å¯ä»¥ä½¿ç¨ JavaScript 卿å°å建ä¸ä¸ªèæ¬ï¼å¹¶å°å ¶éå ï¼appendï¼å°ææ¡£ï¼documentï¼ä¸ï¼
let script = document.createElement('script');
script.src = "/article/script-async-defer/long.js";
document.body.append(script); // (*)
å½èæ¬è¢«éå å°ææ¡£ (*) æ¶ï¼èæ¬å°±ä¼ç«å³å¼å§å è½½ã
é»è®¤æ åµä¸ï¼å¨æèæ¬çè¡ä¸ºæ¯â弿¥âçã
ä¹å°±æ¯è¯´ï¼
- å®ä»¬ä¸ä¼çå¾ ä»»ä½ä¸è¥¿ï¼ä¹æ²¡æä»ä¹ä¸è¥¿ä¼çå®ä»¬ã
- å å è½½å®æçèæ¬å æ§è¡ï¼âå è½½ä¼å â顺åºï¼ã
妿æä»¬æ¾å¼å°è®¾ç½®äº script.async=falseï¼åå¯ä»¥æ¹åè¿ä¸ªè§åãç¶åèæ¬å°æç
§èæ¬å¨ææ¡£ä¸çé¡ºåºæ§è¡ï¼å°±å defer 飿 ·ã
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼loadScript(src) 彿°æ·»å äºä¸ä¸ªèæ¬ï¼å¹¶å° async è®¾ç½®ä¸ºäº falseã
å æ¤ï¼long.js æ»æ¯ä¼å
æ§è¡ï¼å ä¸ºå®æ¯å
被添å å°ææ¡£çï¼ï¼
function loadScript(src) {
let script = document.createElement('script');
script.src = src;
script.async = false;
document.body.append(script);
}
// long.js å
æ§è¡ï¼å 为代ç ä¸è®¾ç½®äº async=false
loadScript("/article/script-async-defer/long.js");
loadScript("/article/script-async-defer/small.js");
å¦ææ²¡æ script.async=falseï¼èæ¬åå°ä»¥é»è®¤è§åæ§è¡ï¼å³å è½½ä¼å
顺åºï¼small.js 大æ¦ä¼å
æ§è¡ï¼ã
åæ ·ï¼å defer 䏿 ·ï¼å¦ææä»¬è¦å è½½ä¸ä¸ªåºåä¸ä¸ªä¾èµäºå®çèæ¬ï¼é£ä¹é¡ºåºå°±å¾éè¦ã
æ»ç»
async å defer æä¸ä¸ªå
±åç¹ï¼å è½½è¿æ ·çèæ¬é½ä¸ä¼é»å¡é¡µé¢ç渲æãå æ¤ï¼ç¨æ·å¯ä»¥ç«å³é
读并äºè§£é¡µé¢å
容ã
使¯ï¼å®ä»¬ä¹é´ä¹åå¨ä¸äºæ¬è´¨çåºå«ï¼
| é¡ºåº | DOMContentLoaded |
|
|---|---|---|
async |
å è½½ä¼å 顺åºãèæ¬å¨ææ¡£ä¸ç顺åºä¸éè¦ ââ å å è½½å®æçå æ§è¡ | ä¸ç¸å ³ãå¯è½å¨ææ¡£å è½½å®æåå 载并æ§è¡å®æ¯ãå¦æèæ¬å¾å°æè æ¥èªäºç¼åï¼åæ¶ææ¡£è¶³å¤é¿ï¼å°±ä¼åçè¿ç§æ åµã |
defer |
ææ¡£é¡ºåºï¼å®ä»¬å¨ææ¡£ä¸ç顺åºï¼ | å¨ææ¡£å è½½åè§£æå®æä¹åï¼å¦æéè¦ï¼åä¼çå¾
ï¼ï¼å³å¨ DOMContentLoaded ä¹åæ§è¡ã |
å¨å®é
å¼åä¸ï¼defer ç¨äºéè¦æ´ä¸ª DOM çèæ¬ï¼å/æèæ¬çç¸å¯¹æ§è¡é¡ºåºå¾éè¦çæ¶åã
async ç¨äºç¬ç«èæ¬ï¼ä¾å¦è®¡æ°å¨æå¹¿åï¼è¿äºèæ¬çç¸å¯¹æ§è¡é¡ºåºæ å
³ç´§è¦ã
请注æï¼å¦æä½ 使ç¨çæ¯ defer æ asyncï¼é£ä¹ç¨æ·å°å¨èæ¬å è½½å®æ ä¹å å
çå°é¡µé¢ã
å¨è¿ç§æ åµä¸ï¼æäºå¾å½¢ç»ä»¶å¯è½å°æªåå§å宿ã
å æ¤ï¼è¯·è®°å¾æ·»å ä¸ä¸ªâæ£å¨å è½½âçæç¤ºï¼å¹¶ç¦ç¨å°ä¸å¯ç¨çæé®ãä»¥è®©ç¨æ·å¯ä»¥æ¸ æ¥å°çå°ï¼ä»ç°å¨å¯ä»¥å¨é¡µé¢ä¸åä»ä¹ï¼ä»¥åè¿æä»ä¹æ¯æ£å¨åå¤ä¸çã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼