
ã»ãã®æ°æéåãããŒãžãžã®ã¹ã¯ãªããã®ããŒãã«é¢ããçŸç¶ã«ã€ããŠã®ãã°ãããèšäºãHTML5 Rocksã«æ²èŒãããŸããã ãã®ç¿»èš³ããèŠãããŸãã ä¿®æ£ã¯ãã©ã€ããŒãã¡ãã»ãŒãžã«éä¿¡ã§ããŸãã
ã¯ããã«
ãã®èšäºã§ã¯ãJavaScriptããã©ãŠã¶ãŒã«ããŒãããŠå®è¡ããæ¹æ³ã説æããŸãã
åŸ
ã£ãŠãæ»ã£ãŠããŠïŒ ç§ã¯ãããæ®éã§åçŽã«èãããããšãç¥ã£ãŠããŸãããããã¯ãã©ãŠã¶ã§èµ·ããããšãèŠããŠãããŠãã ããã ãããã®çãç¥ãããšã¯ãã¹ã¯ãªãããããŒãããããã®æéã§ç Žå£çãªæ¹æ³ãéžæããã®ã«åœ¹ç«ã¡ãŸãã ãæ¥ãã®å Žåã¯ãèšäºã®æåŸã«ããã¯ã€ãã¯ãªãã¡ã¬ã³ã¹ã¬ã€ãã«çŽæ¥é²ãã§ãã ããã
ãŸã第äžã«ãããã¯ã
仿§ãã¹ã¯ãªãããããŒãããã³å®è¡ããããŸããŸãªæ¹æ³ãå®çŸ©ããæ¹æ³ã§ãã

