æè¿ã® web ãµã¤ãã§ã¯ãã¹ã¯ãªãã㯠HTML ããã âéãâ ãã¨ããã°ãã°ã§ã: ãã¦ã³ãã¼ããµã¤ãºã¯ãã大ãããå¦çæéãé·ããªãã¾ãã
ãã©ã¦ã¶ã HTML ããã¼ããã<script>...</script> ã¿ã°ã«ééããã¨ãDOM ã®æ§ç¯ãç¶ãããã¨ã¯ã§ãã¾ãããããã«ã¹ã¯ãªãããå®è¡ããå¿
è¦ãããã¾ããå¤é¨ã¹ã¯ãªãã <script src="..."></script> ã«ã¤ãã¦ãåãã§ã: ãã©ã¦ã¶ã¯ã¹ã¯ãªããããã¦ã³ãã¼ããããããå®è¡ããã¾ã§å¾
ã¤å¿
è¦ãããããã®å¾ã«ãã¼ã¸ã®æ®ãé¨åã®å¦çããããã¨ã«ãªãã¾ãã
ããã¯2ã¤ã®éè¦ãªåé¡ã«ã¤ãªããã¾ã:
- ã¹ã¯ãªããã¯ããã以éã® DOMè¦ç´ ã¯èªèãããã¨ãã§ããªãããããã³ãã©ã¼ã追å ããããããã¨ã¯ã§ãã¾ããã
- ãã¼ã¸ã®å é ã«éãã¹ã¯ãªãããããã¨ãâãã¼ã¸ããããã¯â ãã¾ããå©ç¨è ã¯ããããã¦ã³ãã¼ãããå®è¡ãããã¾ã§ãã¼ã¸ã³ã³ãã³ããè¦ããã¨ãã§ãã¾ãã:
<p>...content before script...</p>
<script src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script>
<!-- ã¹ã¯ãªããããã¼ããããã¾ã§è¡¨ç¤ºããã¾ãã -->
<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 ããã¥ã¡ã³ããé·ãã¨ãããªãã®é å»¶ã«ãªãå¯è½æ§ãããã¾ãã
ãã®ãããªãã¨ã¯ãååã«æ©ãæ¥ç¶ã使ç¨ãã¦ãã人ã ã«ã¯è¦ãã¾ããããä¸çä¸ã®å¤ãã®äººã¯ä¾ç¶ã¨ãã¦ä½éã®ã¤ã³ã¿ã¼ããããå©ç¨ãã¦ãããå®ç§ã¨ã¯ã»ã©é ãã¢ãã¤ã«ã¤ã³ã¿ã¼ãããæ¥ç¶ã使ç¨ãã¦ãã¾ãã
幸ããªãã¨ã«ããã®åé¡ã解決ãã2ã¤ã® <script> 屿§ãããã¾ã: 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ã¤ãã³ãã®åã§ã)ã¨ãã«å®è¡ããã¾ãã
次ã®ä¾ã¯2ã¤ç®ã®é¨åã®ä¾ã§ã:
<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ã¤ãã³ããã³ãã©ã¯é å»¶ã¹ã¯ãªãããå¾ ã¡ã¾ããã¹ã¯ãªããããã¦ã³ãã¼ãããå®è¡ãããã¨ãã«å®è¡ããã¾ãã
é å»¶ã¹ã¯ãªããã¯é常ã®ã¹ã¯ãªããã®ããã«ãç¸å¯¾çãªé åºãç¶æãã¾ãã
2ã¤ã®é
å»¶ã¹ã¯ãªãããããã¨ãã¾ããã: 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 屿§ã¯å¤é¨ã¹ã¯ãªããå°ç¨ã§ãsrc ããªã <script> ã¿ã°ã®å ´åãdefer 屿§ã¯ç¡è¦ããã¾ãã
async
async 屿§ã¯ defer ã«ä¼¼ã¦ãã¾ãããããã¹ã¯ãªããããããã¯ãã¾ããããæ¯ãèãã«éè¦ãªéããããã¾ãã
async 屿§ã¯ã¹ã¯ãªãããå®å
¨ã«ç¬ç«ãã¦ãããã¨ãæå³ãã¾ãã:
- ãã©ã¦ã¶ã¯
asyncã¹ã¯ãªããããããã¯ãã¾ãã(deferã¨åãããã«)ã - ä»ã®ã¹ã¯ãªããã¯
asyncã¹ã¯ãªãããå¾ ãããasyncã¹ã¯ãªãããããããå¾ ã¡ã¾ããã DOMContentLoadedã¨asyncã¹ã¯ãªããã¯äºããå¾ ã¡ã¾ãã:DOMContentLoadedã¯asyncã¹ã¯ãªããã®åã§çºçããå¯è½æ§ãããã¾ãï¼ãã¼ã¸ãå®äºããå¾ã«asyncã¹ã¯ãªããã®èªã¿è¾¼ã¿ãçµäºããå ´åï¼- â¦ãããã¯ã
asyncã¹ã¯ãªããã®å¾ã§ãï¼éåæã¹ã¯ãªãããçãã HTTPãã£ãã·ã¥ã«ãã£ãå ´åï¼ã
ã¤ã¾ããasync ã¹ã¯ãªããã¯ããã¯ã°ã©ã¦ã³ãã§èªã¿è¾¼ã¾ããæºåãã§ãããå®è¡ããã¾ããDOM ã¨ä»ã®ã¹ã¯ãªããã¯ããããå¾
ãããããããä½ãå¾
ã¡ã¾ãããèªã¿è¾¼ã¾ããã¨ãã«å®è¡ãããå®å
¨ã«ç¬ç«ããã¹ã¯ãªããã§ãã
ãã㯠defer ã§è¦ããã®ã¨åæ§ã®ä¾ã§ãã:2ã¤ã®ã¹ã¯ãªãã 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ã2çªç®ã«ããã¾ãããããããlong.jsã®åã«èªã¿è¾¼ã¾ããã®ã§ãsmall.jsãæåã«å®è¡ããã¾ããã§ããããã£ãã·ã¥ããã¦ããå ´åã¯ãlong.jsãæåã«èªã¿è¾¼ã¾ããæåã«å®è¡ããããã¨ãããã¾ããã¤ã¾ããéåæã¹ã¯ãªãã㯠âãã¼ããã¡ã¼ã¹ãâ é ã§å®è¡ãã¾ãã
éåæã¹ã¯ãªããã¯ç¬ç«ãããµã¼ããã¼ãã£ã®ã¹ã¯ãªããããã¼ã¸ã«çµã¿è¾¼ãéã«ä¾¿å©ã§ãã:ã«ã¦ã³ã¿ã¼ãåºåãªã©ããããã¯æã ã®ã¹ã¯ãªããã«ã¯ä¾åããªãã®ã§ãæã ã®ã¹ã¯ãªãããå¾ ã¤ã¹ãã§ã¯ããã¾ããã:
<!-- Google Analytics ã¯é常ãã®ããã«è¿½å ããã¾ã -->
<script async src="https://google-analytics.com/analytics.js"></script>
ãã¤ãããã¯ã¹ã¯ãªãã
ãã¼ã¸ã«ã¹ã¯ãªããã追å ããããã1ã¤ã®éè¦ãªæ¹æ³ãããã¾ãã
JavaScript ãå©ç¨ãã¦åçã«ã¹ã¯ãªããã使ãããã¥ã¡ã³ãã追å ãããã¨ãå¯è½ã§ã:
let script = document.createElement('script');
script.src = "/article/script-async-defer/long.js";
document.body.append(script); // (*)
ã¹ã¯ãªããã¯ããã¥ã¡ã³ãã«è¿½å ãããã¨ããã«èªã¿è¾¼ã¿ãéå§ãã¾ã(*)ã
ãã¤ãããã¯ã¹ã¯ãªããã¯ããã©ã«ãã§ âéåæâ ã¨ãã¦åä½ãã¾ãã
ã¤ã¾ã:
- ãããã¯ä½ãå¾ ãããéã«ä½ãããããå¾ ã¡ã¾ããã
- æåã«èªã¿è¾¼ã¾ããã¹ã¯ãªãããæåã«å®è¡ããã¾ã(âãã¼ããã¡ã¼ã¹ãâ é )ã
script.async=true ãæç¤ºçã«è¨å®ãããã¨ã§å¤æ´ã§ãã¾ããã¹ã¯ãªãã㯠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);
}
// async=false ãªã®ã§ long.js ãæåã«å®è¡ããã¾ã
loadScript("/article/script-async-defer/long.js");
loadScript("/article/script-async-defer/small.js");
script.async=false ããªããã°ãã¹ã¯ãªããã¯ããã©ã«ãã§ãããã¼ããã¡ã¼ã¹ãé ï¼ãããã small.js ãæåï¼ã§å®è¡ããã¾ãã
ç¹°ãè¿ãã¾ãããdefer ã¨åãããã«ãã©ã¤ãã©ãªãèªã¿è¾¼ã¿ãããã«ä¾åããå¥ã®ã¹ã¯ãªãããèªã¿è¾¼ããããªå ´åã¯ãé åºãéè¦ã«ãªãã¾ãã
ãµããª
async 㨠defer ã«ã¯å
±éç¹ã1ã¤ããã¾ã: ãããã®ã¹ã¯ãªããã®ãã¦ã³ãã¼ãã¯ãã¼ã¸ã®ã¬ã³ããªã³ã°ããããã¯ãã¾ããããªã®ã§ãã¦ã¼ã¶ã¯ãã¼ã¸ã³ã³ãã³ããè¦ããã¨ãã§ããããã«ãã®ãã¼ã¸ã®ãã¨ãç¥ããã¨ãã§ãã¾ãã
ã§ããããããã®éã«ãæ¬è³ªçãªéããããã¾ã:
| é åº | DOMContentLoaded |
|
|---|---|---|
async |
ãã¼ããã¡ã¼ã¹ãé . ã©ã¡ããæåã«èªã¿è¾¼ã¾ããããããã¥ã¡ã³ãã§ã®é åºã¯é¢ä¿ããã¾ãã | ç¡é¢ä¿ãããã¥ã¡ã³ããã¾ã å®å ¨ã«ãã¦ã³ãã¼ãããã¦ããªãã¨ãã«ãã¼ããã¦å®è¡ããå ´åãããã¾ããããã¯ã¹ã¯ãªãããå°ããã¾ãã¯ãã£ãã·ã¥ããã¦ãã¦ãããã¥ã¡ã³ããååã«é·ãå ´åã«çºçãã¾ãã |
defer |
ããã¥ã¡ã³ãé (ããã¥ã¡ã³ãã«æ¸ããã¦ããé ). | ããã¥ã¡ã³ãããã¼ãããããã¼ã¹ãããå¾ï¼å¿
è¦ã«å¿ãã¦å¾
æ©ãã¾ãï¼ãDOMContentLoaded ã®ç´åã«å®è¡ããã¾ãã |
å®éã«ã¯ãdefer 㯠DOMå
¨ä½ãå¿
è¦ããã¤ï¼ã¾ãã¯ï¼ãããã®ç¸å¯¾çãªå®è¡é åºãéè¦ãªã¹ã¯ãªããã«å¯¾ãã¦ä½¿ç¨ããã¾ãã
async ã¯ã«ã¦ã³ã¿ã¼ãåºåãªã©ç¬ç«ããã¹ã¯ãªããã«å¯¾ã使ç¨ããã¾ãããããã®ç¸å¯¾çãªå®è¡é åºã¯éè¦ã§ã¯ããã¾ããã
注æãã¦ãã ãã: defer ã async ã使ç¨ãã¦ããå ´åãã¦ã¼ã¶ã¯ã¹ã¯ãªããããã¼ãããã å ã«ãã¼ã¸ãè¦ã¾ãã
ãã®ãããªã±ã¼ã¹ã§ã¯ãã°ã©ãã£ã«ã«ãªã³ã³ãã¼ãã³ãã®ããã¤ãã¯ããããã¾ã åæåããã¦ãã¾ããã
âãã¼ãä¸â ã®ã¤ã³ã¸ã±ã¼ã¿ã表示ããã¾ã æ©è½ãã¦ããªããã¿ã³ãç¡å¹ã«ããã®ãå¿ããªãã§ãã ãããã¦ã¼ã¶ããã¼ã¸ã§ä½ãã§ããã®ããããã¦ä½ãã¾ã æºåä¸ã§ããããæç¢ºã«åããããã«ããå¿ è¦ãããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã