<script>ï¼èæ¬å ç´
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
HTML <script> å
ç´ ç¨äºåµå
¥å¯æ§è¡ä»£ç ææ°æ®ï¼è¿é常ç¨ä½åµå
¥æè
å¼ç¨ JavaScript 代ç ã<script> å
ç´ ä¹è½å¨å
¶ä»è¯è¨ä¸ä½¿ç¨ï¼æ¯å¦ WebGL ç GLSL çè²å¨è¯è¨å JSONã
| å 容åç±» | å æ°æ®å å®¹ãæµå¼å 容ãçè¯å 容ã |
|---|---|
| å 许çå 容 | å¨æèæ¬ï¼å¦ text/javascriptã |
| æ ç¾çç¥ | ä¸å 许ï¼å¼å§æ ç¾åç»ææ ç¾é½ä¸è½çç¥ã |
| å 许çç¶å ç´ | ä»»ä½å¯ä»¥æ¥åå æ°æ®å å®¹ï¼æè çè¯å 容çå ç´ ã |
| éå«ç ARIA è§è² | 没æå¯¹åºçè§è² |
| å 许ç ARIA è§è² | ä¸å
è®¸ä»»ä½ role |
| DOM æ¥å£ | HTMLScriptElement |
屿§
该å ç´ å å«å ¨å±å±æ§ã
async-
å¯¹äºæ®éèæ¬ï¼å¦æåå¨
async屿§ï¼é£ä¹æ®éèæ¬ä¼è¢«å¹¶è¡è¯·æ±ï¼å¹¶å°½å¿«è§£æåæ§è¡ãå¯¹äºæ¨¡åèæ¬ï¼å¦æåå¨
async屿§ï¼é£ä¹èæ¬åå ¶ææä¾èµé½ä¼å¨å»¶ç¼éå䏿§è¡ï¼å æ¤å®ä»¬ä¼è¢«å¹¶è¡è¯·æ±ï¼å¹¶å°½å¿«è§£æåæ§è¡ãè¯¥å±æ§è½å¤æ¶é¤è§£æé»å¡ç Javascriptãè§£æé»å¡ç Javascript ä¼å¯¼è´æµè§å¨å¿ é¡»å è½½å¹¶ä¸æ§è¡èæ¬ï¼ä¹åæè½ç»§ç»è§£æã
deferå¨è¿ä¸ç¹ä¸ä¹æç±»ä¼¼çä½ç¨ãè¿æ¯ä¸ªå¸å°å±æ§ï¼å¸å°å±æ§çå卿å³ç true å¼ï¼å¸å°å±æ§ç缺失æå³ç false å¼ã
å ³äºæµè§å¨æ¯æï¼è¯·åè§æµè§å¨å ¼å®¹æ§ç« èãå¦å¯åè§ asm.js ç弿¥èæ¬æç« ã
crossorigin-
æ£å¸¸ç
scriptå ç´ å°æå°çä¿¡æ¯ä¼ éç»window.onerrorï¼ç¨äºé£äºæ²¡æéè¿æ å CORS æ£æ¥çèæ¬ãè¦å 许对éæåªä½ä½¿ç¨ç¬ç«ååçç½ç«è¿è¡é误记å½ï¼è¯·ä½¿ç¨æ¤å±æ§ãåè§ CORS è®¾ç½®å±æ§ï¼ä»¥è·å¾å¯¹å ¶ææåæ°çæ´å¤æè¿°æ§è§£éã defer-
è¿ä¸ªå¸å°å±æ§ç设置æ¯ä¸ºäºåæµè§å¨è¡¨æï¼è¯¥èæ¬æ¯è¦å¨ææ¡£è¢«è§£æåï¼ä½å¨è§¦å
DOMContentLoadedäºä»¶ä¹åæ§è¡çãå å«
defer屿§çèæ¬å°é»å¡DOMContentLoadedäºä»¶è§¦åï¼ç´å°èæ¬å®æå 载并æ§è¡ãè¦åï¼æ¬å±æ§ä¸åºå¨ç¼ºå°
src屿§çæ åµä¸ä½¿ç¨ï¼ä¹å°±æ¯å èèæ¬çæ åµä¸ï¼ï¼è¿ç§æ åµä¸å°ä¸ä¼çæãdefer屿§å¯¹æ¨¡åèæ¬ä¹ä¸ä¼çæââå®ä»¬é»è®¤æ¯ defer çãå å«
defer屿§çèæ¬ä¼æç §å®ä»¬åºç°å¨ææ¡£ä¸çé¡ºåºæ§è¡ãè¿ä¸ªå±æ§è½å¤æ¶é¤é»å¡è§£æç JavaScriptï¼å¨è¿ç§æ åµä¸ï¼æµè§å¨å¿ é¡»å¨ç»§ç»è§£æä¹åå è½½åæ§è¡èæ¬ã
asyncå¨è¿ç§æ åµä¸ä¹æç±»ä¼¼çææã fetchpriority-
æä¾ä¸ä¸ªæç¤ºï¼è¯´æå¨è·åå¤é¨èæ¬æ¶è¦ä½¿ç¨çç¸å¯¹ä¼å 级ãå 许çå¼ï¼
integrity-
å å«ç¨æ·ä»£çå¯ç¨äºéªè¯æè·åå°èµæºç宿´æ§çå èå æ°æ®ãåè§åèµæºå®æ´æ§ã
nomodule-
è¿ä¸ªå¸å°å±æ§è¢«è®¾ç½®æ¥æ æè¿ä¸ªèæ¬ä¸åºè¯¥å¨æ¯æ ES 模åçæµè§å¨ä¸æ§è¡ãå®é ä¸ï¼è¿å¯ç¨äºå¨ä¸æ¯ææ¨¡åå JavaScript çæ§æµè§å¨ä¸æä¾åéèæ¬ã
nonce-
å¨ script-src Content-Security-Policy ä¸å è®¸èæ¬çä¸ä¸ªä¸æ¬¡æ§å å¯éæºæ°ï¼nonceï¼ãæå¡å¨æ¯æ¬¡ä¼ è¾çç¥æ¶é½å¿ é¡»çæä¸ä¸ªå¯ä¸ç nonce å¼ãæä¾ä¸ä¸ªæ æ³çæµç nonce æ¯è³å ³éè¦çï¼å 为ç»è¿ä¸ä¸ªèµæºççç¥æ¯å¾®ä¸è¶³éçã
referrerpolicy-
表示å¨è·åèæ¬æèæ¬è·åèµæºæ¶ï¼è¦åéåªä¸ª referrerï¼
no-referrerï¼ä¸ä¼åéRefereræ 头ãno-referrer-when-downgradeï¼é»è®¤ï¼ï¼å¦ææ²¡æ TLSï¼HTTPSï¼åè®®ï¼Refereræ 头å°ä¸ä¼è¢«åéå°æºä¸ãoriginï¼åéç referrer å°è¢«éå¶å¨ referrer 页é¢çæºï¼å ¶åè®®ã主æºå端å£ãorigin-when-cross-originï¼å°ä¼éå¶åéè³å ¶ä»æºç referrer çåè®®ã主æºå端å£å·ãå¨åæºç导èªä¸ä»ç¶å æ¬è·¯å¾ãsame-originï¼å¨åæºå å°åé referrerï¼ä½æ¯è·¨æºè¯·æ±ä¸å å« referrer ä¿¡æ¯ãstrict-originï¼åªå¨åè®®å®å ¨ç级ç¸åæ¶ï¼å¦ HTTPSâHTTPSï¼åéææ¡£çæºä½ä¸º referrerï¼ç®æ å®å ¨æ§éä½ï¼å¦ HTTPSâHTTPï¼æ¶ä¸åéãstrict-origin-when-cross-originï¼å¨æ§è¡åæºè¯·æ±æ¶ï¼åé宿´ç URLï¼ä½åªå¨åè®®å®å ¨çº§å«ä¿æä¸åï¼å¦ HTTPSâHTTPSï¼æ¶åéæºï¼èå¨ç®æ å®å ¨æ§éä½ï¼å¦ HTTPSâHTTPï¼æ¶ä¸åéæ å¤´ãunsafe-urlï¼referrer å°å 嫿ºåè·¯å¾ï¼ä½ä¸å å«ç段ãå¯ç åç¨æ·åï¼ãè¿ä¸ªå¼æ¯ä¸å®å ¨çï¼å 为å®å° TLS ä¿æ¤çèµæºçæºåè·¯å¾æ³é²ç»ä¸å®å ¨çæºã夿³¨ï¼ç©ºå符串ï¼
""ï¼æ¢æ¯é»è®¤å¼ï¼ä¹æ¯å¨ä¸æ¯æreferrerpolicyçæ åµä¸çä¸ä¸ªåéå¼ãå¦ææ²¡æå¨<script>å ç´ ä¸æç¡®æå®referrerpolicyï¼å®å°éç¨æ´é«çº§å«ç referrer çç¥ï¼å³å¯¹æ´ä¸ªææ¡£æå设置ççç¥ãå¦ææ²¡ææ´é«çº§å«ççç¥ï¼ç©ºå符串å°è¢«è§ä¸ºçåäºno-referrer-when-downgradeã
src-
è¿ä¸ªå±æ§å®ä¹å¼ç¨å¤é¨èæ¬ç URIï¼è¿å¯ä»¥ç¨æ¥ä»£æ¿ç´æ¥å¨ææ¡£ä¸åµå ¥èæ¬ã
type-
è¯¥å±æ§è¡¨ç¤ºæä»£è¡¨çèæ¬ç±»åãè¯¥å±æ§çå¼å¯è½ä¸ºä»¥ä¸ç±»åï¼
- 屿§æªè®¾ç½®ï¼é»è®¤ï¼ï¼ä¸ä¸ªç©ºåç¬¦ä¸²ï¼æä¸ä¸ª JavaScript MIME ç±»å
-
ä»£è¡¨èæ¬ä¸ºå å« JavaScript 代ç çâä¼ ç»çèæ¬âãå¦æèæ¬æçæ¯ JavaScript 代ç ï¼æä»¬é¼å±ä½è çç¥è¿ä¸ªå±æ§ï¼è䏿¯æå®ä¸ä¸ª MIME ç±»åãææç JavaScript MIME ç±»åé½åå¨ IANA çåªä½ç±»åè§èä¸ã
module-
æ¤å¼å¯¼è´ä»£ç 被è§ä¸º JavaScript 模åãå ¶ä¸ç代ç å 容ä¼å»¶åå¤çã
charsetådefer屿§ä¸ä¼çæã对äºä½¿ç¨moduleçæ´å¤ä¿¡æ¯ï¼è¯·åè§ JavaScript 模åæåãä¸ä¼ ç»ä»£ç ä¸åçæ¯ï¼æ¨¡å代ç éè¦ä½¿ç¨ CORS åè®®æ¥è·¨æºè·åã importmap-
æ¤å¼ä»£è¡¨å ç´ ä½å å å«å¯¼å ¥æ å°ï¼importmapï¼è¡¨ãå¯¼å ¥æ å°è¡¨æ¯ä¸ä¸ª JSON 对象ï¼å¼åè å¯ä»¥ç¨å®æ¥æ§å¶æµè§å¨å¨å¯¼å ¥ JavaScript æ¨¡åæ¶å¦ä½è§£ææ¨¡åæ è¯ç¬¦ã
- ä»»ä½å ¶ä»å¼
-
æåµå ¥çå 容被è§ä¸ºä¸ä¸ªæ°æ®åï¼ä¸ä¼è¢«æµè§å¨å¤çãå¼å人åå¿ é¡»ä½¿ç¨ææç MIME ç±»åï¼ä½ä¸æ¯ JavaScript MIME ç±»åæ¥è¡¨ç¤ºæ°æ®åãææå ¶ä»å±æ§ï¼å æ¬
srcåä¼è¢«å¿½ç¥ã
blocking-
è¿ä¸ªå±æ§æç¡®æåºï¼å¨è·åèæ¬çè¿ç¨ä¸ï¼æäºæä½åºè¯¥è¢«é»æãè¦é»æçæä½å¿ é¡»æ¯ä¸ä¸ªä»¥ç©ºæ ¼åéçå表ï¼ä¸é¢ååºäºé»æå±æ§ã
renderï¼å±å¹ä¸æ¸²æå 容çæä½åºè¯¥è¢«é»æã
åºå¼ç屿§
charset-
妿åå¨ï¼å®çå¼å¿ é¡»æ¯ ASCII 大å°å䏿æçâ
utf-8âçå¹é ãæ²¡æå¿ è¦æå®charset屿§ï¼å ä¸ºææ¡£å¿ é¡»ä½¿ç¨ UTF-8ï¼èä¸scriptå ç´ ä»ææ¡£ç»§æ¿å ¶å符ç¼ç ã language-
å
type屿§ç±»ä¼¼ï¼è¿ä¸ªå±æ§å®ä¹èæ¬ä½¿ç¨çè¯è¨ã使¯ä¸typeä¸åçæ¯ï¼è¿ä¸ªå±æ§çå¯è½å¼ä»æªè¢«æ ååè¿ã请ç¨type屿§ä»£æ¿è¿ä¸ªå±æ§ã
夿³¨
没æ asyncãdefer æ type="module" 屿§çèæ¬ï¼ä»¥å没æ type="module" 屿§çå
èèæ¬ï¼ä¼å¨æµè§å¨ç»§ç»è§£æé¡µé¢ä¹åç«å³è·åå¹¶æ§è¡ã
èæ¬åºè¯¥ä»¥ text/javascript ç MIME ç±»åæä¾ï¼ä½æµè§å¨æ¯è¾å®½å®¹ï¼åªæå¨èæ¬ä»¥å¾åç±»åï¼image/*ï¼ãè§é¢ç±»åï¼video/*ï¼ãé³é¢ç±»åï¼audio/*ï¼æ text/csv æä¾æ¶æä¼é»æ¢å®ä»¬ãå¦æèæ¬åé»ï¼å°å该å
ç´ åé error äºä»¶ï¼å¦åï¼å°åé load äºä»¶ã
示ä¾
>åºæ¬ç¨æ³
ä¸é¢è¿äºç¤ºä¾è¯´æäºå¦ä½ä½¿ç¨ <script> å
ç´ æ¥å¯¼å
¥ï¼å¤é¨ï¼èæ¬ã
<script src="javascript.js"></script>
以ä¸ç¤ºä¾å±ç¤ºäºå¦ä½å <script> å
ç´ å
æ¾å
¥ï¼å
èï¼èæ¬ã
<script>
alert("Hello World!");
</script>
async å defer
使ç¨äº async 屿§å è½½çèæ¬ä¸ä¼å¨ä¸è½½æ¶é»å¡é¡µé¢ãè¿æå³çå¨èæ¬æ§è¡å®æä¹åï¼å°æ æ³ä¸ºç¨æ·å¤ç忏²æç½é¡µä¸çå
¶ä½å
å®¹ãæ æ³ä¿è¯èæ¬çè¿è¡æ¬¡åºãå½é¡µé¢çèæ¬ä¹é´å½¼æ¤ç¬ç«ï¼ä¸ä¸ä¾èµäºæ¬é¡µé¢çå
¶ä»ä»»ä½èæ¬æ¶ï¼async æ¯æçæ³çéæ©ã
ä½¿ç¨ defer 屿§å è½½çèæ¬å°æç
§å®ä»¬å¨é¡µé¢ä¸åºç°ç顺åºå è½½ãå¨é¡µé¢å
容å
¨é¨å è½½å®æ¯ä¹åï¼èæ¬ä¸ä¼è¿è¡ï¼å¦æèæ¬ä¾èµäº DOM çåå¨ï¼ä¾å¦ï¼èæ¬ä¿®æ¹äºé¡µé¢ä¸çä¸ä¸ªæå¤ä¸ªå
ç´ ï¼ï¼è¿ä¸ç¹é常æç¨ã
以䏿¯ä¸åèæ¬å è½½æ¹æ³çå¯è§å表示ï¼ä»¥åè¿å¯¹é¡µé¢æå³çä»ä¹ï¼

该å¾çæ¥èª HTML è§èï¼ç»è¿äºå¤å¶åè£åªï¼ä»¥ CC BY 4.0 è·å¾ææã
æ¯å¦ï¼å¦æä½ ç页é¢è¦å 载以ä¸ä¸ä¸ªèæ¬ï¼
<script async src="js/vendor/jquery.js"></script>
<script async src="js/script2.js"></script>
<script async src="js/script3.js"></script>
ä½ ä¸è½ä¾èµèæ¬çå 载顺åºãjquery.js å¯è½å¨ script2 å script3 ä¹åæä¹åè°ç¨ï¼å¦æè¿æ ·ï¼åä¸¤ä¸ªèæ¬ä¸ä¾èµ jquery ç彿°å°äº§çé误ï¼å ä¸ºèæ¬è¿è¡æ¶ jquery å°æªå è½½ã
async åºè¯¥å¨æå¤§éåå°èæ¬éè¦å è½½ï¼å¹¶ä¸åªæ³å°½å¿«å è½½å°ä½çæ
åµä¸ä½¿ç¨ãä¾å¦ï¼ä½ å¯è½éè¦å è½½ä¸äºæ¸¸ææ°æ®æä»¶ï¼è¿å¨æ¸¸æçæ£å¼å§æ¶æ¯éè¦çï¼ä½ç°å¨ä½ åªæ³æ¾ç¤ºæ¸¸æä»ç»ãæ é¢å大å
ï¼è䏿³è¢«èæ¬å è½½é»å¡ã
è§£å³è¿ä¸é®é¢å¯ä½¿ç¨ defer 屿§ï¼å¨èæ¬åå
容ä¸è½½åï¼èæ¬å°æç
§å¨é¡µé¢ä¸åºç°ç顺åºå è½½åè¿è¡ï¼
<script defer src="js/vendor/jquery.js"></script>
<script defer src="js/script2.js"></script>
<script defer src="js/script3.js"></script>
å¨ç¬¬äºä¸ªç¤ºä¾ä¸ï¼æä»¬å¯ä»¥ç¡®ä¿ jquery.js å¿
å®å¨ script2.js å script3.js ä¹åå è½½ï¼åæ¶ script2.js å¿
å®å¨ script3.js ä¹åå è½½ãå¨é¡µé¢å
容å
¨é¨å è½½å®æä¹åï¼å®ä»¬ä¸ä¼è¿è¡ï¼å¦æä½ çèæ¬ä¾èµäº DOMï¼ä¾å¦ï¼å®ä»¬ä¿®æ¹äºé¡µé¢ä¸çä¸ä¸ªæå¤ä¸ªå
ç´ ï¼ï¼è¿å°é常æç¨ã
å°ç»ï¼
asyncådeferé½æç¤ºæµè§å¨å¨é¡µé¢çå ¶ä»é¨åï¼DOM çï¼æ£å¨ä¸è½½æ¶ï¼å¨ä¸ä¸ªåç¬ç线ç¨ä¸ä¸è½½èæ¬ï¼å æ¤å¨è·åè¿ç¨ä¸é¡µé¢å è½½ä¸ä¼è¢«é»å¡ã- 带æ
async屿§çèæ¬å°å¨ä¸è½½å®æåç«å³æ§è¡ãè¿å°é»å¡é¡µé¢ï¼å¹¶ä¸ä¿è¯ä»»ä½ç¹å®çæ§è¡é¡ºåºã - 带æ
defer屿§çèæ¬å°æç §å®ä»¬ç顺åºå è½½ï¼å¹¶ä¸åªæå¨ææèæ¬å è½½å®æ¯åæä¼æ§è¡ã - å¦æèæ¬åºè¯¥ç«å»è¿è¡ä¸æ²¡æä»»ä½ä¾èµï¼é£ä¹åºä½¿ç¨
asyncã - å¦æèæ¬éè¦çå¾
页é¢è§£æï¼ä¸ä¾èµäºå
¶ä»èæ¬æ DOMï¼è¯·ä½¿ç¨
deferå è½½èæ¬ï¼å¹¶å°å ³èçèæ¬æä½ æ³è¦æµè§å¨å è½½å®ä»¬ç顺åºç½®äºç¸åº<script>å ç´ ä¸ã
模ååè½
æ¯æ module ä½ä¸º type 屿§çæµè§å¨å¿½ç¥ä»»ä½å
·æ nomodule 屿§çèæ¬ãè¿ç§æºå¶å¯ä»¥å
è®¸ä½ å¨ä½¿ç¨æ¨¡åèæ¬æ¶ä¸ºä¸æ¯æçæµè§å¨æä¾ nomodule æ è®°çåè½èæ¬ã
<script type="module" src="main.js"></script>
<script nomodule src="fallback.js"></script>
使ç¨å¯¼å ¥æ å°å¯¼å ¥æ¨¡å
å¨èæ¬ä¸å¯¼å
¥æ¨¡åæ¶ï¼å¦æä½ ä¸ä½¿ç¨ type=importmap ç¹æ§ï¼é£ä¹æ¯ä¸ªæ¨¡åé½å¿
é¡»ä½¿ç¨æ¨¡åæå®ç¬¦æ¥å¯¼å
¥ï¼è¯¥æå®ç¬¦å¯ä»¥æ¯ç»å¯¹çä¹å¯ä»¥æ¯ç¸å¯¹ç URLãå¨ä¸é¢çä¾åä¸ï¼ç¬¬ä¸ä¸ªæ¨¡åæ è¯ç¬¦ï¼â./shapes/square.jsâï¼æ¯ç¸å¯¹äºææ¡£çæ ¹ URL è§£æçï¼è第äºä¸ªæ¯ç»å¯¹ URLã
import { name as squareName, draw } from "./shapes/square.js";
import { name as circleName } from "https://example.com/shapes/circle.js";
å¯¼å ¥æ å°å è®¸ä½ æä¾ä¸ä¸ªæ å°ï¼å½å¹é çæ¶åï¼å¯ä»¥æ¿æ¢æ¨¡åæ è¯ç¬¦ææ¬ãä¸é¢çå¯¼å ¥æ å°å®ä¹äºâsquareâåâcircleâé®ï¼å¯ä»¥ä½ä¸ºä¸è¿°æ¨¡åæå®çå«åã
<script type="importmap">
{
"imports": {
"square": "./shapes/square.js",
"circle": "https://example.com/shapes/circle.js"
}
}
</script>
è¿å 许æä»¬ä½¿ç¨æ¨¡åæ è¯ç¬¦ä¸çåç§°å¯¼å ¥æ¨¡åï¼è䏿¯ç»å¯¹æç¸å¯¹ç URLï¼ã
import { name as squareName, draw } from "square";
import { name as circleName } from "circle";
å ³äºä½¿ç¨å¯¼å ¥æ å°çæ´å¤ä¾åï¼è¯·åè§ JavaScript 模åæåä¸ç使ç¨å¯¼å ¥æ å°å¯¼å ¥æ¨¡åç« èã
å¨ HTML ä¸åµå ¥æ°æ®
ä½ ä¹å¯ä»¥ä½¿ç¨ <script> å
ç´ æ¥å¨ HTML ä¸åµå
¥æå¡ç«¯æ¸²æçæ°æ®ï¼å¨ type 屿§ä¸æå®ä¸ä¸ªåæ³çé JavaScript MIME ç±»åå³å¯ã
<!-- ç±æå¡ç«¯çæ -->
<script id="data" type="application/json">
{
"userId": 1234,
"userName": "Maria Cruz",
"memberSince": "2000-01-01T00:00:00.000Z"
}
</script>
<!-- éæä»£ç -->
<script>
const userInfo = JSON.parse(document.getElementById("data").text);
console.log("User information: %o", userInfo);
</script>
å¨èæ¬è¢«è·ååæ§è¡ä¹å黿¢æ¸²æ
ä½ å¯ä»¥å¨ blocking 屿§ä¸å
å« render æ è®°ï¼é¡µé¢ç渲æå°è¢«é»æ¢ï¼ç´å°èæ¬è¢«è·ååæ§è¡ãå¨ä¸é¢çä¾åä¸ï¼æä»¬å°éäºä¸ä¸ªå¼æ¥èæ¬ç渲æãè¿æ ·ï¼èæ¬ä¸ä¼é»å¡è§£æï¼ä½ä¿è¯å¨æ¸²æå¼å§å被æ§è¡ã
<script blocking="render" async src="async-script.js"></script>
è§è
| è§è |
|---|
| HTML > # the-script-element > |