ãã¹ãŠã®WHATWG仿§ãšåæ§ã«ããã®ä»æ§ã¯äžèŠãã¹ã¯ã©ãã«ãã¡ã¯ããªãŒã®ã¯ã©ã¹ã¿ãŒç匟ã®åœ±é¿ã®ããã«èŠããŸãã ããããããã5åèªãã§ãç®ããè¡ãæããåŸãããªãã¯ãããéåžžã«é¢çœããšæãå§ããŸãïŒ
ç§ã®æåã®ã¹ã¯ãªããæ¥ç¶
<script src="//other-domain.com/1.js"></script> <script src="2.js"></script>
ãããè³çŠã®ã·ã³ãã«ãã ãã®å Žåããã©ãŠã¶ãŒã¯äž¡æ¹ã®ã¹ã¯ãªããã䞊è¡ããŠããŠã³ããŒãããæå®ãããé åºãä¿æããŠãã§ããã ãæ©ãããããå®è¡ããŸãã ã2.jsãã¯ã1.jsããå®è¡ããããŸã§å®è¡ãããŸããïŒãŸãã¯å®è¡ã§ããŸããïŒãã1.jsãã¯åã®ã¹ã¯ãªãããŸãã¯ã¹ã¿ã€ã«ãå®è¡ããããŸã§å®è¡ãããŸããã ãªã©
æ®å¿µãªããããã©ãŠã¶ã¯ãã以äžã®ããŒãžã¬ã³ããªã³ã°ããããã¯ããŸãããããã¯ãã¹ãŠèµ·ãããŸãã ãWebã®1äžçŽã以æ¥ãããã¯DOM APIã«ãããã®ã§ãããããŒãµãŒã䜿çšããã³ã³ãã³ãã«ãããšãã°
document.write
䜿çšããŠãæååã远å ã§ããŸãã ææ°ã®ãã©ãŠã¶ã¯åŒãç¶ãããã¥ã¡ã³ããããã¯ã°ã©ãŠã³ãã§ã¹ãã£ã³ããã³è§£æããå¿
èŠãªãµãŒãããŒãã£ã³ã³ãã³ãïŒjsãåçãcssãªã©ïŒãèªã¿èŸŒã¿ãŸãããã¬ã³ããªã³ã°ã¯åŒãç¶ããããã¯ãããŸãã
ããããæç¥ãšããã©ãŒãã³ã¹ã®å°éå®¶ãã¹ã¯ãªããèŠçŽ ãããã¥ã¡ã³ãã®æåŸã«é
眮ããããšãæšå¥šããŠããçç±ã§ãã æ®å¿µãªãããããã¯ããã¹ãŠã®HTMLãããŠã³ããŒããããCSSãç»åãããã³iframeãæ¢ã«èªã¿èŸŒãŸãããŸã§ãã¹ã¯ãªããããã©ãŠã¶ã«è¡šç€ºãããªãããšãæå³ããŸãã ææ°ã®ãã©ãŠã¶ã¯ãèŠèŠçãªéšåãããJavaScriptãåªå
ããã®ã«ååè³¢ãã§ããããã£ãšããŸãããããšãã§ããŸãã
IEã«æè¬ããŸãïŒ ïŒããããç§ã¯ç®èããããŸããïŒ
<script src="//other-domain.com/1.js" defer></script> <script src="2.js" defer></script>
Microsoftã¯ãããã®ããã©ãŒãã³ã¹ã®åé¡ãçºèŠããInternet Explorer 4ã«ãé
å»¶ããå°å
¥ããŸãããåºæ¬çã«ã次ã®ããã«è¿°ã¹ãŠããŸãã ãã®çŽæãç Žã£ãããããªãã«åã£ãæ¹æ³ã§ç§ã眰ããããšãã§ããŸããã ãã®å±æ§
ã¯HTML4ã§
å°å
¥ãã ãä»ã®ãã©ãŠã¶ãŒã§ãç»å ŽããŸããã
äžèšã®äŸã§ã¯ããã©ãŠã¶ãŒã¯DOMContentLoadedã
DOMContentLoaded
çŽåã«äž¡æ¹ã®ã¹ã¯ãªãããåæã«ããŠã³ããŒãããŠå®è¡ããé åºãä¿æãããŸãã
çŸã®å·¥å Žã®ã¯ã©ã¹ã¿ãŒç匟ã®ããã«ãå»¶æã¯æ¯ãããããã®æ··ä¹±ã«ãªããŸããã ãsrcããšãdeferãã«å ããŠãã¹ã¯ãªããã¿ã°ãšåçã«ããŒããããã¹ã¯ãªããã«å ããŠãã¹ã¯ãªããã远å ããããã®6ã€ã®ãã¿ãŒã³ããããŸãã åœç¶ããã©ãŠã¶ã¯å®è¡ããé åºã«åæããŸããã§ããã Mozilla
ã¯ããã®åé¡ã«ã€ã㊠2009幎ã«çŽ æŽããã
説æãããŸãã ã
WHATWGã¯ãdeferãåçã«è¿œå ãããã¹ã¯ãªãããsrcãæããªãã¹ã¯ãªããã«åœ±é¿ãäžããªããšå®£èšããããšã«ããããã®åäœãæç€ºçã«ããŸããã ãã以å€ã®å Žåãããã¥ã¡ã³ããè§£æããåŸããdeferããå«ãã¹ã¯ãªãããæå®ãããé åºã§å®è¡ããå¿
èŠããããŸãã
IEã«æè¬ããŸãïŒ ïŒå€§äžå€«ãä»ç®èãšïŒ
1ã€ã¯äžãã-å¥ã®ãã®ãæ®åœ±ãããŸããã æ®å¿µãªãããIE4-9ã«ã¯äžå¿«ãªãã°ããã
ãééã£ãé åºã§ã¹ã¯ãªããã®å®è¡ãåŒãèµ·ããå¯èœæ§ããã
ãŸã ã çºçããããšã¯æ¬¡ã®ãšããã§ãã
1.js
console.log('1'); document.getElementsByTagName('p')[0].innerHTML = 'Changing some content'; console.log('2');
2.js
console.log('3');
ããŒãžã«æ®µèœããããšä»®å®ãããšããã°ã®äºæ³ãããé åºã¯[1ã2ã3]ã§ãããIE9以äžã§ã¯çµæã¯[1ã3ã2]ã«ãªããŸãã äžéšã®DOMæäœã§ã¯ãIEã¯çŸåšã®ã¹ã¯ãªããã®å®è¡ãäžæåæ¢ããç¶è¡ããåã«ãã¥ãŒå
ã®ä»ã®ã¹ã¯ãªããã®å®è¡ãéå§ããŸãã
ããã§ããIE10ãä»ã®ãã©ãŠã¶ãªã©ã®ãã°ã®ãªãå®è£
ã§ããããã¥ã¡ã³ãå
šäœãèªã¿èŸŒãŸããŠè§£æããããŸã§ã¹ã¯ãªããã®å®è¡ã¯é
å»¶ããŸãã ãããã«ãã
DOMContentLoaded
åŸ
ã£ãŠããå Žåã¯äŸ¿å©ã§ãããå®éã®ããã©ãŒãã³ã¹ãåäžããããå Žåã¯ããªã¹ããŒãšããŒãã¹ãã©ããã®äœ¿çšãããã«éå§ããŸã...
HTML5ã«ããæå©
<script src="//other-domain.com/1.js" async></script> <script src="2.js" async></script>
HTML5ã¯ãæ°ãã屿§ãasyncããæäŸããŸãããããã¯ãdocument.writeã䜿çšããŠããªãããšãåæãšããŠããŸãããããã¥ã¡ã³ãã®è§£æãå®äºããã®ãåŸ
ã£ãŠããŸããã ãã©ãŠã¶ã¯äž¡æ¹ã®ã¹ã¯ãªãããåæã«ããŠã³ããŒãããã§ããã ãæ©ãå®è¡ããŸãã
æ®å¿µãªãããã§ããã ãæ©ãå®è¡ããããšãããããã2.jsãã¯ã1.jsããããæ©ãå®è¡ãããå ŽåããããŸãã äºãã«äŸåããŠããªãå Žåãããã¯çŽ æŽãããããšã§ãã ããšãã°ãã1.jsããã2.jsããšã¯é¢ä¿ã®ãªã远跡ã¹ã¯ãªããã§ããå Žåã ããããã1.jsããã2.jsãã«äŸåããjQueryã®CDNã³ããŒã§ããå Žåãã¯ã©ã¹ã¿ãŒç匟ã®ãããª...ããªãã®ããŒãžã¯ãšã©ãŒã§èŠãããŸã...ããããŸãã...ããã§ã¯äœãæãã€ããŸããã§ããã
JavaScriptã©ã€ãã©ãªãå¿
èŠãªããšã¯ç¥ã£ãŠããŸãïŒ
Holy Grailã«ã¯ãããŒãžã®ã¬ã³ããªã³ã°ããããã¯ããã«ããã«ããŒããã远å ããé ã«ã§ããã ãæ©ãå®è¡ããäžé£ã®ã¹ã¯ãªãããå«ãŸããŠããŸãã æ®å¿µãªãããHTMLã¯ããªããå«ã£ãŠããããããèš±å¯ããŸããã
ãã®åé¡ã¯ãJavaScriptãããŸããŸãªæ¹æ³ã§äœ¿çšããŠè§£æ±ºãããŸããã äžéšã®ã¡ãœããã§ã¯ããã¹ãŠãã³ãŒã«ããã¯ã§ã©ããããããã«JavaScriptã倿Žããå¿
èŠããããŸãããã³ãŒã«ããã¯ã¯ãã©ã€ãã©ãªãæ£ããé åºã§åŒã³åºããŸãïŒããšãã°ã
RequireJS ïŒã ä»ã®ãŠãŒã¶ãŒã¯ã䞊åèªã¿èŸŒã¿ã«XHRã䜿çšããæ¬¡ã«æ£ããé åºã§
eval()
ã䜿çšããŸãããããã¯ããã©ãŠã¶ãŒã«
CORSããããŒãšãµããŒãããªãéããå¥ã®ãã¡ã€ã³ã®ã¹ã¯ãªããã§ã¯æ©èœããŸããã ææ°ã®LabJSã§è¡ãããããã«ãã¹ãŒããŒããžãã¯ããã¯ã䜿çšãããã®ããããŸããã
ãããã³ã°ã¯ããããæ¹æ³ã§ãã©ãŠã¶ãtrickããŠãªãœãŒã¹ãããŒããããããŠã³ããŒãã®æåŸã«ã€ãã³ããçºçãããŸããããå®è¡ãéå§ããŸããã§ããã LabJSã§ã¯ãã¹ã¯ãªããã¯æåã«èª€ã£ãMIMEã¿ã€ãã§è¿œå ãããŸãããããšãã°
. , , mime-, , . , , , HTML5 , .
, , JavaScript- , . , ? , ? ? ? .
DOM !
, HTML5, .
The async IDL attribute controls whether the element will execute asynchronously or not. If the element's "force-async" flag is set, then, on getting, the async IDL attribute must return true, and on setting, the "force-async" flag must first be unsetâŠ
" ":
[ '//other-domain.com/1.js', '2.js' ].forEach(function(src) { var script = document.createElement('script'); script.src = src; document.head.appendChild(script); });
. , , mime-, , . , , , HTML5 , .
, , JavaScript- , . , ? , ? ? ? .
DOM !
, HTML5, .
The async IDL attribute controls whether the element will execute asynchronously or not. If the element's "force-async" flag is set, then, on getting, the async IDL attribute must return true, and on setting, the "force-async" flag must first be unsetâŠ
" ":
[ '//other-domain.com/1.js', '2.js' ].forEach(function(src) { var script = document.createElement('script'); script.src = src; document.head.appendChild(script); });
. , , mime-, , . , , , HTML5 , .
, , JavaScript- , . , ? , ? ? ? .
DOM !
, HTML5, .
The async IDL attribute controls whether the element will execute asynchronously or not. If the element's "force-async" flag is set, then, on getting, the async IDL attribute must return true, and on setting, the "force-async" flag must first be unsetâŠ
" ":
[ '//other-domain.com/1.js', '2.js' ].forEach(function(src) { var script = document.createElement('script'); script.src = src; document.head.appendChild(script); });
. , , mime-, , . , , , HTML5 , .
, , JavaScript- , . , ? , ? ? ? .
DOM !
, HTML5, .
The async IDL attribute controls whether the element will execute asynchronously or not. If the element's "force-async" flag is set, then, on getting, the async IDL attribute must return true, and on setting, the "force-async" flag must first be unsetâŠ
" ":
[ '//other-domain.com/1.js', '2.js' ].forEach(function(src) { var script = document.createElement('script'); script.src = src; document.head.appendChild(script); });
. , , mime-, , . , , , HTML5 , .
, , JavaScript- , . , ? , ? ? ? .
DOM !
, HTML5, .
The async IDL attribute controls whether the element will execute asynchronously or not. If the element's "force-async" flag is set, then, on getting, the async IDL attribute must return true, and on setting, the "force-async" flag must first be unsetâŠ
" ":
[ '//other-domain.com/1.js', '2.js' ].forEach(function(src) { var script = document.createElement('script'); script.src = src; document.head.appendChild(script); });
åçã«äœæããã³è¿œå ãããã¹ã¯ãªããïŒããã©ã«ãã§
ã¯éåæïŒã¯ãã¬ã³ããªã³ã°ããããã¯ãããããŒãçŽåŸã«å®è¡ãããŸããã€ãŸããééã£ãé åºã§è¡šç€ºãããå¯èœæ§ããããŸãã ãã ããéåæã§ã¯ãªãããšãæç€ºçã«ããŒã¯ã§ããŸãã
[ '//other-domain.com/1.js', '2.js' ].forEach(function(src) { var script = document.createElement('script'); script.src = src; script.async = false; document.head.appendChild(script); });
ããã«ãããã¹ã¯ãªããã«ãçŽç²ãªHTMLã§ã¯å®çŸã§ããªãåäœãšã®çµã¿åãããæäŸãããŸãã éåæã®ã¹ã¯ãªããã«ãã£ãŠæç€ºçã«èšå®ãããã¹ã¯ãªããã¯ãçŽç²ãªHTMLã®æåã®äŸãšåãããã«ãå®è¡ãã¥ãŒã«è¿œå ãããŸãã ãã ããåçã«äœæããããšãããã¥ã¡ã³ãã®è§£æå€ã§å®è¡ãããèªã¿èŸŒã¿äžã«ã¬ã³ããªã³ã°ããããã¯ããŸããïŒéåæã¹ã¯ãªããã®èªã¿èŸŒã¿ãšåæXHRãæ··åããªãã§ãã ããïŒã
äžèšã®ã¹ã¯ãªããã¯ããŒãžã®å
é ã«åã蟌ãŸããæ®µéçãªã¬ã³ããªã³ã°ãäžæããããšãªãããŠã³ããŒããã¥ãŒãã§ããã ãæ©ãéå§ããæå®ããé åºã§ã§ããã ãæ©ãå®è¡ãéå§ããå¿
èŠããããŸãã ã2.jsãã¯ã1.jsãã«èªç±ã«ããŠã³ããŒãã§ããŸãããã1.jsããæ£åžžã«ããŠã³ããŒãããã³å®è¡ããããããããå®è¡ã§ããªããŸã§å®è¡ãããŸããã ãã£ãïŒ éåæèªã¿èŸŒã¿ãå®è¡ãããŸãïŒ
ãã®ã¡ãœããã䜿çšããã¹ã¯ãªããã®èªã¿èŸŒã¿
ã¯ãasync屿§ããµããŒããã
ãŠãããã¹ãŠã®å Žæã§ãµããŒããã
ãŸããã Safari 5.0ïŒ5.1ã§ã¯ãã¹ãŠåé¡ãããŸããïŒã¯äŸå€ã§ãã ããã«ãasync屿§ããµããŒãããªãFirefoxããã³Operaã®ãã¹ãŠã®ããŒãžã§ã³ã¯ãåçã«è¿œå ãããã¹ã¯ãªãããæ£ããé åºã§å®è¡ããŸãã
ããã¯ãã¹ã¯ãªãããããŒãããæéã®æ¹æ³ã§ãããïŒ ã ããïŒ
ããŒãããã¹ã¯ãªãããåçã«æ±ºå®ããå Žå-ã¯ããããã§ãªãå Žå-ãããå¯èœã§ãã äžèšã®äŸã§ã¯ããã©ãŠã¶ã¯ã¹ã¯ãªãããè§£æããŠããŒãããããŒãããã¹ã¯ãªãããæ±ºå®ããå¿
èŠããããŸãã ããã«ãããã¹ã¯ãªãããããªããŒãã¹ãã£ããŒããé ãããŸãã ãã©ãŠã¶ã¯ãããã®ã¹ãã£ããŒã䜿çšããŠã次ã«ã¢ã¯ã»ã¹ããå¯èœæ§ãé«ããªãœãŒã¹ãæ€åºããããŒãµãŒãå¥ã®ãªãœãŒã¹ã«ãã£ãŠãããã¯ãããŠããéã«ããŒãžãªãœãŒã¹ãèŠã€ããŸãã
ãããããã¥ã¡ã³ãã®å
é ã«é
眮ããããšã«ãããæ€åºå¯èœæ§ã远å ã§ããŸãã
<link rel="subresource" href="//other-domain.com/1.js"> <link rel="subresource" href="2.js">
ããã¯ãããŒãžã«1.jsããã³2.jsãå¿
èŠã§ãããããªããŒããŒã«è¡šç€ºãããããšããã©ãŠã¶ãŒã«äŒããŸãã
link[rel=subresource]
ã¯
link[rel=prefetch]
ã«äŒŒãŠããŸããã
ã»ãã³ãã£ã¯ã¹ã
ç°ãªããŸãã æ®å¿µãªãããããã¯Chromeã§ã®ã¿ãµããŒããããŠãããã¹ã¯ãªããã2åããŠã³ããŒãããããã«å®£èšããå¿
èŠããããŸãã1ã€ç®ã¯ãªã³ã¯èŠçŽ ã«ã2ã€ç®ã¯ã¹ã¯ãªããã«ãããŸãã
ãã®èšäºã¯ç§ãèœã¡èŸŒãŸããŸã
ç¶æ³ã¯æé¬±ã§ãããæé¬±ã«æããã¯ãã§ãã ã¹ã¯ãªãããè¿
éãã€éåæã«ããŒãããåæã«å®è¡é åºãå¶åŸ¡ããç¹°ãè¿ãã®ãªã宣èšçãªæ¹æ³ã¯ãŸã ãããŸããã
HTTP2 / SPDYã®åºçŸã«ãããå°ããªèªå·±ãã£ãã·ã¥ãã¡ã€ã«ã§ã¹ã¯ãªãããé
ä¿¡ããããšãæéã®æ¹æ³ã«ãªããŸã§ãªãŒããŒããããåæžã§ããŸãã æ³åããŠã¿ãŠãã ããïŒ
<script src="dependencies.js"></script> <script src="enhancement-1.js"></script> <script src="enhancement-2.js"></script> <script src="enhancement-3.js"></script> ⊠<script src="enhancement-10.js"></script>
åæ¡åŒµã¹ã¯ãªããã¯ç¹å®ã®ããŒãžã³ã³ããŒãã³ããåŠçããŸãããdependencies.jsã«è£å©é¢æ°ãå¿
èŠã§ãã çæ³çã«ã¯ããã¹ãŠãéåæã«èªã¿èŸŒã¿ãã§ããã ãæ©ããä»»æã®é åºã§ãdependencies.jsã®åŸã«æ¡åŒµã¹ã¯ãªãããå®è¡ããå¿
èŠããããŸãã ããã¯é²æ©çã§é²æ©çãªæ¹åã§ãïŒ
æ®å¿µãªãããã¹ã¯ãªããèªäœã倿ŽããŠãdependencies.jsã®èªã¿èŸŒã¿ã¹ããŒã¿ã¹ãç£èŠããå Žåã«ã®ã¿ããããéæããããã®å®£èšçãªæ¹æ³ã¯ãããŸããã Enhancement-10.jsã®å®è£
ã¯1-9ã§ãããã¯ããããããasync = falseã§ããã®åé¡ã¯è§£æ±ºããŸããã å®éããããã³ã°ããã«ãããéæã§ãããã©ãŠã¶ã¯1ã€ã ãã§ã...
IEã«ã¯ã¢ã€ãã¢ããããŸãïŒ
IEã¯ãä»ã®ãã©ãŠã¶ãšã¯ç°ãªãæ¹æ³ã§ã¹ã¯ãªãããèªã¿èŸŒã¿ãŸãã
var script = document.createElement('script'); script.src = 'whatever.js';
IEã¯ãwhatever.jsãã®ããŠã³ããŒããéå§ããŸããä»ã®ãã©ãŠã¶ã¯ãã¹ã¯ãªãããããã¥ã¡ã³ãã«è¿œå ããããŸã§ããŒããéå§ããŸããã IEã«ã¯ããreadystatechangeãã€ãã³ããšãèªã¿èŸŒã¿ããã»ã¹ã«ã€ããŠéç¥ãããreadystateãããããã£ããããŸãã ããã¯ãã¹ã¯ãªããã®ããŒããšå®è¡ãäºãã«ç¬ç«ããŠå¶åŸ¡ã§ãããããå®éã«ã¯éåžžã«äŸ¿å©ã§ãã
var script = document.createElement('script'); script.onreadystatechange = function() { if (script.readyState == 'loaded') {
ããã¥ã¡ã³ãã«ã¹ã¯ãªããã远å ããã¿ã€ãã³ã°ãéžæããããšã«ãããè€éãªäŸåé¢ä¿ã¢ãã«ãæ§ç¯ã§ããŸãã IEã¯ãããŒãžã§ã³6以éã®ãã®ã¢ãã«ããµããŒãããŠããŸãã ããªãè峿·±ãã§ããããã©ãŠã¶ã®æ€åºæ©èœã«
async=false
ãšåãæ¬ é¥ããã
async=false
ã
ååã ïŒ ã¹ã¯ãªãããããŠã³ããŒãããã«ã¯ã©ãããã°ããã§ããïŒ
ããã£ããããã£ãã ã¬ã³ããªã³ã°ããããã¯ãããè€è£œãå¿
èŠãšãããåªãããã©ãŠã¶ãµããŒããåããæ¹æ³ã§ã¹ã¯ãªãããããŒãããå Žåã¯ãããããå§ãããŸãã
<script src="//other-domain.com/1.js"></script> <script src="2.js"></script>
ããã§ãã bodyèŠçŽ ã®æåŸã ã¯ãããŠã§ãéçºè
ã§ãããšããããšã¯ãã·ã·ãã¹ã®çã®ãããªãã®ã§ãïŒã®ãªã·ã£ç¥è©±ã«èšåããããã®100ã®æµè¡ã«ææãªãã€ã³ãïŒïŒã HTMLãšãã©ãŠã¶ã®å¶éã«ããããã以äžã®æ¹åã¯ã§ããŸããã
JavaScriptã¢ãžã¥ãŒã«ã¯ãã¹ã¯ãªãããã¢ãžã¥ãŒã«åœ¢åŒã§èšè¿°ããå¿
èŠãããå Žåã§ããã¹ã¯ãªãããããŒãããå®è¡é åºãå¶åŸ¡ããããã®å®£èšçãªãã³ããããã³ã°ãªæ¹æ³ãæäŸããããšã§ç§ãã¡ãæãããšãé¡ã£ãŠããŸãã
矩wuãç§ãã¡ãä»äœ¿ãããã®ããã£ãšããã«éããªãïŒ
ããŒãã¹ãã€ã³ãã®ããã«ãããã©ãŒãã³ã¹ã«ã€ããŠçå£ã«èããè€éããéè€ãæããªãã®ã§ããã°ãããã€ãã®èæ
®ãããããªãã¯ãçµã¿åãããããšãã§ããŸãã
æåã«ãããªããŒããŒã®ãµããªãœãŒã¹å®£èšã远å ããŸãã
<link rel="subresource" href="//other-domain.com/1.js"> <link rel="subresource" href="2.js">
次ã«ãããã¥ã¡ã³ãã®åé ã§ã
async=false
ã䜿çšããŠJavaScriptã䜿çšããŠã¹ã¯ãªãããèªã¿èŸŒã¿ãreadystateã«åºã¥ããŠIEã®ã¹ã¯ãªããã«çœ®ãæããŸãã
var scripts = [ '1.js', '2.js' ]; var src; var script; var pendingScripts = []; var firstScript = document.scripts[0];
ããã€ãã®ããªãã¯ããã®åŸã®çž®å°ããããŠ362ãã€ã+ã¹ã¯ãªããã®URLã§ãïŒ
!function(e,t,r){function n(){for(;d[0]&&"loaded"==d[0][f];)c=d.shift(),c[o]=!i.parentNode.insertBefore(c,i)}for(var s,a,c,d=[],i=e.scripts[0],o="onreadystatechange",f="readyState";s=r.shift();)a=e.createElement(t),"async"in i?(a.async=!1,e.head.appendChild(a)):i[f]?(d.push(a),a[o]=n):e.write("<"+t+' src="'+s+'" defer></'+t+">"),a.src=s}(document,"script",[ "//other-domain.com/1.js", "2.js" ])
ã¹ã¯ãªãããæ¥ç¶ããã ãã®å Žåãšæ¯ã¹ãŠãäœåãªãã€ããå¿
èŠã§ããïŒ
BBCãè¡ãããã«ãJavaScriptã䜿çšããŠæ¡ä»¶ä»ãã§ã¹ã¯ãªãããæ¢ã«ããŒãããŠããå Žå
㯠ããããã®ããŠã³ããŒããæ©æã«å®è¡ããããšã圹ç«ã¡ãŸãã ãã以å€ã®å Žåãããããããã§ã¯ãããŸããããæ¬äœã®ç«¯ã§æ¥ç¶ãããšããåçŽãªæ¹æ³ã«åºå·ããŸãã
ããã§ãWHATWGã¹ã¯ãªããã®èªã¿èŸŒã¿ã»ã¯ã·ã§ã³ãéåžžã«å€§ããçç±ãããããŸããã 飲ã¿ç©ãå¿
èŠã§ãã
ã¯ã€ãã¯ãªãã¡ã¬ã³ã¹
åçŽãªã¹ã¯ãªããèŠçŽ
<script src="//other-domain.com/1.js"></script> <script src="2.js"></script>
仿§ã«ã¯ ãäžç·ã«ããŠã³ããŒãããåŸ
æ©ããŠããCSSã®åŸã«é çªã«å®è¡ããå®äºãããŸã§ã¬ã³ããªã³ã°ããããã¯ãã
ãã©ãŠã¶ãŒããã®è¿ä¿¡ïŒã¯ãã
å»¶æãã
<script src="//other-domain.com/1.js" defer></script> <script src="2.js" defer></script>
仿§ã§ã¯ ãäžç·ã«ããŠã³ããŒãããDOMContentLoadedã®åã«é çªã«å®è¡ããŸãã ãsrcãã®ãªãã¹ã¯ãªããã®ãdeferããç¡èŠããŸãã
IE <10ã®è¿ä¿¡ïŒ 1.jsã®éäžã§2.jsãå®è¡ããå¯èœæ§ããããŸãã æ¥œããã§ããïŒ
ã¬ãããŸãŒã³ãã©ãŠã¶ãŒãå¿çããŸããé
å»¶ãšã¯äœãªã®ãããããŸãããã¹ã¯ãªãããããŒãããªãã£ããã®ããã«ããŒãããŸãã
æ®ãã®ãã©ãŠã¶ãŒã¯å¿çããŸãïŒè¯ãã§ããããsrcãã®ãªãã¹ã¯ãªããã®ãdeferããç¡èŠããªãå¯èœæ§ããããŸã
éåæ
<script src="//other-domain.com/1.js" async></script> <script src="2.js" async></script>
仿§ã«ã¯ ããäžç·ã«ããŠã³ããŒãããããŠã³ããŒãããé åºã§å®è¡ããããšãããŸãã
ã¬ãããŸãŒã³ãã©ãŠã¶ãŒåçïŒ ãéåæããšã¯äœã§ããïŒ ã¹ã¯ãªãããããŠã³ããŒãããªãã£ããã®ããã«ããŠã³ããŒãããŸãã
æ®ãã®ãã©ãŠã¶ãŒã¯å¿çããŸãïŒã¯ããããã§ãã
éåæfalse
[ '1.js', '2.js' ].forEach(function(src) { var script = document.createElement('script'); script.src = src; script.async = false; document.head.appendChild(script); });
仿§ã§ã¯ ããã¹ãŠãèµ·åããããäžç·ã«ããŠã³ããŒãããé çªã«å®è¡ããŸãã
Firefox <3.6ãOperaããã®è¿ä¿¡ïŒ ãéåæããšã¯äœãªã®ãããããŸããããJSãä»ããŠè¿œå ãããã¹ã¯ãªããã远å ãââããé ã«å®è¡ããããšããããŸããã
Safari 5.0ã®è¿ä¿¡ïŒ ãéåæãã¯çè§£ããŠããŸãããJSã§falseã«èšå®ããæ¹æ³ãããããŸããã ã¹ã¯ãªãããå°çããããä»»æã®é åºã§ã¹ã¯ãªãããå®è¡ããŸãã
IE <10ã®è¿ä¿¡ïŒ ãéåæãã«ã€ããŠ
ã¯ããããŸãã
ãã ãonreadystatechangeãã䜿çš
ããåé¿çã
ãããŸãã
ä»ã®ã¬ãããŸãŒã³ãã©ãŠã¶ãŒãå¿çããŸãã ãéåæããããããŸãããã¹ã¯ãªãããå°çãããšãã«ãä»»æã®é åºã§å®è¡ããŸãã
ä»ã®åçïŒç§ã¯ããªãã®åéã§ããç§ãã¡ã¯æç§æžã®ããã«ãããããŸãã