éçæä»¬çåºç¨è¶æ¥è¶å¤§ï¼æä»¬æ³è¦å°å ¶æåæå¤ä¸ªæä»¶ï¼å³æè°çâæ¨¡åï¼moduleï¼âãä¸ä¸ªæ¨¡åå¯ä»¥å å«ç¨äºç¹å®ç®ççç±»æå½æ°åºã
å¾é¿ä¸æ®µæ¶é´ï¼JavaScript 齿²¡æè¯è¨çº§ï¼language-levelï¼ç模åè¯æ³ãè¿ä¸æ¯ä¸ä¸ªé®é¢ï¼å 为æåçèæ¬åå°åç®åï¼æä»¥æ²¡å¿ è¦å°å ¶æ¨¡ååã
使¯æç»èæ¬åå¾è¶æ¥è¶å¤æï¼å æ¤ç¤¾åºåæäºè®¸å¤ç§æ¹æ³æ¥å°ä»£ç ç»ç»å°æ¨¡åä¸ï¼ä½¿ç¨ç¹æ®çåºæéå 载模åã
å举ä¸äºï¼åºäºåå²åå ï¼ï¼
- AMD ââ æå¤èçæ¨¡åç³»ç»ä¹ä¸ï¼æåç± require.js åºå®ç°ã
- CommonJS ââ 为 Node.js æå¡å¨åå»ºçæ¨¡åç³»ç»ã
- UMD ââ å¦å¤ä¸ä¸ªæ¨¡åç³»ç»ï¼å»ºè®®ä½ä¸ºéç¨ç模åç³»ç»ï¼å®ä¸ AMD å CommonJS é½å ¼å®¹ã
ç°å¨ï¼å®ä»¬é½å¨æ ¢æ ¢æä¸ºåå²çä¸é¨åï¼ä½æä»¬ä»ç¶å¯ä»¥å¨æ§èæ¬ä¸æ¾å°å®ä»¬ã
è¯è¨çº§ç模åç³»ç»å¨ 2015 å¹´çæ¶ååºç°å¨äºæ åï¼ES6ï¼ä¸ï¼æ¤å鿏åå±ï¼ç°å¨å·²ç»å¾å°äºææä¸»æµæµè§å¨å Node.js çæ¯æãå æ¤ï¼æä»¬å°ä»ç°å¨å¼å§å¦ä¹ ç°ä»£ JavaScript 模åï¼moduleï¼ã
ä»ä¹æ¯æ¨¡åï¼
ä¸ä¸ªæ¨¡åï¼moduleï¼å°±æ¯ä¸ä¸ªæä»¶ãä¸ä¸ªèæ¬å°±æ¯ä¸ä¸ªæ¨¡åãå°±è¿ä¹ç®åã
模åå¯ä»¥ç¸äºå è½½ï¼å¹¶å¯ä»¥ä½¿ç¨ç¹æ®çæä»¤ export å import æ¥äº¤æ¢åè½ï¼ä»å¦ä¸ä¸ªæ¨¡åè°ç¨ä¸ä¸ªæ¨¡åç彿°ï¼
exportå ³é®åæ è®°äºå¯ä»¥ä»å½å模åå¤é¨è®¿é®çåéå彿°ãimportå ³é®åå 许ä»å ¶ä»æ¨¡åå¯¼å ¥åè½ã
ä¾å¦ï¼æä»¬æä¸ä¸ª sayHi.js æä»¶å¯¼åºäºä¸ä¸ªå½æ°ï¼
// ð sayHi.js
export function sayHi(user) {
alert(`Hello, ${user}!`);
}
â¦â¦ç¶åå¦ä¸ä¸ªæä»¶å¯è½å¯¼å ¥å¹¶ä½¿ç¨äºè¿ä¸ªå½æ°ï¼
// ð main.js
import { sayHi } from './sayHi.js';
alert(sayHi); // function...
sayHi('John'); // Hello, John!
import æä»¤éè¿ç¸å¯¹äºå½åæä»¶çè·¯å¾ ./sayHi.js å 载模åï¼å¹¶å°å¯¼å
¥ç彿° sayHi åé
ï¼assignï¼ç»ç¸åºçåéã
让æä»¬å¨æµè§å¨ä¸è¿è¡ä¸ä¸è¿ä¸ªç¤ºä¾ã
ç±äºæ¨¡åæ¯æç¹æ®çå
³é®åååè½ï¼å æ¤æä»¬å¿
é¡»éè¿ä½¿ç¨ <script type="module"> ç¹æ§ï¼attributeï¼æ¥åè¯æµè§å¨ï¼æ¤èæ¬åºè¯¥è¢«å½ä½æ¨¡åï¼moduleï¼æ¥å¯¹å¾
ã
åè¿æ ·ï¼
export function sayHi(user) {
return `Hello, ${user}!`;
}<!doctype html>
<script type="module">
import {sayHi} from './say.js';
document.body.innerHTML = sayHi('John');
</script>æµè§å¨ä¼èªå¨è·åå¹¶è§£æï¼evaluateï¼å¯¼å ¥ç模åï¼å¦æéè¦ï¼è¿å¯ä»¥åæè¯¥æ¨¡åçå¯¼å ¥ï¼ï¼ç¶åè¿è¡è¯¥èæ¬ã
å¦æä½ å°è¯éè¿ file:// åè®®å¨æ¬å°æå¼ä¸ä¸ªç½é¡µï¼ä½ ä¼åç° import/export æä»¤ä¸èµ·ä½ç¨ãä½ å¯ä»¥ä½¿ç¨æ¬å° Web æå¡å¨ï¼ä¾å¦ static-serverï¼æè
使ç¨ç¼è¾å¨çâ宿¶æå¡å¨âåè½ï¼ä¾å¦ VS Code ç Live Server Extension æ¥æµè¯æ¨¡åã
æ¨¡åæ ¸å¿åè½
ä¸â常è§âèæ¬ç¸æ¯ï¼æ¨¡åæä»ä¹ä¸åå¢ï¼
ä¸é¢æ¯ä¸äºæ ¸å¿çåè½ï¼å¯¹æµè§å¨åæå¡ç«¯ç JavaScript æ¥è¯´é½ææã
å§ç»ä½¿ç¨ âuse strictâ
模åå§ç»å¨ä¸¥æ ¼æ¨¡å¼ä¸è¿è¡ãä¾å¦ï¼å¯¹ä¸ä¸ªæªå£°æçåéèµå¼å°äº§çé误ï¼è¯æ³¨ï¼å¨æµè§å¨æ§å¶å°å¯ä»¥çå° error ä¿¡æ¯ï¼ã
<script type="module">
a = 5; // error
</script>
模å级ä½ç¨å
æ¯ä¸ªæ¨¡å齿èªå·±ç顶级ä½ç¨åï¼top-level scopeï¼ãæ¢å¥è¯è¯´ï¼ä¸ä¸ªæ¨¡åä¸ç顶级ä½ç¨ååéå彿°å¨å ¶ä»èæ¬ä¸æ¯ä¸å¯è§çã
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼æä»¬å¯¼å
¥äºä¸¤ä¸ªèæ¬ï¼hello.js å°è¯ä½¿ç¨å¨ user.js ä¸å£°æçåé userãå®å¤±è´¥äºï¼å ä¸ºå®æ¯ä¸ä¸ªåç¬ç模åï¼ä½ 卿§å¶å°ä¸å¯ä»¥çå°æ¥éï¼ï¼
alert(user); // no such variable (each module has independent variables)let user = "John";<!doctype html>
<script type="module" src="user.js"></script>
<script type="module" src="hello.js"></script>模ååºè¯¥ export å®ä»¬æ³è¦è¢«å¤é¨è®¿é®çå
容ï¼å¹¶ import å®ä»¬æéè¦çå
容ã
user.jsåºè¯¥å¯¼åºuseråéãhello.jsåºè¯¥ä»user.js模åä¸å¯¼å ¥å®ã
æ¢å¥è¯è¯´ï¼å¯¹äºæ¨¡åï¼æä»¬ä½¿ç¨å¯¼å ¥/导åºè䏿¯ä¾èµå ¨å±åéã
è¿æ¯æ£ç¡®çåä½ï¼
import {user} from './user.js';
document.body.innerHTML = user; // Johnexport let user = "John";<!doctype html>
<script type="module" src="hello.js"></script>卿µè§å¨ä¸ï¼å¯¹äº HTML 页é¢ï¼æ¯ä¸ª <script type="module"> é½åå¨ç¬ç«ç顶级ä½ç¨åã
ä¸é¢æ¯åä¸é¡µé¢ä¸çä¸¤ä¸ªèæ¬ï¼é½æ¯ type="module"ãå®ä»¬çä¸å°å½¼æ¤ç顶级åéï¼
<script type="module">
// åéä»
å¨è¿ä¸ª module script å
å¯è§
let user = "John";
</script>
<script type="module">
alert(user); // Error: user is not defined
</script>
卿µè§å¨ä¸ï¼æä»¬å¯ä»¥éè¿å°åéæ¾å¼å°åé
ç» window çä¸ä¸ªå±æ§ï¼ä½¿å
¶æä¸ºçªå£çº§å«çå
¨å±åéãä¾å¦ window.user = "John"ã
è¿æ ·ææèæ¬é½ä¼çå°å®ï¼æ è®ºèæ¬æ¯å¦å¸¦æ type="module"ã
ä¹å°±æ¯è¯´ï¼å建è¿ç§å ¨å±åé并䏿¯ä¸ä¸ªå¥½çæ¹å¼ã请尽éé¿å è¿æ ·åã
模å代ç ä» å¨ç¬¬ä¸æ¬¡å¯¼å ¥æ¶è¢«è§£æ
妿åä¸ä¸ªæ¨¡åè¢«å¯¼å ¥å°å¤ä¸ªå ¶ä»ä½ç½®ï¼é£ä¹å®ç代ç åªä¼æ§è¡ä¸æ¬¡ï¼å³å¨ç¬¬ä¸æ¬¡è¢«å¯¼å ¥æ¶ãç¶åå°å ¶å¯¼åºï¼exportï¼çå 容æä¾ç»è¿ä¸æ¥çå¯¼å ¥ï¼importerï¼ã
åªæ§è¡ä¸æ¬¡ä¼äº§çå¾éè¦çå½±åï¼æä»¬åºè¯¥æè¯å°è¿ä¸ç¹ã
让æä»¬çå 个ä¾åã
é¦å ï¼å¦ææ§è¡ä¸ä¸ªæ¨¡åä¸ç代ç ä¼å¸¦æ¥å¯ä½ç¨ï¼side-effectï¼ï¼ä¾å¦æ¾ç¤ºä¸æ¡æ¶æ¯ï¼é£ä¹å¤æ¬¡å¯¼å ¥å®åªä¼è§¦å䏿¬¡æ¾ç¤º ââ å³ç¬¬ä¸æ¬¡ï¼
// ð alert.js
alert("Module is evaluated!");
// å¨ä¸åçæä»¶ä¸å¯¼å
¥ç¸åçæ¨¡å
// ð 1.js
import `./alert.js`; // Module is evaluated!
// ð 2.js
import `./alert.js`; // (ä»ä¹é½ä¸æ¾ç¤º)
ç¬¬äºæ¬¡å¯¼å ¥ä»ä¹ä¹æ²¡æ¾ç¤ºï¼å 为模åå·²ç»æ§è¡è¿äºã
è¿éæä¸æ¡è§åï¼é¡¶å±æ¨¡å代ç åºè¯¥ç¨äºåå§åï¼å建模åç¹å®çå
鍿°æ®ç»æã妿æä»¬éè¦å¤æ¬¡è°ç¨æäºä¸è¥¿ ââ æä»¬åºè¯¥å°å
¶ä»¥å½æ°çå½¢å¼å¯¼åºï¼å°±åæä»¬å¨ä¸é¢ä½¿ç¨ sayHi 飿 ·ã
ç°å¨ï¼è®©æä»¬çä¸ä¸ªæ´å¤æçä¾åã
æä»¬å设ä¸ä¸ªæ¨¡å导åºäºä¸ä¸ªå¯¹è±¡ï¼
// ð admin.js
export let admin = {
name: "John"
};
妿è¿ä¸ªæ¨¡å被导å
¥å°å¤ä¸ªæä»¶ä¸ï¼æ¨¡åä»
å¨ç¬¬ä¸æ¬¡è¢«å¯¼å
¥æ¶è¢«è§£æï¼å¹¶å建 admin 对象ï¼ç¶åå°å
¶ä¼ å
¥å°ææç导å
¥ã
ææç导å
¥é½åªè·å¾äºä¸ä¸ªå¯ä¸ç admin 对象ï¼
// ð 1.js
import { admin } from './admin.js';
admin.name = "Pete";
// ð 2.js
import { admin } from './admin.js';
alert(admin.name); // Pete
// 1.js å 2.js å¼ç¨çæ¯åä¸ä¸ª admin 对象
// å¨ 1.js ä¸å¯¹å¯¹è±¡åçæ´æ¹ï¼å¨ 2.js ä¸ä¹æ¯å¯è§ç
æ£å¦ä½ æçå°çï¼å½å¨ 1.js ä¸ä¿®æ¹äºå¯¼å
¥ç admin ä¸ç name 屿§æ¶ï¼æä»¬å¨ 2.js ä¸å¯ä»¥çå°æ°ç admin.nameã
è¿æ£æ¯å 为该模ååªæ§è¡äºä¸æ¬¡ãçæå¯¼åºï¼ç¶åè¿äºå¯¼åºå¨å¯¼å
¥ä¹é´å
±äº«ï¼å æ¤å¦ææ´æ¹äº admin 对象ï¼å¨å
¶ä»å¯¼å
¥ä¸ä¹ä¼çå°ã
è¿ç§è¡ä¸ºå®é ä¸é常æ¹ä¾¿ï¼å 为å®å 许æä»¬âé ç½®âæ¨¡åã
æ¢å¥è¯è¯´ï¼æ¨¡åå¯ä»¥æä¾éè¦é ç½®çéç¨åè½ãä¾å¦èº«ä»½éªè¯éè¦åè¯ãé£ä¹æ¨¡åå¯ä»¥å¯¼åºä¸ä¸ªé ç½®å¯¹è±¡ï¼ææå¤é¨ä»£ç å¯ä»¥å¯¹å ¶è¿è¡èµå¼ã
è¿æ¯ç»å ¸çä½¿ç¨æ¨¡å¼ï¼
- 模å导åºä¸äºé ç½®æ¹æ³ï¼ä¾å¦ä¸ä¸ªé 置对象ã
- å¨ç¬¬ä¸æ¬¡å¯¼å ¥æ¶ï¼æä»¬å¯¹å ¶è¿è¡åå§åï¼åå ¥å ¶å±æ§ãå¯ä»¥å¨åºç¨é¡¶çº§èæ¬ä¸è¿è¡æ¤æä½ã
- è¿ä¸æ¥å°å¯¼å ¥ä½¿ç¨æ¨¡åã
ä¾å¦ï¼admin.js 模åå¯è½æä¾äºæäºåè½ï¼ä¾å¦èº«ä»½éªè¯ï¼ï¼ä½å¸æåè¯å¯ä»¥ä»æ¨¡åä¹å¤èµå¼å° config 对象ï¼
// ð admin.js
export let config = { };
export function sayHi() {
alert(`Ready to serve, ${config.user}!`);
}
è¿éï¼admin.js 导åºäº config å¯¹è±¡ï¼æåæ¯ç©ºçï¼ä½ä¹å¯è½æé»è®¤å±æ§ï¼ã
ç¶åï¼å¨ init.js ä¸ï¼æä»¬åºç¨ç第ä¸ä¸ªèæ¬ï¼æä»¬ä» init.js 导å
¥äº config å¹¶è®¾ç½®äº config.userï¼
// ð init.js
import { config } from './admin.js';
config.user = "Pete";
â¦â¦ç°å¨æ¨¡å admin.js å·²ç»æ¯è¢«é
ç½®è¿çäºã
å ¶ä»å¯¼å ¥å¯ä»¥è°ç¨å®ï¼å®ä¼æ£ç¡®æ¾ç¤ºå½åç¨æ·ï¼
// ð another.js
import { sayHi } from './admin.js';
sayHi(); // Ready to serve, Pete!
import.meta
import.meta 对象å
å«å
³äºå½å模åçä¿¡æ¯ã
å®çå 容åå³äºå ¶æå¨çç¯å¢ã卿µè§å¨ç¯å¢ä¸ï¼å®å å«å½åèæ¬ç URLï¼æè 妿宿¯å¨ HTML ä¸çè¯ï¼åå å«å½å页é¢ç URLã
<script type="module">
alert(import.meta.url); // èæ¬ç URL
// 对äºå
èèæ¬æ¥è¯´ï¼åæ¯å½å HTML 页é¢ç URL
</script>
å¨ä¸ä¸ªæ¨¡åä¸ï¼âthisâ æ¯ undefined
è¿æ¯ä¸ä¸ªå°åè½ï¼ä½ä¸ºäºå®æ´æ§ï¼æä»¬åºè¯¥æå°å®ã
å¨ä¸ä¸ªæ¨¡åä¸ï¼é¡¶çº§ this æ¯ undefinedã
å°å
¶ä¸é模åèæ¬è¿è¡æ¯è¾ä¼åç°ï¼é模åèæ¬ç顶级 this æ¯å
¨å±å¯¹è±¡ï¼
<script>
alert(this); // window
</script>
<script type="module">
alert(this); // undefined
</script>
æµè§å¨ç¹å®åè½
ä¸å¸¸è§èæ¬ç¸æ¯ï¼æ¥æ type="module" æ è¯çèæ¬æä¸äºç¹å®äºæµè§å¨çå·®å¼ã
å¦æä½ æ¯ç¬¬ä¸æ¬¡é 读æè ä½ ä¸æç®å¨æµè§å¨ä¸ä½¿ç¨ JavaScriptï¼é£ä¹ä½ å¯ä»¥è·³è¿æ¬èå 容ã
模åèæ¬æ¯å»¶è¿ç
模åèæ¬ æ»æ¯ 被延è¿çï¼ä¸ defer ç¹æ§ï¼å¨ èæ¬ï¼asyncï¼defer ä¸ç« ä¸æè¿°çï¼å¯¹å¤é¨èæ¬åå
èèæ¬ï¼inline scriptï¼çå½±åç¸åã
ä¹å°±æ¯è¯´ï¼
- ä¸è½½å¤é¨æ¨¡åèæ¬
<script type="module" src="...">ä¸ä¼é»å¡ HTML çå¤çï¼å®ä»¬ä¼ä¸å ¶ä»èµæºå¹¶è¡å è½½ã - 模åèæ¬ä¼çå° HTML ææ¡£å®å ¨åå¤å°±ç»ªï¼å³ä½¿å®ä»¬å¾å°å¹¶ä¸æ¯ HTML å è½½é度æ´å¿«ï¼ï¼ç¶åæä¼è¿è¡ã
- ä¿æèæ¬çç¸å¯¹é¡ºåºï¼å¨ææ¡£ä¸æå¨åé¢çèæ¬å æ§è¡ã
å®çä¸ä¸ªå¯ä½ç¨æ¯ï¼æ¨¡åèæ¬æ»æ¯ä¼âçå°âå·²å®å ¨å è½½ç HTML 页é¢ï¼å æ¬å¨å®ä»¬ä¸æ¹ç HTML å ç´ ã
ä¾å¦ï¼
<script type="module">
alert(typeof button); // objectï¼èæ¬å¯ä»¥âçè§âä¸é¢ç button
// å ä¸ºæ¨¡åæ¯è¢«å»¶è¿çï¼deferredï¼æä»¥æ¨¡åèæ¬ä¼å¨æ´ä¸ªé¡µé¢å è½½å®æåæè¿è¡
</script>
ç¸è¾äºä¸é¢è¿ä¸ªå¸¸è§èæ¬ï¼
<script>
alert(typeof button); // button 为 undefinedï¼èæ¬çä¸å°ä¸é¢çå
ç´
// 常è§èæ¬ä¼ç«å³è¿è¡ï¼å¸¸è§èæ¬çè¿è¡æ¯å¨å¨å¤ç页é¢çå
¶ä½é¨åä¹åè¿è¡ç
</script>
<button id="button">Button</button>
请注æï¼ä¸é¢ç第äºä¸ªèæ¬å®é
ä¸è¦å
äºåä¸ä¸ªèæ¬è¿è¡ï¼æä»¥æä»¬ä¼å
çå° undefinedï¼ç¶åææ¯ objectã
è¿æ¯å 为模åèæ¬æ¯è¢«å»¶è¿çï¼æä»¥è¦çå° HTML ææ¡£è¢«å¤ç宿æä¼æ§è¡å®ãè常è§èæ¬åä¼ç«å³è¿è¡ï¼æä»¥æä»¬ä¼å çå°å¸¸è§èæ¬çè¾åºã
å½ä½¿ç¨æ¨¡åèæ¬æ¶ï¼æä»¬åºè¯¥ç¥é HTML 页é¢å¨å è½½æ¶å°±ä¼æ¾ç¤ºåºæ¥ï¼å¨ HTML 页é¢å è½½å®æåæä¼æ§è¡ JavaScript 模åï¼å æ¤ç¨æ·å¯è½ä¼å¨ JavaScript åºç¨ç¨åºåå¤å¥½ä¹åçå°è¯¥é¡µé¢ãæäºåè½å¯è½è¿æ æ³ä½¿ç¨ãæä»¬åºè¯¥æ¾ç½®âå è½½æç¤ºå¨ï¼loading indicatorï¼âï¼æè ä»¥å ¶ä»æ¹å¼ç¡®ä¿è®¿é®è ä¸ä¼å æ¤èæå°å°æã
Async éç¨äºå èèæ¬ï¼inline scriptï¼
对äºé模åèæ¬ï¼async ç¹æ§ï¼attributeï¼ä»
éç¨äºå¤é¨èæ¬ã弿¥èæ¬ä¼å¨åå¤å¥½åç«å³è¿è¡ï¼ç¬ç«äºå
¶ä»èæ¬æ HTML ææ¡£ã
å¯¹äºæ¨¡åèæ¬ï¼å®ä¹éç¨äºå èèæ¬ã
ä¾å¦ï¼ä¸é¢çå
èèæ¬å
·æ async ç¹æ§ï¼å æ¤å®ä¸ä¼çå¾
ä»»ä½ä¸è¥¿ã
宿§è¡å¯¼å
¥ï¼fetch ./analytics.jsï¼ï¼å¹¶å¨å¯¼å
¥å®ææ¶è¿è¡ï¼å³ä½¿ HTML ææ¡£è¿æªå®æï¼æè
å
¶ä»èæ¬ä»å¨çå¾
å¤çä¸ã
è¿å¯¹äºä¸ä¾èµä»»ä½å ¶ä»ä¸è¥¿çåè½æ¥è¯´æ¯é常æ£çï¼ä¾å¦è®¡æ°å¨ï¼å¹¿åï¼ææ¡£çº§äºä»¶çå¬å¨ã
<!-- ææä¾èµé½è·å宿ï¼analytics.jsï¼ç¶åèæ¬å¼å§è¿è¡ -->
<!-- ä¸ä¼çå¾
HTML ææ¡£æè
å
¶ä» <script> æ ç¾ -->
<script async type="module">
import {counter} from './analytics.js';
counter.count();
</script>
å¤é¨èæ¬
å
·æ type="module" çå¤é¨èæ¬ï¼external scriptï¼å¨ä¸¤ä¸ªæ¹é¢ææä¸åï¼
-
å ·æç¸å
srcçå¤é¨èæ¬ä» è¿è¡ä¸æ¬¡ï¼<!-- èæ¬ my.js 被å è½½å®æï¼fetchedï¼å¹¶åªè¢«è¿è¡ä¸æ¬¡ --> <script type="module" src="my.js"></script> <script type="module" src="my.js"></script> -
ä»å¦ä¸ä¸ªæºï¼ä¾å¦å¦ä¸ä¸ªç½ç«ï¼è·åçå¤é¨èæ¬éè¦ CORS headerï¼å¦æä»¬å¨ Fetchï¼è·¨æºè¯·æ± ä¸ç« ä¸æè®²ç飿 ·ãæ¢å¥è¯è¯´ï¼å¦æä¸ä¸ªæ¨¡åèæ¬æ¯ä»å¦ä¸ä¸ªæºè·åçï¼åè¿ç¨æå¡å¨å¿ é¡»æä¾è¡¨ç¤ºå 许è·åç header
Access-Control-Allow-Originã<!-- another-site.com å¿ é¡»æä¾ Access-Control-Allow-Origin --> <!-- å¦åï¼èæ¬å°æ æ³æ§è¡ --> <script type="module" src="http://another-site.com/their.js"></script>é»è®¤è¿æ ·åå¯ä»¥ç¡®ä¿æ´å¥½çå®å ¨æ§ã
ä¸å 许裸模åï¼âbareâ moduleï¼
卿µè§å¨ä¸ï¼import å¿
é¡»ç»åºç¸å¯¹æç»å¯¹ç URL è·¯å¾ã没æä»»ä½è·¯å¾ç模å被称为â裸ï¼bareï¼â模åãå¨ import ä¸ä¸å
许è¿ç§æ¨¡åã
ä¾å¦ï¼ä¸é¢è¿ä¸ª import æ¯æ æçï¼
import {sayHi} from 'sayHi'; // Errorï¼âè£¸âæ¨¡å
// 模åå¿
é¡»æä¸ä¸ªè·¯å¾ï¼ä¾å¦ './sayHi.js' æè
å
¶ä»ä»»ä½è·¯å¾
æäºç¯å¢ï¼å Node.js æè æå å·¥å ·ï¼bundle toolï¼å 许没æä»»ä½è·¯å¾ç裸模åï¼å 为å®ä»¬æèªå·±çæ¥æ¾æ¨¡åçæ¹æ³åé©åï¼hookï¼æ¥å¯¹å®ä»¬è¿è¡å¾®è°ã使¯æµè§å¨å°ä¸æ¯æè£¸æ¨¡åã
å ¼å®¹æ§ï¼ânomoduleâ
æ§æ¶çæµè§å¨ä¸çè§£ type="module"ãæªç¥ç±»åçèæ¬ä¼è¢«å¿½ç¥ã对æ¤ï¼æä»¬å¯ä»¥ä½¿ç¨ nomodule ç¹æ§æ¥æä¾ä¸ä¸ªåå¤ï¼
<script type="module">
alert("Runs in modern browsers");
</script>
<script nomodule>
alert("Modern browsers know both type=module and nomodule, so skip this")
alert("Old browsers ignore script with unknown type=module, but execute this.");
</script>
æå»ºå·¥å ·
å¨å®é å¼åä¸ï¼æµè§å¨æ¨¡åå¾å°è¢«ä»¥âåå§âå½¢å¼è¿è¡ä½¿ç¨ãéå¸¸ï¼æä»¬ä¼ä½¿ç¨ä¸äºç¹æ®å·¥å ·ï¼ä¾å¦ Webpackï¼å°å®ä»¬æå å¨ä¸èµ·ï¼ç¶åé¨ç½²å°ç产ç¯å¢çæå¡å¨ã
ä½¿ç¨æå å·¥å ·çä¸ä¸ªå¥½å¤æ¯ ââ å®ä»¬å¯ä»¥æ´å¥½å°æ§å¶æ¨¡åçè§£ææ¹å¼ï¼å 许æä»¬ä½¿ç¨è£¸æ¨¡ååæ´å¤çåè½ï¼ä¾å¦ CSS/HTML 模åçã
æå»ºå·¥å ·å以ä¸è¿äºäºå¿ï¼
- ä»ä¸ä¸ªæç®æ¾å¨ HTML ä¸ç
<script type="module">âä¸»âæ¨¡åå¼å§ã - åæå®çä¾èµï¼å®çå¯¼å ¥ï¼ä»¥åå®çå¯¼å ¥çå¯¼å ¥çã
- ä½¿ç¨æææ¨¡åæå»ºä¸ä¸ªæä»¶ï¼æè
å¤ä¸ªæä»¶ï¼è¿æ¯å¯è°çï¼ï¼å¹¶ç¨æå
彿°ï¼bundler functionï¼æ¿ä»£åçç
importè°ç¨ï¼ä»¥ä½¿å ¶æ£å¸¸å·¥ä½ãè¿æ¯æå HTML/CSS 模åçâç¹æ®âçæ¨¡åç±»åã - å¨å¤çè¿ç¨ä¸ï¼å¯è½ä¼åºç¨å
¶ä»è½¬æ¢åä¼åï¼
- å 餿 æ³è®¿é®ç代ç ã
- å 餿ªä½¿ç¨ç导åºï¼âtree-shakingâï¼ã
- å é¤ç¹å®äºå¼åçå
consoleådebuggerè¿æ ·çè¯å¥ã - å¯ä»¥ä½¿ç¨ Babel å°å沿çç°ä»£ç JavaScript è¯æ³è½¬æ¢ä¸ºå ·æç±»ä¼¼åè½çæ§ç JavaScript è¯æ³ã
- å缩çæçæä»¶ï¼å é¤ç©ºæ ¼ï¼ç¨ççååæ¿æ¢åéçï¼ã
妿æä»¬ä½¿ç¨æå
å·¥å
·ï¼é£ä¹èæ¬ä¼è¢«æå
è¿ä¸ä¸ªåä¸æä»¶ï¼æè
å 个æä»¶ï¼ï¼å¨è¿äºèæ¬ä¸ç import/export è¯å¥ä¼è¢«æ¿æ¢æç¹æ®çæå
彿°ï¼bundler functionï¼ãå æ¤ï¼æç»æå
好çèæ¬ä¸ä¸å
å«ä»»ä½ import/exportï¼å®ä¹ä¸éè¦ type="module"ï¼æä»¬å¯ä»¥å°å
¶æ¾å
¥å¸¸è§ç <script>ï¼
<!-- å设æä»¬ä»è¯¸å¦ Webpack è¿ç±»çæå
å·¥å
·ä¸è·å¾äº "bundle.js" èæ¬ -->
<script src="bundle.js"></script>
å ³äºæå»ºå·¥å ·è¯´äºè¿ä¹å¤ï¼ä½å ¶å®åçæ¨¡å乿¯å¯ä»¥ç¨çãæä»¥ï¼æä»¬å¨è¿å¿å°ä¸ä¼ä½¿ç¨ Webpackï¼ä½ å¯ä»¥ç¨ååé ç½®å®ã
æ»ç»
ä¸é¢æ»ç»ä¸ä¸æ¨¡åçæ ¸å¿æ¦å¿µï¼
- ä¸ä¸ªæ¨¡åå°±æ¯ä¸ä¸ªæä»¶ãæµè§å¨éè¦ä½¿ç¨
<script type="module">以使import/exportå¯ä»¥å·¥ä½ã模åï¼è¯æ³¨ï¼ç¸è¾äºå¸¸è§èæ¬ï¼æå ç¹å·®å«ï¼- é»è®¤æ¯å»¶è¿è§£æçï¼deferredï¼ã
- Async å¯ç¨äºå èèæ¬ã
- è¦ä»å¦ä¸ä¸ªæºï¼å/åè®®/端å£ï¼å è½½å¤é¨èæ¬ï¼éè¦ CORS headerã
- éå¤çå¤é¨èæ¬ä¼è¢«å¿½ç¥
- 模åå
·æèªå·±çæ¬å°é¡¶çº§ä½ç¨åï¼å¹¶å¯ä»¥éè¿
import/export交æ¢åè½ã - 模åå§ç»ä½¿ç¨
use strictã - 模å代ç åªæ§è¡ä¸æ¬¡ã导åºä» åå»ºä¸æ¬¡ï¼ç¶åä¼å¨å¯¼å ¥ä¹é´å ±äº«ã
å½æä»¬ä½¿ç¨æ¨¡åæ¶ï¼æ¯ä¸ªæ¨¡åé½ä¼å®ç°ç¹å®åè½å¹¶å°å
¶å¯¼åºãç¶åæä»¬ä½¿ç¨ import å°å
¶ç´æ¥å¯¼å
¥å°éè¦çå°æ¹å³å¯ãæµè§å¨ä¼èªå¨å 载并解æèæ¬ã
å¨ç产ç¯å¢ä¸ï¼åºäºæ§è½åå ¶ä»åå ï¼å¼åè ç»å¸¸ä½¿ç¨è¯¸å¦ Webpack ä¹ç±»çæå å·¥å ·å°æ¨¡åæå å°ä¸èµ·ã
å¨ä¸ä¸ç« éï¼æä»¬å°ä¼çå°æ´å¤å ³äºæ¨¡åçä¾åï¼ä»¥åå¦ä½è¿è¡å¯¼å ¥/导åºã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