模ååçèæ¯
JavaScript ç¨åºæ¬æ¥å¾å°ââ卿©æï¼å®ä»¬å¤§å¤è¢«ç¨æ¥æ§è¡ç¬ç«çèæ¬ä»»å¡ï¼å¨ä½ ç web 页é¢éè¦çå°æ¹æä¾ä¸å®äº¤äºï¼æä»¥ä¸è¬ä¸éè¦å¤å¤§çèæ¬ãè¿äºå å¹´ï¼æä»¬ç°å¨æäºè¿è¡å¤§é JavaScript èæ¬ç夿ç¨åºï¼è¿æä¸äºè¢«ç¨å¨å ¶ä»ç¯å¢ï¼ä¾å¦ Node.jsï¼ã
夿ç项ç®éè¦ä¸ç§å° JavaScript ç¨åºæåä¸ºå¯æéå¯¼å ¥çåç¬æ¨¡åçæºå¶ãNode.js å·²ç»æä¾è¿ä¸ªè½åå¾é¿æ¶é´äºï¼è¿æå¾å¤ç JavaScript åºåæ¡æ¶å·²ç»å¼å§äºæ¨¡åç使ç¨ï¼ä¾å¦ï¼CommonJS ååºäº AMD çå ¶ä»æ¨¡åç³»ç»ï¼å¦ RequireJSãwebpack å Babelï¼ã
ææç°ä»£æµè§å¨é½åçæ¯ææ¨¡åç¹æ§ï¼æ é转è¯ãè¿æ¯ä¸ä»¶å¥½äºââæµè§å¨å¯ä»¥ä¼å模åçå è½½ï¼ä½¿å ¶æ¯ä½¿ç¨åºè¿è¡ææé¢å¤ç客æ·ç«¯å¤çåé¢å¤çç½ç»å¼éæ´é«æãä¸è¿ï¼è¿å¹¶ä¸æå³çå webpack è¿æ ·çæå å·¥å ·å°±è¿æ¶äºââæå å·¥å ·ä»ç¶å¨å°ä»£ç å岿åç大å°çåæ¹é¢åå¾å¾å¥½ï¼å¹¶ä¸è½å¤è¿è¡å ¶ä»ä¼åï¼å¦æç®åãæ ç¨ä»£ç æ¶é¤åææ ä¼åã
ä»ç»ä¸ä¸ªä¾å
ä¸ºäºæ¼ç¤ºæ¨¡åç使ç¨ï¼æä»¬å建äºä¸ç³»åç®åç示ä¾ï¼ä½ å¯ä»¥å¨ GitHub 䏿¾å°ãè¿ä¸ªä¾åæ¼ç¤ºäºä¸ä¸ªç®åçæ¨¡åéåï¼ç¨æ¥å¨ web 页é¢ä¸å建äºä¸ä¸ª <canvas> æ ç¾ï¼å¨ canvas ä¸ç»å¶ï¼å¹¶è®°å½æå
³çä¿¡æ¯ï¼ä¸åå½¢ç¶ã
è¿çç¡®æç¹ç®åï¼ä½æ¯ä¿æè¶³å¤ç®åè½å¤æ¸ æ°å°æ¼ç¤ºæ¨¡åã
夿³¨ï¼å¦æä½ æ³å»ä¸è½½è¿ä¸ªä¾å卿¬å°è¿è¡ï¼ä½ éè¦éè¿æ¬å° web æå¡å¨å»è¿è¡ã
åºæ¬çç¤ºä¾æä»¶çç»æ
卿们ç第ä¸ä¸ªä¾åï¼åè§ basic-modulesï¼æä»¶ç»æå¦ä¸ï¼
index.html
main.js
modules/
canvas.js
square.js
夿³¨ï¼å¨è¿ä¸ªæå䏿æç¤ºä¾é½å ·æåºæ¬ç¸åçç»æï¼éè¦æ ¢æ ¢çæä¸é¢çå 容ã
modules ç®å½ä¸ç两个模åçæè¿°å¦ä¸ï¼
-
canvas.jsââå å«ä¸è®¾ç½®ç»å¸ç¸å ³çåè½ï¼create()ââå¨æå® ID çå è£ å¨<div>å å建æå®widthåheightçç»å¸ï¼è¯¥ ID æ¬èº«éå 卿å®çç¶å ç´ å ãè¿åå å«ç»å¸ç 2D ä¸ä¸æåå è£ å¨ ID ç对象ãcreateReportList()ââå建ä¸ä¸ªæ åºå表ï¼å¹¶å°å ¶æ·»å å°æå®çå è£ å ç´ å ï¼è¯¥å表å¯ç¨äºè¾åºæ¥åæ°æ®ãè¿åå表ç IDã
-
square.jsââå å«ï¼nameââå å«å符串âsquareâç常éãdraw()ââ卿å®ç»å¸ä¸ç»å¶ä¸ä¸ªæ£æ¹å½¢ï¼å ·ææå®ç大å°ï¼ä½ç½®åé¢è²ãè¿åå 嫿£æ¹å½¢å¤§å°ï¼ä½ç½®åé¢è²ç对象ãreportArea()ââå¨ç»å®é¿åº¦çæ åµä¸ï¼å°æ£æ¹å½¢åºååå ¥ç¹å®æ¥åå表ãreportPerimeter()ââå¨ç»å®é¿åº¦çæ åµä¸ï¼å°æ£æ¹å½¢çå¨é¿åå ¥ç¹å®çæ¥åå表ã
.mjs ä¸ .js
çºµè§æ¤æï¼æä»¬ä½¿ç¨ .js æ©å±åçæ¨¡åæä»¶ï¼ä½å¨å
¶ä»ä¸äºæç« ä¸ï¼ä½ å¯è½ä¼çå° .mjs æ©å±åç使ç¨ãV8 æ¨èäºè¿æ ·çåæ³ï¼æ¯å¦æä¸åçç±ï¼
- æ¯è¾æ¸ æ°ï¼è¿å¯ä»¥æåºåªäºæä»¶æ¯æ¨¡åï¼åªäºæ¯å¸¸è§ç JavaScriptã
- è¿è½ä¿è¯ä½ çæ¨¡åå¯ä»¥è¢«è¿è¡æ¶ç¯å¢åæå»ºå·¥å ·è¯å«ï¼æ¯å¦ Node.js å Babelã
使¯æä»¬å³å®ç»§ç»ä½¿ç¨ .js æ©å±åï¼æªæ¥å¯è½ä¼æ´æ¹ã为äºä½¿æ¨¡åå¯ä»¥å¨æµè§å¨ä¸æ£å¸¸å°å·¥ä½ï¼ä½ éè¦ç¡®ä¿ä½ çæå¡å¨è½å¤æ£å¸¸å°å¤ç Content-Type æ 头ï¼å
¶åºè¯¥å
å« JavaScript ç MIME ç±»å text/javascriptãå¦ææ²¡æè¿ä¹åï¼ä½ å¯è½ä¼å¾å°ä¸ä¸ªä¸¥æ ¼ MIME ç±»åæ£æ¥é误ï¼âThe server responded with a non-JavaScript MIME typeï¼æå¡å¨è¿åäºé JavaScript MIME ç±»åï¼âï¼å¹¶ä¸æµè§å¨ä¼æç»æ§è¡ç¸åºç JavaScript 代ç ã夿°æå¡å¨å¯ä»¥æ£ç¡®å°å¤ç .js æä»¶çç±»åï¼ä½æ¯ .mjs è¿ä¸è¡ãå·²ç»å¯ä»¥æ£å¸¸ååº .mjs çæå¡å¨æ GitHub Pages å Node.js ç http-serverã
å¦æä½ å·²ç»å¨ä½¿ç¨ç¸åºçç¯å¢äºï¼é£ä¹ä¸åæ£å¸¸ãæè
å¦æä½ è¿æ²¡æï¼ä½ä½ ç¥éä½ å¨åä»ä¹ï¼æ¯å¦ä½ å¯ä»¥é
ç½®æå¡å¨ä»¥ä¸º .mjs 设置æ£ç¡®ç Content-Typeï¼ãä½å¦æä½ ä¸è½æ§å¶æä¾æå¡ï¼æè
ç¨äºå
¬å¼æä»¶åå¸çæå¡å¨ï¼è¿å¯è½ä¼å¯¼è´æ··ä¹±ã
为äºå¦ä¹ åä¿è¯ä»£ç çå¯ç§»æ¤çç®çï¼æä»¬å»ºè®®ä½¿ç¨ .jsã
å¦æä½ è®¤ä¸ºä½¿ç¨ .mjs ä»
ç¨äºæ¨¡å带æ¥çæ¸
æ°æ§é常éè¦ï¼ä½ä¸æ³å¼å
¥ä¸é¢æè¿°çç¸åºé®é¢ï¼ä½ å¯ä»¥ä»
å¨å¼åè¿ç¨ä¸ä½¿ç¨ .mjsï¼èå¨æå»ºè¿ç¨ä¸å°å
¶è½¬æ¢ä¸º .jsã
è¿å¼å¾æ³¨æçæ¯ï¼
- ä¸äºå·¥å
·å¯è½ä¸æ¯æ
.mjsã <script type="module">屿§ç¨äºæç¤ºå¼å ¥ç模åï¼ä½ ä¼å¨ä¸é¢çå°ã
å¯¼åºæ¨¡åçåè½
为äºè·å¾æ¨¡åçåè½ï¼è¦åç第ä¸ä»¶äºå°±æ¯æå®ä»¬å¯¼åºæ¥ãè¿å¯ä»¥ä½¿ç¨ export è¯å¥æ¥å®æã
æç®åçæ¹æ³æ¯æ export æ¾å°ä½ æ³è¦å¯¼åºç项åé¢ï¼æ¯å¦ï¼
export const name = "square";
export function draw(ctx, length, x, y, color) {
ctx.fillStyle = color;
ctx.fillRect(x, y, length, length);
return { length, x, y, color };
}
ä½ è½å¤å¯¼åºå½æ° varãletãconst åçä¼çå°çç±»ãexport è¦æ¾å¨æå¤å±ï¼æ¯å¦ä½ ä¸è½å¤å¨å½æ°å
ä½¿ç¨ exportã
æ´æ¹ä¾¿çå¯¼åºæ¨¡åçæ¹æ³æ¯ï¼å¨æ¨¡åæä»¶æ«å°¾ä½¿ç¨ä¸ä¸ª export è¯å¥ï¼ä»¥è±æ¬å·æ¬èµ·æ¥å¹¶ç¨éå·åéçå½¢å¼ååºææé导åºçåè½ãæ¯å¦ï¼
export { name, draw, reportArea, reportPerimeter };
å¯¼å ¥åè½å°ä½ çèæ¬
仿¨¡åä¸å¯¼åºä¸äºåè½åï¼ä½ éè¦å°å®ä»¬å¯¼å ¥å°èæ¬ä¸æè½ä½¿ç¨ãæç®åçæ¹æ³å¦ä¸æç¤ºï¼
import { name, draw, reportArea, reportPerimeter } from "./modules/square.js";
ä½ å¯ä»¥ä½¿ç¨ import è¯å¥ï¼ç¶åç¨è±æ¬å·æ¬èµ·æ¥çç¨éå·åå²çåè½å表ï¼ç¶åæ¯å
³é®å fromï¼ç¶åæ¯æ¨¡åæ è¯ç¬¦ï¼module specifierï¼ã
æ¨¡åæ è¯ç¬¦æä¾ä¸ä¸ª JavaScript ç¯å¢å¯ä»¥è§£æä¸ºæ¨¡åæä»¶è·¯å¾çå符串ã卿µè§å¨ä¸ï¼å®å¯ä»¥æ¯ä¸ä¸ªç¸å¯¹äºç«ç¹æ ¹ç®å½çè·¯å¾ï¼å¯¹äºæä»¬ç basic-modules ç¤ºä¾æ¥è¯´æ¯ /js-examples/module-examples/basic-modulesã使¯ï¼è¿éæä»¬ä½¿ç¨ç¹ï¼.ï¼è¯æ³æ¥è¡¨ç¤ºâå½åä½ç½®âï¼ç¶åç´§è·çæä»¬æ³è¦æ¾çæä»¶çç¸å¯¹è·¯å¾ãè¿æ¯æ¯æ¬¡é½è¦å䏿´ä¸ªç»å¯¹è·¯å¾è¦å¥½å¾å¤ï¼å 为ç¸å¯¹è·¯å¾æ´çï¼å¹¶ä¸ä½¿ URL å¯ç§»æ¤ââå¦æä½ å°å
¶ç§»å¨ç«ç¹ç®å½ä¸çå
¶ä»ä½ç½®ï¼è¯¥ç¤ºä¾ä»ç¶ææã
ä¾å¦ï¼
/js-examples/module-examples/basic-modules/modules/square.js
åæäº
./modules/square.js
ä½ å¯ä»¥å¨ main.js ä¸çå°è¿äºã
夿³¨ï¼å¨æäºæ¨¡åç³»ç»ä¸ï¼æ¨¡åçè·¯å¾ä¸æ¯ç¸å¯¹æç»å¯¹è·¯å¾ï¼å¹¶ä¸æ²¡ææä»¶æ©å±åï¼æ¯å¦ modules/squareãå¦æä½ å®ä¹äºå¯¼å
¥æ å°ï¼åå¯ä»¥å¨æµè§å¨ç¯å¢ä¸ä½¿ç¨è¿ç§è¯æ³ã
å ä¸ºä½ å¯¼å
¥äºè¿äºåè½å°ä½ çèæ¬æä»¶ï¼ä½ å¯ä»¥åå®ä¹å¨ç¸åçæä»¶ä¸ä¸æ ·å»ä½¿ç¨å®ãä¸é¢å±ç¤ºçæ¯å¨ main.js ä¸ç import è¯å¥ä¸é¢çå
容ï¼
const myCanvas = create("myCanvas", document.body, 480, 320);
const reportList = createReportList(myCanvas.id);
const square1 = draw(myCanvas.ctx, 50, 50, 100, "blue");
reportArea(square1.length, reportList);
reportPerimeter(square1.length, reportList);
夿³¨ï¼å¯¼å
¥ç弿¯è¢«å¯¼åºçåè½çåªè¯»è§å¾ãç±»ä¼¼äº const åéï¼ä½ ä¸è½éæ°åé
导å
¥çåéï¼ä½ä½ ä»ç¶å¯ä»¥ä¿®æ¹å¯¹è±¡å¼ç屿§ãåªææ¨¡å导åºå®æè½éæ°åé
å¼ãæ¥ç import åèäºè§£æ´å¤ä¿¡æ¯ã
使ç¨å¯¼å ¥æ å°å¯¼å ¥æ¨¡å
ä¸é¢æä»¬çå°æµè§å¨å¦ä½ä½¿ç¨æ¨¡åæ è¯ç¬¦ï¼å¯ä»¥ä¸ºç»å¯¹ URLï¼æä½¿ç¨ææ¡£çåºç¡ URL è§£æçç¸å¯¹ URLï¼å¯¼å ¥æ¨¡åï¼
import { name as squareName, draw } from "./shapes/square.js";
import { name as circleName } from "https://example.com/shapes/circle.js";
å¯¼å ¥æ å°å 许å¼åè å¨å¯¼å ¥æ¨¡åæ¶æå®å ä¹ä»»ä½ææ¬ï¼æ å°æä¾äºä¸ä¸ªç¸åºçå¼ï¼å½æ¨¡å URL è¢«è§£ææ¶å°æ¿æ¢ææ¬ã
ä¾å¦ï¼ä¸é¢å¯¼å
¥æ å°ä¸ç imports é®å®ä¹äºä¸ä¸ªâæ¨¡åæ è¯ç¬¦æ å°âJSON 对象ï¼å
¶ä¸å±æ§åç§°å¯ä»¥ç¨ä½æ¨¡åæ è¯ç¬¦ï¼å½æµè§å¨è§£ææ¨¡å URL æ¶ï¼ç¸åºçå¼å°è¢«æ¿æ¢ãè¿äºå¼å¿
é¡»æ¯ç»å¯¹æç¸å¯¹ URLãä½¿ç¨ææ¡£å
å«å¯¼å
¥æ å°çåºç¡ URL å°ç¸å¯¹ URL è§£æä¸ºç»å¯¹ URLã
<script type="importmap">
{
"imports": {
"shapes": "./shapes/square.js",
"shapes/square": "./modules/shapes/square.js",
"https://example.com/shapes/square.js": "./shapes/square.js",
"https://example.com/shapes/": "/shapes/square/",
"../shapes/square": "./shapes/square.js"
}
}
</script>
导å
¥æ å°æ¯å¨ä¸ä¸ª <script> å
ç´ ä¸å®ä¹ç JSON 对象ï¼type 屿§è®¾ç½®ä¸º importmapãææ¡£ä¸åªè½æä¸ä¸ªå¯¼å
¥æ å°ï¼å 为å®ç¨äºè§£æéæå卿坼å
¥ç模åï¼æä»¥å¿
é¡»å¨å¯¼å
¥æ¨¡åçä»»ä½ <script> å
ç´ ä¹å声æã请注æï¼å¯¼å
¥æ å°ä»
éç¨äºææ¡£ââè§è䏿¶µçå¦ä½å¨ worker æ worklet ä¸ä¸æä¸åºç¨å¯¼å
¥æ å°ã
éè¿è¿ä¸ªæ å°ï¼ä½ ç°å¨å¯ä»¥ä½¿ç¨ä¸é¢ç屿§åç§°ä½ä¸ºæ¨¡åæ è¯ç¬¦ãå¦ææ¨¡åæ è¯ç¬¦å°¾é¨æ²¡æææ ï¼é£ä¹æ´ä¸ªæ¨¡åæ è¯ç¬¦å°è¢«å¹é åæ¿æ¢ãä¾å¦ï¼ä¸é¢æä»¬å¹é 裸模ååç§°ï¼å¹¶å°ä¸ä¸ª URL éå®åå°å¦ä¸ä¸ªè·¯å¾ã
// 裸模ååç§°ä½ä¸ºæ¨¡åæ è¯ç¬¦
import { name as squareNameOne } from "shapes";
import { name as squareNameTwo } from "shapes/square";
// éæ°æ å°ä¸ä¸ª URL å°å¦ä¸ä¸ª URL
import { name as squareNameThree } from "https://example.com/shapes/square.js";
å¦ææ¨¡åæ è¯ç¬¦å°¾é¨æä¸ä¸ªææ ï¼é£ä¹å¼ä¹å¿ é¡»æä¸ä¸ªï¼é®å°è¢«å¹é 为âè·¯å¾åç¼âãè¿å è®¸éæ°æ å°æ´ä¸ª URL çç±»å«ã
// éæ°æ å°ä¸ä¸ª URL ä½ä¸ºåç¼ ( https://example.com/shapes/)
import { name as squareNameFour } from "https://example.com/shapes/moduleshapes/square.js";
å¨å¯¼å
¥æ å°ä¸ï¼å¯è½æå¤ä¸ªé®å¯ä»¥å¹é
ä¸ä¸ªæ¨¡åæ è¯ç¬¦ãä¾å¦ï¼æ¨¡åæ è¯ç¬¦ shapes/circle/ å¯ä»¥å¹é
æ¨¡åæ è¯ç¬¦é® shapes/ å shapes/circle/ãå¨è¿ç§æ
åµä¸ï¼æµè§å¨å°éæ©æå
·ä½ï¼æé¿ï¼çå¹é
æ¨¡åæ è¯ç¬¦é®ã
å¯¼å ¥æ å°å 许使ç¨è£¸æ¨¡ååç§°ï¼å¦å¨ Node.js ä¸ï¼å¯¼å ¥æ¨¡åï¼è¿å¯ä»¥æ¨¡æä»å ä¸å¯¼å ¥æ¨¡åï¼æ 论æ¯å¦å¸¦ææä»¶æ©å±åãè½ç¶ä¸é¢æ²¡ææ¾ç¤ºï¼ä½å®ä»¬è¿å è®¸æ ¹æ®å¯¼å ¥æ¨¡åçèæ¬è·¯å¾å¯¼å ¥ç¹å®çæ¬çåºãé常ï¼å®ä»¬ä½¿å¼å人åè½å¤ç¼åæ´ç¬¦å人ä½å·¥ç¨å¦çå¯¼å ¥ä»£ç ï¼å¹¶æ´å®¹æç®¡çç«ç¹ä½¿ç¨ç模åçä¸åçæ¬åä¾èµå ³ç³»ãè¿å¯ä»¥åå°å¨æµè§å¨åæå¡å¨ä¸ä½¿ç¨ç¸å JavaScript åºæéçå·¥ä½éã
以ä¸ç« è详ç»ä»ç»äºä¸è¿°çåç§åè½ã
ç¹æ§æ£æµ
ä½ å¯ä»¥ä½¿ç¨ HTMLScriptElement.supports() éææ¹æ³ï¼å®æ¬èº«ä¹å¾å°äºå¹¿æ³æ¯æï¼æ¥æ£æ¥æ¯å¦æ¯æå¯¼å
¥æ å°ï¼
if (HTMLScriptElement.supports?.("importmap")) {
console.log("æµè§å¨æ¯æå¯¼å
¥æ å°ã");
}
以裸åç§°å¯¼å ¥æ¨¡å
å¨ä¸äº JavaScript ç¯å¢ä¸ï¼ä¾å¦ Node.jsï¼ä½ å¯ä»¥ä½¿ç¨è£¸åç§°ä½ä¸ºæ¨¡åæ è¯ç¬¦ãè¿æ¯å 为ç¯å¢å¯ä»¥å°æ¨¡ååç§°è§£æå°æä»¶ç³»ç»ä¸çæ åä½ç½®ãä¾å¦ï¼ä½ å¯ä»¥ä½¿ç¨ä»¥ä¸è¯æ³æ¥å¯¼å ¥âsquareâæ¨¡åã
import { name, draw, reportArea, reportPerimeter } from "square";
è¦å¨æµè§å¨ä¸ä½¿ç¨è£¸åç§°ï¼ä½ éè¦ä¸ä¸ªå¯¼å
¥æ å°ï¼å®æä¾äºæµè§å¨è§£ææ¨¡åæ è¯ç¬¦å° URL æéçä¿¡æ¯ï¼å¦æ JavaScript å°è¯å¯¼å
¥æ æ³è§£æå°æ¨¡åä½ç½®çæ¨¡åæ è¯ç¬¦ï¼å°æåº TypeErrorï¼ã
ä¸é¢ä½ å¯ä»¥çå°ä¸ä¸ªå®ä¹äº square æ¨¡åæ è¯ç¬¦é®çæ å°ï¼å¨è¿ç§æ
åµä¸ï¼å®æ å°å°ä¸ä¸ªç¸å¯¹å°åå¼ã
<script type="importmap">
{
"imports": {
"square": "./shapes/square.js"
}
}
</script>
æäºè¿ä¸ªæ å°ï¼æä»¬ç°å¨å¯ä»¥å¨å¯¼å ¥æ¨¡åæ¶ä½¿ç¨è£¸åç§°ï¼
import { name as squareName, draw } from "square";
éæ å°æ¨¡åè·¯å¾
æ¨¡åæ è¯ç¬¦æ å°æ¡ç®ï¼å
¶ä¸æ è¯ç¬¦é®åå
¶å
³èå¼é½å¸¦æå°¾é¨ææ ï¼/ï¼ï¼å¯ä»¥ç¨ä½è·¯å¾åç¼ãè¿å
许å°ä¸æ´ç»å¯¼å
¥ URL ä»ä¸ä¸ªä½ç½®éæ å°å°å¦ä¸ä¸ªä½ç½®ãå®è¿å¯ä»¥ç¨äºæ¨¡æâå
忍¡åâï¼ä¾å¦ä½ å¨ Node çæç³»ç»ä¸å¯è½çå°ç飿 ·ã
夿³¨ï¼å°¾é¨ / è¡¨ç¤ºæ¨¡åæ è¯ç¬¦é®å¯ä»¥ä½ä¸ºæ¨¡åæ è¯ç¬¦çä¸é¨åè¿è¡æ¿æ¢ãå¦ææ²¡æè¿ä¸ªï¼æµè§å¨å°åªå¹é
ï¼å¹¶æ¿æ¢ï¼æ´ä¸ªæ¨¡åæ è¯ç¬¦é®ã
模åå
ä»¥ä¸ JSON 导å
¥æ å°å®ä¹å° lodash ä½ä¸ºè£¸åç§°ï¼å¹¶å°æ¨¡åæ è¯ç¬¦åç¼ lodash/ æ å°å°è·¯å¾ /node_modules/lodash-es/ï¼è§£æä¸ºææ¡£åºç¡ URLï¼ï¼
{
"imports": {
"lodash": "/node_modules/lodash-es/lodash.js",
"lodash/": "/node_modules/lodash-es/"
}
}
æäºè¿ä¸ªæ å°ï¼ä½ å¯ä»¥ä½¿ç¨è£¸åç§°å¯¼å ¥æ´ä¸ªâå âï¼å¹¶ä½¿ç¨è·¯å¾æ å°å¯¼å ¥å ¶ä¸ç模åï¼
import _ from "lodash";
import fp from "lodash/fp.js";
å¯ä»¥å¨ä¸é¢å¯¼å
¥ fp èä¸ä½¿ç¨ .js æä»¶æ©å±åï¼ä½ä½ éè¦ä¸ºè¯¥æä»¶å建ä¸ä¸ªè£¸æ¨¡åæ è¯ç¬¦é®ï¼ä¾å¦ lodash/fpï¼è䏿¯ä½¿ç¨è·¯å¾ãå¦æä½ åªæ³å¯¼å
¥ä¸ä¸ªæ¨¡åï¼è¿å¯è½æ¯åççï¼ä½å¦æä½ 叿坼å
¥è®¸å¤æ¨¡åï¼è¿ç§æ¹æ³çæ©å±æ§è¾å·®ã
éç¨ URL éæ å°
æ¨¡åæ è¯ç¬¦é®ä¸ä¸å®æ¯è·¯å¾ââå®ä¹å¯ä»¥æ¯ç»å¯¹ URLï¼æç±»ä¼¼ URL çç¸å¯¹è·¯å¾ï¼å¦ ./ã../ã/ï¼ãå¦æä½ æ³å°å
·æç»å¯¹è·¯å¾ç模åéæ å°å°ä½ èªå·±çæ¬å°èµæºï¼è¿å¯è½ä¼å¾æç¨ã
{
"imports": {
"https://www.unpkg.com/moment/": "/node_modules/moment/"
}
}
ç¨äºçæ¬ç®¡ççå鿍¡å
å Node è¿æ ·ççæç³»ç»ä½¿ç¨ npm çå 管ç卿¥ç®¡ç模ååå ¶ä¾èµé¡¹ãå 管çå¨ç¡®ä¿æ¯ä¸ªæ¨¡åä¸å ¶ä»æ¨¡ååå ¶ä¾èµé¡¹åå¼ãå æ¤ï¼è½ç¶ä¸ä¸ªå¤æçåºç¨ç¨åºå¯è½å¨æ¨¡åå¾çä¸åé¨å夿¬¡å å«ç¸åçæ¨¡åï¼ä½ç¨æ·ä¸éè¦èèè¿ç§å¤ææ§ã
夿³¨ï¼ä½ ä¹å¯ä»¥ä½¿ç¨ç¸å¯¹è·¯å¾å®ç°çæ¬ç®¡çï¼ä½è¿å¹¶ä¸çæ³ï¼å 为è¿ä¼å¼ºå¶ä½ ç项ç®éç¨ç¹å®çç»æï¼å¹¶ä¸é»æ¢ä½ 使ç¨è£¸æ¨¡ååç§°ã
导å
¥æ å°åæ ·å
è®¸ä½ å¨åºç¨ç¨åºä¸æ¥æå¤ä¸ªçæ¬çä¾èµé¡¹ï¼å¹¶ä½¿ç¨ç¸åçæ¨¡åæ è¯ç¬¦å¼ç¨å®ä»¬ãä½ å¯ä»¥éè¿ scopes é®å®ç°è¿ä¸ç¹ï¼å®å
è®¸ä½ æ ¹æ®æ§è¡å¯¼å
¥çèæ¬è·¯å¾æä¾æ¨¡åæ è¯ç¬¦æ å°ãä¸é¢çç¤ºä¾æ¼ç¤ºäºè¿ä¸ç¹ã
{
"imports": {
"cool-module": "/node_modules/cool-module/index.js"
},
"scopes": {
"/node_modules/dependency/": {
"cool-module": "/node_modules/some/other/location/cool-module/index.js"
}
}
}
æäºè¿ä¸ªæ å°ï¼å¦æä¸ä¸ª URL å
å« /node_modules/dependency/ çèæ¬å¯¼å
¥ cool-moduleï¼å°ä½¿ç¨ /node_modules/some/other/location/cool-module/index.js ä¸ççæ¬ã妿åéæ å°ä¸æ²¡æå¹é
çä½ç¨åï¼æè
å¹é
çä½ç¨å䏿²¡æå¹é
çæ è¯ç¬¦ï¼åä½¿ç¨ imports ä¸çæ å°ä½ä¸ºåéãä¾å¦ï¼å¦æ cool-module æ¯å¨ä¸å¹é
ä½ç¨åè·¯å¾çèæ¬ä¸å¯¼å
¥çï¼åä¼ä½¿ç¨ imports ä¸çæ¨¡åæ è¯ç¬¦ï¼æ å°å° /node_modules/cool-module/index.js ä¸ççæ¬ã
请注æï¼ç¨äºéæ©ä½ç¨åçè·¯å¾ä¸ä¼å½±åå°åçè§£æãæ å°è·¯å¾ä¸çå¼ä¸å¿ ä¸ä½ç¨åè·¯å¾å¹é ï¼ä¸ç¸å¯¹è·¯å¾ä»ç¶è§£æä¸ºå å«å¯¼å ¥æ å°çèæ¬çåºç¡ URLã
䏿¨¡åæ è¯ç¬¦æ å°ä¸æ ·ï¼ä½ å¯ä»¥æå¤ä¸ªä½ç¨åé®ï¼å¹¶ä¸è¿äºé®å¯è½å
å«éå çè·¯å¾ã妿å¤ä¸ªä½ç¨åå¹é
å¼ç¨ URLï¼åé¦å
æ£æ¥æå
·ä½çä½ç¨åè·¯å¾ï¼æé¿çä½ç¨åé®ï¼ä»¥æ¥æ¾å¹é
çæ è¯ç¬¦ãå¦ææ²¡æå¹é
çæ è¯ç¬¦ï¼æµè§å¨å°åéå°ä¸ä¸ä¸ªæå
·ä½çå¹é
ä½ç¨åè·¯å¾ï¼ä¾æ¤ç±»æ¨ã妿å¨ä»»ä½å¹é
çä½ç¨åä¸é½æ²¡æå¹é
çæ è¯ç¬¦ï¼æµè§å¨ä¼æ£æ¥ imports é®ä¸çæ¨¡åæ è¯ç¬¦æ å°ä»¥æ¥æ¾å¹é
项ã
éè¿æ å°å»é¤æ£åæä»¶å以æ¹è¿ç¼å
ç½ç«ä½¿ç¨çèæ¬æä»¶éå¸¸å ·ææ£åæä»¶å以ç®åç¼åãè¿ç§æ¹æ³çç¼ºç¹æ¯ï¼å¦ææ¨¡ååçååï¼ä»»ä½ä½¿ç¨å ¶æ£åæä»¶åå¯¼å ¥å®ç模åä¹éè¦æ´æ°/éæ°çæãè¿å¯è½å¯¼è´æ´æ°ç级èï¼æµªè´¹ç½ç»èµæºã
å¯¼å ¥æ å°æä¾äºä¸ä¸ªæ¹ä¾¿çè§£å³æ¹æ¡ãåºç¨ç¨åºåèæ¬ä¾èµäºæªæ£åçæ¬çæ¨¡ååç§°ï¼å°åï¼ï¼è䏿¯ä¾èµäºç¹å®çæ£åæä»¶åãå¦ä¸æç¤ºçå¯¼å ¥æ å°æä¾äºå°å®é èæ¬æä»¶çæ å°ã
{
"imports": {
"main_script": "/node/srcs/application-fg7744e1b.js",
"dependency_script": "/node/srcs/dependency-3qn7e4b1q.js"
}
}
妿 dependency_script åçååï¼é£ä¹å
¶æä»¶åä¸çæ£åä¹ä¼åçååãå¨è¿ç§æ
åµä¸ï¼æä»¬åªéè¦æ´æ°å¯¼å
¥æ å°ä»¥åæ æ¨¡ååç§°çååãæä»¬ä¸éè¦æ´æ°ä»»ä½ä¾èµå®ç JavaScript 代ç çæºä»£ç ï¼å 为导å
¥è¯å¥ä¸çæ è¯ç¬¦ä¸ä¼æ¹åã
å è½½é JavaScript èµæº
ç»ä¸æ¨¡åæ¶æå¸¦æ¥çä¸ä¸ªä»¤äººå
´å¥çåè½æ¯è½å¤å°é JavaScript èµæºä½ä¸ºæ¨¡åå è½½ãä¾å¦ï¼ä½ å¯ä»¥å° JSON ä½ä¸º JavaScript 对象导å
¥ï¼æå° CSS ä½ä¸º CSSStyleSheet 对象导å
¥ã
ä½ å¿ é¡»æç¡®å£°æä½ æ£å¨å¯¼å ¥åªç§èµæºãé»è®¤æ åµä¸ï¼æµè§å¨åå®èµæºæ¯ JavaScriptï¼å¦æè§£æçèµæºæ¯å ¶ä»ç±»åï¼å°æåºé误ãè¦å¯¼å ¥ JSONãCSS æå ¶ä»ç±»åçèµæºï¼è¯·ä½¿ç¨å¯¼å ¥å±æ§è¯æ³ï¼
import colors from "./colors.json" with { type: "json" };
import styles from "./styles.css" with { type: "css" };
æµè§å¨è¿ä¼å¯¹æ¨¡åç±»åè¿è¡éªè¯ï¼å¦æ ./data.json 䏿¯ JSON æä»¶ï¼å°ä¼å¤±è´¥ãè¿ç¡®ä¿äºä½ å¨ä»
æç®å¯¼å
¥æ°æ®æ¶ä¸ä¼æå¤æ§è¡ä»£ç ã䏿¦æå导å
¥ï¼ä½ ç°å¨å¯ä»¥åä½¿ç¨æ®é JavaScript 对象æ CSSStyleSheet å¯¹è±¡ä¸æ ·ä½¿ç¨å¯¼å
¥çå¼ã
console.log(colors.map((color) => color.value));
document.adoptedStyleSheets = [styles];
å°æ¨¡ååºç¨å°ä½ ç HTML
ç°å¨æä»¬åªéè¦å° main.js 模ååºç¨å°æä»¬ç HTML 页é¢ãè¿ä¸å°å¸¸è§èæ¬åºç¨å°é¡µé¢é常ç¸ä¼¼ï¼ä½æä¸äºæ¾èçåºå«ã
é¦å
ï¼ä½ éè¦å¨ <script> å
ç´ ä¸å
å« type="module"ï¼ä»¥å£°ææ¤èæ¬ä¸ºæ¨¡åãè¦å¯¼å
¥ main.js èæ¬ï¼æä»¬ä½¿ç¨ä»¥ä¸ä»£ç ï¼
<script type="module" src="main.js"></script>
ä½ ä¹å¯ä»¥å°æ¨¡åçèæ¬ç´æ¥åµå
¥å° HTML æä»¶ä¸ï¼å° JavaScript ä»£ç æ¾å¨ <script> å
ç´ ç主ä½å
ï¼
<script type="module">
/* JavaScript 模å代ç */
</script>
ä½ åªè½å¨æ¨¡åå
ä½¿ç¨ import å export è¯å¥ï¼ä¸è½å¨å¸¸è§èæ¬ä¸ä½¿ç¨ãå¦æä½ ç <script> å
ç´ æ²¡æ type="module" 屿§å¹¶å°è¯å¯¼å
¥å
¶ä»æ¨¡åï¼å°ä¼æåºé误ãä¾å¦ï¼
<script>
import _ from "lodash"; // SyntaxError: import declarations may only appear at top level of a module
// ...
</script>
<script src="a-module-using-import-statements.js"></script>
<!-- SyntaxError: import declarations may only appear at top level of a module -->
é常ï¼ä½ åºè¯¥å¨åç¬çæä»¶ä¸å®ä¹æææ¨¡åãå è声æå¨ HTML ä¸ç模ååªè½å¯¼å ¥å ¶ä»æ¨¡åï¼ä½å®ä»¬å¯¼åºçä»»ä½å 容尿 æ³è¢«å ¶ä»æ¨¡å访é®ï¼å 为å®ä»¬æ²¡æ URLï¼ã
夿³¨ï¼å¯ä»¥éè¿å¨ <link> å
ç´ ä¸æå® rel="modulepreload" æ¥é¢å 载模ååå
¶ä¾èµé¡¹ãè¿å¯ä»¥æ¾èåå°ä½¿ç¨æ¨¡åæ¶çå è½½æ¶é´ã
模åä¸ç»å ¸èæ¬çå ¶ä»ä¸å
- ä½ éè¦æ³¨ææ¬å°æµè¯ââå¦æä½ éè¿æ¬å°å è½½ HTML æä»¶ï¼æ¯å¦ä¸ä¸ª
file://è·¯å¾çæä»¶ï¼ï¼ä½ å°ä¼éå° CORS é误ï¼å 为 JavaScript 模åå®å ¨æ§éè¦ãä½ éè¦éè¿ä¸ä¸ªæå¡å¨æ¥æµè¯ã - å¦è¯·æ³¨æï¼ä½ å¯è½ä¼ä»æ¨¡åå é¨å®ä¹çèæ¬é¨åè·å¾ä¸æ åèæ¬ä¸ä¸åçè¡ä¸ºãè¿æ¯å 为模åèªå¨ä½¿ç¨ä¸¥æ ¼æ¨¡å¼ã
- å è½½ä¸ä¸ªæ¨¡åèæ¬æ¶ä¸éè¦ä½¿ç¨
defer屿§ï¼åè§<script>屿§ï¼æ¨¡åä¼èªå¨å»¶è¿å è½½ã - æåä¸ç¹ä½åæ ·éè¦çæ¯ï¼ä½ éè¦ç解模ååè½çå¯¼å ¥èå´ââå®ä»¬ä» éäºè¢«å¯¼å ¥çèæ¬æä»¶ï¼æ æ³å¨å ¨å±èå´å 访é®ãå æ¤ï¼è¿äºåè½åªè½å¨å¯¼å ¥å®ä»¬çèæ¬æä»¶ä¸ä½¿ç¨ï¼æ æ³éè¿ JavaScript æ§å¶å°ç´æ¥è®¿é®ãä¾å¦ï¼å¨å¼åè å·¥å ·ä¸ä½ ä»ç¶å¯ä»¥çå°è¯æ³é误ï¼ä½å¯è½æ æ³å颿飿 ·ä½¿ç¨è°è¯æ¹æ³ã
模åå®ä¹çåéæ¯æ¨¡åèå´å çï¼é¤éæç¡®éå å°å ¨å±å¯¹è±¡ãå¦ä¸æ¹é¢ï¼å ¨å±å®ä¹çåé卿¨¡åå æ¯å¯ç¨çãä¾å¦ï¼ç»å®ä»¥ä¸ä»£ç ï¼
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title></title>
<link rel="stylesheet" href="" />
</head>
<body>
<div id="main"></div>
<script>
// var 声æå建ä¸ä¸ªå
¨å±åéã
var text = "Hello";
</script>
<script type="module" src="./render.js"></script>
</body>
</html>
/* render.js */
document.getElementById("main").innerText = text;
页é¢ä»ç¶ä¼æ¸²æ Helloï¼å 为å
¨å±åé text å document 卿¨¡å䏿¯å¯ç¨çãï¼è¿è¦æ³¨æè¿ä¸ªä¾åä¸ï¼æ¨¡åä¸ä¸å®éè¦ import/export è¯å¥ââå¯ä¸éè¦çæ¯å
¥å£ç¹æ type="module"ãï¼
é»è®¤å¯¼åºä¸å ·å导åº
å°ç®å为æ¢ï¼æä»¬å¯¼åºçåè½é½æ¯ç±å ·å导åºç»æââæ¯ä¸ªé¡¹ç®ï¼æ 论æ¯å½æ°ï¼å¸¸éçï¼å¨å¯¼åºæ¶é½ç±å ¶åç§°å¼ç¨ï¼å¹¶ä¸è¯¥åç§°ä¹ç¨äºå¨å¯¼å ¥æ¶å¼ç¨å®ã
è¿æä¸ç§å¯¼åºç±»åå«åé»è®¤å¯¼åºââè¿æ ·å¯ä»¥å¾å®¹æå°ä½¿æ¨¡åæä¾é»è®¤åè½ï¼å¹¶ä¸è¿å¯ä»¥å¸®å© JavaScript 模åä¸ç°æç CommonJS å AMD 模åç³»ç»è¿è¡äºæä½ï¼æ£å¦ç± Jason Orendorff ç¼åçæ·±å ¥ ES6ï¼æ¨¡åæè§£éç飿 ·ï¼æç´¢âDefault exportsâï¼ã
æ¥çä¸ä¸ªä¾åäºè§£å
¶å·¥ä½æ¹å¼ãå¨åºæ¬æ¨¡å square.js ä¸ï¼ä½ å¯ä»¥æ¾å°ä¸ä¸ªå为 randomSquare() ç彿°ï¼ç¨äºå建ä¸ä¸ªéæºé¢è²ã大å°åä½ç½®çæ£æ¹å½¢ãæä»¬å¸æå°å
¶ä½ä¸ºé»è®¤å¯¼åºï¼å æ¤å¨æä»¶åºé¨è¿æ ·ç¼åï¼
export default randomSquare;
注æï¼ä¸è¦å¤§æ¬å·ã
æä»¬å¯ä»¥æ export default æ¾å°å½æ°åé¢ï¼å®ä¹å®ä¸ºä¸ä¸ªå¿å彿°ï¼åè¿æ ·ï¼
export default function (ctx) {
// ...
}
卿们ç main.js æä»¶ä¸ï¼æä»¬éè¿ä»¥ä¸ä»£ç 导å
¥é»è®¤å½æ°ï¼
import randomSquare from "./modules/square.js";
åæ ·ï¼æ²¡æå¤§æ¬å·ï¼å 为æ¯ä¸ªæ¨¡ååªå
许æä¸ä¸ªé»è®¤å¯¼åºï¼æä»¬ç¥é randomSquare å°±æ¯éè¦çé£ä¸ªãä¸é¢çé£ä¸è¡ç¸å½äºä¸é¢ç缩åï¼
import { default as randomSquare } from "./modules/square.js";
夿³¨ï¼éå½å导åºé¡¹ç as è¯æ³å¨ä¸é¢çéå½åå¯¼å ¥ä¸å¯¼åºé¨åä¸è¿è¡äºè¯´æã
é¿å å½åå²çª
å°ç®å为æ¢ï¼æä»¬ç canvas å¾å½¢ç»å¶æ¨¡åçèµ·æ¥å·¥ä½çå¾å¥½ãä½å¦ææä»¬å°è¯æ·»å ä¸ä¸ªå¤çç»å¶å
¶ä»å½¢ç¶ï¼ä¾å¦åå½¢æä¸è§å½¢ï¼ç模åä¼ææ ·å¢ï¼è¿äºå½¢ç¶å¯è½ä¹ä¼æç±»ä¼¼ draw()ãreportArea() çç¸å
³ç彿°ï¼å¦ææä»¬å°è¯å°ååçä¸å彿°å¯¼å
¥å°åä¸ä¸ªé¡¶å±æ¨¡åæä»¶ä¸ï¼å°±ä¼åºç°å²çªåé误ã
幸è¿çæ¯ï¼æå¾å¤æ¹æ³æ¥é¿å ãæä»¬å°ä¼å¨ä¸ä¸ä¸ªèçå°ã
éå½åå¯¼å ¥ä¸å¯¼åº
å¨ import å export è¯å¥ç大æ¬å·ä¸ï¼å¯ä»¥ä½¿ç¨ as å
³é®å为åè½æå®æ°åç§°ï¼ä»èæ´æ¹å¨é¡¶çº§æ¨¡åä¸ä½¿ç¨çæ è¯åç§°ã
ä¾å¦ï¼ä»¥ä¸æ¹æ³è½ç¶æ¹å¼ç¥æä¸åï¼ä½å¯ä»¥å®æç¸åçå·¥ä½ï¼
// module.js ä¸
export { function1 as newFunctionName, function2 as anotherNewFunctionName };
// main.js ä¸
import { newFunctionName, anotherNewFunctionName } from "/modules/module.js";
// module.js ä¸
export { function1, function2 };
// main.js ä¸
import {
function1 as newFunctionName,
function2 as anotherNewFunctionName,
} from "./modules/module.js";
让æä»¬çä¸ä¸ªçå®çä¾åã卿们ç renaming ç®å½ä¸ï¼ä½ å°çå°ä¸ä¸ä¸ä¸ªç¤ºä¾ä¸ç¸åçæ¨¡åç³»ç»ï¼é¤äºæä»¬æ·»å äº circle.js å triangle.js 模å以ç»å¶åæ¥åååä¸è§å½¢ã
卿¯ä¸ªæ¨¡åä¸ï¼æä»¬é½æ export ç¸ååç§°çåè½ï¼å æ¤æ¯ä¸ªæ¨¡ååºé¨é½æç¸åç导åºè¯å¥ï¼
export { name, draw, reportArea, reportPerimeter };
å°å®ä»¬å¯¼å
¥ main.js æ¶ï¼å¦ææä»¬å°è¯ä½¿ç¨
import { name, draw, reportArea, reportPerimeter } from "./modules/square.js";
import { name, draw, reportArea, reportPerimeter } from "./modules/circle.js";
import { name, draw, reportArea, reportPerimeter } from "./modules/triangle.js";
æµè§å¨ä¼æåºä¸ä¸ªé误ï¼ä¾å¦âSyntaxError: redeclaration of import nameâï¼Firefoxï¼ã
ç¸åï¼æä»¬éè¦éå½åå¯¼å ¥ï¼ä½¿å®ä»¬æ¯å¯ä¸çï¼
import {
name as squareName,
draw as drawSquare,
reportArea as reportSquareArea,
reportPerimeter as reportSquarePerimeter,
} from "./modules/square.js";
import {
name as circleName,
draw as drawCircle,
reportArea as reportCircleArea,
reportPerimeter as reportCirclePerimeter,
} from "./modules/circle.js";
import {
name as triangleName,
draw as drawTriangle,
reportArea as reportTriangleArea,
reportPerimeter as reportTrianglePerimeter,
} from "./modules/triangle.js";
请注æï¼ä½ å¯ä»¥å¨æ¨¡åæä»¶ä¸è§£å³é®é¢ï¼ä¾å¦
// square.js ä¸
export {
name as squareName,
draw as drawSquare,
reportArea as reportSquareArea,
reportPerimeter as reportSquarePerimeter,
};
// main.js ä¸
import {
squareName,
drawSquare,
reportSquareArea,
reportSquarePerimeter,
} from "./modules/square.js";
å®ä¹ä¼èµ·ä½ç¨ãä½ ä½¿ç¨ä»ä¹æ ·ç飿 ¼åå³äºä½ ï¼ä½æ¯åç¬ä¿ç模å代ç å¹¶å¨å¯¼å ¥ä¸è¿è¡æ´æ¹å¯è½æ´ææä¹ãå½ä½ 仿²¡æä»»ä½æ§å¶æçç¬¬ä¸æ¹æ¨¡åå¯¼å ¥æ¶ï¼è¿å°¤å ¶ææä¹ã
å建模å对象
ä¸è¿°æ¹æ³è½ç¶ææï¼ä½æäºåé¿åæ··ä¹±ãä¸ä¸ªæ´å¥½çè§£å³æ¹æ¡æ¯ï¼å°æ¯ä¸ä¸ªæ¨¡ååè½å¯¼å ¥å°ä¸ä¸ªæ¨¡ååè½å¯¹è±¡ä¸ãå¯ä»¥ä½¿ç¨ä»¥ä¸è¯æ³å½¢å¼ï¼
import * as Module from "/modules/module.js";
è¿å°è·å module.js 䏿æå¯ç¨ç导åºï¼å¹¶ä½¿å®ä»¬å¯ä»¥ä½ä¸ºå¯¹è±¡æ¨¡åçæå使ç¨ï¼ä»èææå°ä¸ºå
¶æä¾èªå·±çå½å空é´ãä¾å¦ï¼
Module.function1();
Module.function2();
忬¡ï¼è®©æä»¬çä¸ä¸ªçå®çä¾åãå¦æä½ è½¬å°æä»¬ç module-objects ç®å½ï¼å°å次çå°ç¸åç示ä¾ï¼ä½å©ç¨ä¸è¿°çæ°è¯æ³è¿è¡éåã卿¨¡åä¸ï¼å¯¼åºé½æ¯ä»¥ä¸ç®åå½¢å¼ï¼
export { name, draw, reportArea, reportPerimeter };
å¦ä¸æ¹é¢ï¼å¯¼å ¥çèµ·æ¥åè¿æ ·ï¼
import * as Canvas from "./modules/canvas.js";
import * as Square from "./modules/square.js";
import * as Circle from "./modules/circle.js";
import * as Triangle from "./modules/triangle.js";
卿¯ç§æ åµä¸ï¼ä½ ç°å¨å¯ä»¥è®¿é®æå®å¯¹è±¡åç§°ä¸é¢ç模åå¯¼å ¥ã
const square1 = Square.draw(myCanvas.ctx, 50, 50, 100, "blue");
Square.reportArea(square1.length, reportList);
Square.reportPerimeter(square1.length, reportList);
å æ¤ï¼ä½ ç°å¨å¯ä»¥å以å䏿 ·ç¼å代ç ï¼åªè¦ä½ å¨éè¦æ¶å å«å¯¹è±¡åç§°ï¼ï¼å¹¶ä¸å¯¼å ¥æ´å æ´æ´ã
模åä¸ç±»
æ£å¦æä»¬ä¹åæå°ç飿 ·ï¼ä½ è¿å¯ä»¥å¯¼åºåå¯¼å ¥ç±»ï¼classï¼ï¼è¿æ¯é¿å 代ç å²çªçå¦ä¸ç§éæ©ï¼å¦æä½ å·²ç»ä»¥é¢åå¯¹è±¡çæ¹å¼ç¼åäºæ¨¡å代ç ï¼é£ä¹å®å°¤å ¶æç¨ã
ä½ å¯ä»¥å¨æä»¬ç classes ç®å½ä¸çå°ä½¿ç¨ ES ç±»éåçå½¢ç¶ç»å¶æ¨¡åç示ä¾ãä¾å¦ï¼square.js æä»¶ç°å¨å
å«å个类ä¸çææåè½ï¼
class Square {
constructor(ctx, listId, length, x, y, color) {
// â¦
}
draw() {
// â¦
}
// â¦
}
ç¶åæä»¬å¯¼åºï¼
export { Square };
å¨ main.js ä¸ï¼æä»¬åè¿æ ·å¯¼å
¥å®ï¼
import { Square } from "./modules/square.js";
ç¶å使ç¨è¯¥ç±»ç»å¶æä»¬çæ¹åï¼
let square1 = new Square(myCanvas.ctx, myCanvas.listId, 50, 50, 100, "blue");
square1.draw();
square1.reportArea();
square1.reportPerimeter();
å并模å
ææ¶ä½ ä¼æ³è¦å°æ¨¡åèåå¨ä¸èµ·ãä½ å¯è½æå¤ä¸ªçº§å«çä¾èµé¡¹ï¼ä½ 叿ç®åäºç©ï¼å°å¤ä¸ªå模åç»åå°ä¸ä¸ªç¶æ¨¡åä¸ãè¿å¯ä»¥å¨ç¶æ¨¡åä¸ç¨ä»¥ä¸å½¢å¼ç导åºè¯æ³ï¼
export * from "x.js";
export { name } from "x.js";
æå
³ç¤ºä¾ï¼è¯·åé
æä»¬ç module-aggregationãå¨è¿ä¸ªä¾åä¸ï¼åºäºæä»¬ä¹åç类示ä¾ï¼ï¼æä»¬æä¸ä¸ªå为 shapes.js çé¢å¤æ¨¡åï¼å®å° circle.jsãsquare.js å riangle.mjs ä¸çææåè½èåå¨ä¸èµ·ãæä»¬è¿å°å模åç§»å¨å° modules ç®å½çå为 shapes çåç®å½ä¸ãæä»¥æ¨¡åç»æç°å¨æ¯è¿æ ·çï¼
modules/
canvas.js
shapes.js
shapes/
circle.js
square.js
triangle.js
卿¯ä¸ªå模åä¸ï¼è¾åºå ·æç¸åçå½¢å¼ï¼ä¾å¦ï¼
export { Square };
æ¥ä¸æ¥æ¯èåé¨åãå¨ shapes.js éé¢ï¼æä»¬å
æ¬ä»¥ä¸å è¡ï¼
export { Square } from "./shapes/square.js";
export { Triangle } from "./shapes/triangle.js";
export { Circle } from "./shapes/circle.js";
å®ä»¬ä»åä¸ªåæ¨¡åä¸è·å导åºï¼å¹¶ææå°ä» shapes.js 模åä¸è·åå®ä»¬ã
夿³¨ï¼shapes.js ä¸å¼ç¨ç导åºåºæ¬ä¸éè¿æä»¶éå®åï¼å¹¶ä¸å®é
ä¸å¹¶ä¸åå¨ï¼å æ¤ä½ å°æ æ³å¨å䏿件ä¸ç¼å任使ç¨çç¸å
³ä»£ç ã
æä»¥ç°å¨å¨ main.js æä»¶ä¸ï¼æä»¬å¯ä»¥éè¿æ¿æ¢æ¥è®¿é®ææä¸ä¸ªæ¨¡åç±»
import { Square } from "./modules/square.js";
import { Circle } from "./modules/circle.js";
import { Triangle } from "./modules/triangle.js";
使ç¨ä»¥ä¸åè¡ï¼
import { Square, Circle, Triangle } from "./modules/shapes.js";
卿å 载模å
æè¿å å ¥ç JavaScript 模ååè½æ¯å¨ææ¨¡åå è½½ãè¿å è®¸ä½ ä» å¨éè¦æ¶å¨æå 载模åï¼èä¸å¿ é¢å å è½½æææ¨¡åãè¿æä¸äºææ¾çæ§è½ä¼å¿ï¼è®©æä»¬ç»§ç»é 读ï¼çç宿¯å¦ä½å·¥ä½çã
è¿ä¸ªæ°åè½å
è®¸ä½ å° import() ä½ä¸ºå½æ°è°ç¨ï¼å°æ¨¡åçè·¯å¾ä½ä¸ºåæ°ä¼ å
¥ãå®è¿åä¸ä¸ª Promiseï¼ä¼å
ç°ä¸ºä¸ä¸ªå¯ä»¥è®©ä½ 访é®å
¶å¯¼åºç模å对象ï¼åè§å建模å对象ï¼ãä¾å¦
import("/modules/mymodule.js").then((module) => {
// ä½¿ç¨æ¨¡ååä¸äºäºæ
ã
});
夿³¨ï¼ä»
å
è®¸å¨æµè§å¨ä¸»çº¿ç¨ãå
±äº«/ä¸ç¨ worker ä¸ä½¿ç¨å¨æå¯¼å
¥ãå¦æå¨ service worker æ worklet ä¸è°ç¨ import()ï¼å伿åºå¼å¸¸ã
æä»¬æ¥çä¸ä¸ªä¾åãå¨ dynamic-module-imports ç®å½ä¸ï¼æä»¬æå¦ä¸ä¸ªåºäºç±»ç¤ºä¾ç示ä¾ã使¯è¿æ¬¡æä»¬å¨ç¤ºä¾å è½½æ¶æ²¡æå¨ç»å¸ä¸ç»å¶ä»»ä½ä¸è¥¿ãç¸åï¼æä»¬å æ¬ä¸ä¸ªæé®âââåå½¢âãâæ¹å½¢âåâä¸è§å½¢âââæä¸æ¶ï¼å¨æå è½½æéçæ¨¡åï¼ç¶å使ç¨å®æ¥ç»å¶ç¸å ³çå½¢ç¶ã
å¨è¿ä¸ªä¾åä¸ï¼æä»¬åªå¯¹ index.html å main.js æä»¶è¿è¡äºæ´æ¹ââæ¨¡å导åºä¿æä¸ä»¥åç¸åã
å¨ main.js ä¸ï¼æä»¬ä½¿ç¨ document.querySelector() è°ç¨è·åäºå¯¹æ¯ä¸ªæé®çå¼ç¨ï¼ä¾å¦ï¼
const squareBtn = document.querySelector(".square");
ç¶åï¼æä»¬ä¸ºæ¯ä¸ªæé®éå ä¸ä¸ªäºä»¶çå¬å¨ï¼ä»¥ä¾¿å¨æä¸æ¶ï¼ç¸å ³æ¨¡åè¢«å¨æå 载并ç¨äºç»å¶å½¢ç¶ï¼
squareBtn.addEventListener("click", () => {
import("./modules/square.js").then((Module) => {
const square1 = new Module.Square(
myCanvas.ctx,
myCanvas.listId,
50,
50,
100,
"blue",
);
square1.draw();
square1.reportArea();
square1.reportPerimeter();
});
});
请注æï¼ç±äº promise å
ç°ä¼è¿åä¸ä¸ªæ¨¡å对象ï¼å æ¤è¯¥ç±»æä¸ºå¯¹è±¡çåç¹å¾ï¼å æ¤æä»¬ç°å¨éè¦å¨æé 彿°ä¹å追å Module. æ¥è®¿é®æé 彿°ï¼ä¾å¦ Module.Square( /* ⦠*/ )ã
å¦ä¸ä¸ªå¨æå¯¼å
¥çä¼ç¹æ¯å®ä»¬å§ç»å¯ç¨ï¼å³ä½¿å¨èæ¬ç¯å¢ä¸ä¹æ¯å¦æ¤ãå æ¤ï¼å¦æä½ å¨ HTML 䏿ä¸ä¸ªç°æç <script> æ ç¾æ²¡æ type="module"ï¼ä½ ä»ç¶å¯ä»¥éè¿å¨æå¯¼å
¥éç¨ä½ä¸ºæ¨¡åååç代ç ã
<script>
import("./modules/square.js").then((module) => {
// ä½¿ç¨æ¨¡ååä¸äºäºæ
ã
});
// å
¶ä»æä½å
¨å±èå´ç代ç ï¼è¿æ²¡æåå¤å¥½éæä¸ºæ¨¡åã
var btn = document.querySelector(".square");
</script>
é¡¶å± await
é¡¶å± await æ¯æ¨¡åä¸å¯ç¨çä¸ä¸ªç¹æ§ãè¿æå³çå¯ä»¥ä½¿ç¨ await å
³é®åãå®å
许模åå大弿¥å½æ°ä¸æ ·è¿è¡ï¼è¿æå³ç代ç å¯ä»¥å¨ç¶æ¨¡åä¸ä½¿ç¨ä¹åè¿è¡è¯ä¼°ï¼ä½ä¸ä¼é»æ¢å
弿¨¡åçå è½½ã
让æä»¬çä¸ä¸ªä¾åãä½ å¯ä»¥å¨ top-level-await ç®å½ä¸æ¾å°æ¬èä¸æè¿°çæææä»¶å代ç ï¼è¿äºæä»¶åä»£ç æ¯ä»åé¢çç¤ºä¾æ©å±èæ¥çã
é¦å
ï¼æä»¬å°å¨ä¸ä¸ªåç¬ç colors.json æä»¶ä¸å£°ææä»¬çè°è²æ¿ï¼
{
"yellow": "#F4D03F",
"green": "#52BE80",
"blue": "#5499C7",
"red": "#CD6155",
"orange": "#F39C12"
}
ç¶åæä»¬å°å建ä¸ä¸ªå为 getColors.js çæ¨¡åï¼è¯¥æ¨¡åä½¿ç¨ fetch 请æ±å è½½ colors.json æä»¶å¹¶å°æ°æ®ä½ä¸ºå¯¹è±¡è¿åã
// fetch 请æ±
const colors = fetch("../data/colors.json").then((response) => response.json());
export default await colors;
注æè¿éçæåä¸è¡å¯¼åºã
æä»¬å¨æå®è¦å¯¼åºç常é colors ä¹å使ç¨äº await å
³é®åãè¿æå³çå
嫿¤æ¨¡åçä»»ä½å
¶ä»æ¨¡åå°å¨ä½¿ç¨ä¹åçå¾
colors ä¸è½½åè§£æå®æã
让æä»¬å¨æä»¬ç main.js æä»¶ä¸å
å«è¿ä¸ªæ¨¡åï¼
import colors from "./modules/getColors.js";
import { Canvas } from "./modules/canvas.js";
const circleBtn = document.querySelector(".circle");
// â¦
æä»¬å°å¨è°ç¨å½¢ç¶å½æ°æ¶ä½¿ç¨ colors è䏿¯ä¹å使ç¨çå符串ï¼
const square1 = new Module.Square(
myCanvas.ctx,
myCanvas.listId,
50,
50,
100,
colors.blue,
);
const circle1 = new Module.Circle(
myCanvas.ctx,
myCanvas.listId,
75,
200,
100,
colors.green,
);
const triangle1 = new Module.Triangle(
myCanvas.ctx,
myCanvas.listId,
100,
75,
190,
colors.yellow,
);
è¿å¾æç¨ï¼å 为 main.js ä¸ç代ç å¨ getColors.js è¿è¡ä¹åä¸ä¼æ§è¡ãç¶èï¼å®ä¸ä¼é»æ¢å
¶ä»æ¨¡åçå è½½ãä¾å¦ï¼æä»¬ç canvas.js 模åå°å¨ colors 被è·åæ¶ç»§ç»å è½½ã
å¯¼å ¥å£°ææ¯æåç
å¯¼å ¥å£°ææ¯æåçãå¨è¿ç§æ åµä¸ï¼è¿æå³çå¯¼å ¥çå¼å¨æ¨¡å代ç ä¸å£°æä¹åå°±å¯ç¨ï¼å¹¶ä¸å¯¼å ¥æ¨¡åçå¯ä½ç¨å¨æ¨¡å代ç çå ¶ä½é¨åå¼å§è¿è¡ä¹å就已ç»äº§çã
ä¾å¦ï¼å¨ main.js ä¸ï¼å¨ä»£ç ä¸é´å¯¼å
¥ Canvas ä»ç¶ææï¼
// â¦
const myCanvas = new Canvas("myCanvas", document.body, 480, 320);
myCanvas.create();
import { Canvas } from "./modules/canvas.js";
myCanvas.createReportList();
// â¦
å°½ç®¡å¦æ¤ï¼æå¥½è¿æ¯å°ææå¯¼å ¥æ¾å¨ä»£ç çé¡¶é¨ï¼è¿æ ·æ´å®¹æåæä¾èµå ³ç³»ã
循ç¯å¯¼å ¥
模åå¯ä»¥å¯¼å ¥å ¶ä»æ¨¡åï¼èè¿äºæ¨¡åå¯ä»¥å¯¼å ¥å ¶ä»æ¨¡åï¼ä¾æ¤ç±»æ¨ãè¿å½¢æäºä¸ä¸ªç§°ä¸ºâä¾èµå¾âçæåå¾ãå¨çæ³æ åµä¸ï¼è¿ä¸ªå¾æ¯æ ç¯çãå¨è¿ç§æ åµä¸ï¼å¯ä»¥ä½¿ç¨æ·±åº¦ä¼å é忥æ§è¡å¾ã
ç¶èï¼å¾ªç¯é常æ¯ä¸å¯é¿å
çãå¦ææ¨¡å a 导å
¥æ¨¡å bï¼ä½ b ç´æ¥æé´æ¥ä¾èµäº aï¼åä¼åºç°å¾ªç¯å¯¼å
¥ãä¾å¦ï¼
// -- a.js --
import { b } from "./b.js";
// -- b.js --
import { a } from "./a.js";
// 循ç¯ï¼
// a.js âââ> b.js
// ^ â
// âââââââââââ
循ç¯å¯¼å
¥å¹¶ä¸æ»æ¯ä¼å¤±è´¥ãåªæå¨å®é
使ç¨å¯¼å
¥åéç弿¶æä¼æ£ç´¢è¯¥å¼ï¼å æ¤å
è®¸å®æ¶ç»å®ï¼ï¼å¹¶ä¸åªæå¨åéå¨é£æ¶ä»æªåå§åæ¶æä¼æåº ReferenceErrorã
// -- a.js --
import { b } from "./b.js";
setTimeout(() => {
console.log(b); // 1
}, 10);
export const a = 2;
// -- b.js --
import { a } from "./a.js";
setTimeout(() => {
console.log(a); // 2
}, 10);
export const b = 1;
å¨è¿ä¸ªä¾åä¸ï¼a å b 齿¯å¼æ¥ä½¿ç¨çãå æ¤ï¼å¨æ¨¡åæ§è¡æ¶ï¼b å a 齿²¡æè¢«å®é
读åï¼æä»¥å
¶ä½ä»£ç æ£å¸¸æ§è¡ï¼å¹¶ä¸ä¸¤ä¸ª export 声æçæ a å b çå¼ãç¶åï¼å¨è¶
æ¶ä¹åï¼a å b é½å¯ç¨ï¼å æ¤ä¸¤ä¸ª console.log è¯å¥ä¹æ£å¸¸æ§è¡ã
å¦æä½ å°ä»£ç æ´æ¹ä¸ºåæ¥ä½¿ç¨ aï¼æ¨¡åæ§è¡å°å¤±è´¥ï¼
// -- a.js (å
¥å£æ¨¡å) --
import { b } from "./b.js";
export const a = 2;
// -- b.js --
import { a } from "./a.js";
console.log(a); // ReferenceError: Cannot access 'a' before initialization
export const b = 1;
è¿æ¯å ä¸ºå½ JavaScript æ§è¡ a.js æ¶ï¼å®éè¦é¦å
æ§è¡ b.jsï¼å³ a.js çä¾èµé¡¹ãç¶èï¼b.js ä½¿ç¨ aï¼è a å°ä¸å¯ç¨ã
å¦ä¸æ¹é¢ï¼å¦æä½ å°ä»£ç æ´æ¹ä¸ºåæ¥ä½¿ç¨ b ä½å¼æ¥ä½¿ç¨ aï¼æ¨¡åæ§è¡å°æåï¼
// -- a.js (å
¥å£æ¨¡å) --
import { b } from "./b.js";
console.log(b); // 1
export const a = 2;
// -- b.js --
import { a } from "./a.js";
setTimeout(() => {
console.log(a); // 2
}, 10);
export const b = 1;
è¿æ¯å 为 b.js çæ§è¡æ£å¸¸å®æï¼å æ¤å¨æ§è¡ a.js æ¶ b ç弿¯å¯ç¨çã
å¨é¡¹ç®ä¸é常åºé¿å 循ç¯å¯¼å ¥ï¼å 为å®ä»¬ä¼ä½¿ä»£ç æ´å®¹æåºéãä¸äºå¸¸è§çæ¶é¤å¾ªç¯çæ¹æ³æ¯ï¼
- å°ä¸¤ä¸ªæ¨¡åå并为ä¸ä¸ªã
- å°å ±äº«ä»£ç ç§»å¨å°ç¬¬ä¸ä¸ªæ¨¡åã
- å°ä¸äºä»£ç ä»ä¸ä¸ªæ¨¡åç§»å¨å°å¦ä¸ä¸ªæ¨¡åã
ç¶èï¼å¦æåºç¸äºä¾èµï¼å¾ªç¯å¯¼å ¥ä¹å¯è½åçï¼è¿æ´é¾è§£å³ã
ç¼åâåæâ模å
模åçå¼å ¥é¼å± JavaScript çæç³»ç»ä»¥æ¨¡ååçæ¹å¼åååéç¨ä»£ç ãç¶èï¼è¿å¹¶ä¸ä¸å®æå³ç䏿®µ JavaScript 代ç å¯ä»¥å¨æ¯ä¸ªç¯å¢ä¸è¿è¡ãåè®¾ä½ åç°äºä¸ä¸ªçæç¨æ·å¯ç SHA æ£åçæ¨¡åãä½ å¯ä»¥å¨æµè§å¨å端使ç¨å®åï¼ä½ å¯ä»¥å¨ä½ ç Node.js æå¡å¨ä¸ä½¿ç¨å®åï¼çæ¡æ¯ï¼è§æ åµèå®ã
模åä»ç¶å¯ä»¥è®¿é®å
¨å±åéï¼å¦åæç¤ºãå¦ææ¨¡åå¼ç¨äº window çå
¨å±åéï¼å®å¯ä»¥å¨æµè§å¨ä¸è¿è¡ï¼ä½å¨ä½ ç Node.js æå¡å¨ä¸ä¼æåºé误ï¼å 为é£é没æ windowãåæ ·ï¼å¦æä»£ç éè¦è®¿é® process æè½æ£å¸¸è¿è¡ï¼å®åªè½å¨ Node.js ä¸ä½¿ç¨ã
ä¸ºäºæå¤§éåº¦å°æé«æ¨¡åçå¯éç¨æ§ï¼é常建议使代ç âåæâââå³å¨æ¯ä¸ªè¿è¡æ¶ä¸è¡¨ç°ç¸åãè¿é常éè¿ä¸ç§æ¹å¼å®ç°ï¼
-
å°ä½ çæ¨¡ååä¸ºâæ ¸å¿âåâç»å®âã对äºâæ ¸å¿âï¼ä¸æ³¨äºçº¯ JavaScript é»è¾ï¼å¦è®¡ç®æ£åï¼ä¸æ¶åä»»ä½ DOMãç½ç»ãæä»¶ç³»ç»è®¿é®ï¼å¹¶æ´é²å®ç¨å½æ°ã对äºâç»å®âé¨åï¼ä½ å¯ä»¥ä»å ¨å±ä¸ä¸æä¸è¯»åååå ¥ãä¾å¦ï¼âæµè§å¨ç»å®âå¯ä»¥éæ©ä»è¾å ¥æ¡ä¸è¯»åå¼ï¼èâNode ç»å®âå¯ä»¥ä»
process.envä¸è¯»åï¼ä½ä»ä»»ä¸ä½ç½®è¯»åçå¼å°ä¼ éå°ç¸åçæ ¸å¿å½æ°å¹¶ä»¥ç¸åçæ¹å¼å¤çãæ ¸å¿å¯ä»¥å¨æ¯ä¸ªç¯å¢ä¸å¯¼å ¥å¹¶ä»¥ç¸åçæ¹å¼ä½¿ç¨ï¼èåªæç»å®ï¼é常æ¯è½»é级çï¼éè¦ç¹å®äºå¹³å°ã -
å¨ä½¿ç¨ä¹åæ£æµç¹å®çå ¨å±å鿝å¦åå¨ãä¾å¦ï¼å¦æä½ æµè¯
typeof window === "undefined"ï¼ä½ ç¥éä½ å¯è½å¨ Node.js ç¯å¢ä¸ï¼ä¸åºè¯¥è¯»å DOMãjs// myModule.js let password; if (typeof process !== "undefined") { // æä»¬å¨ Node.js ä¸è¿è¡ï¼ä» `process.env` ä¸è¯»å password = process.env.PASSWORD; } else if (typeof window !== "undefined") { // æä»¬å¨æµè§å¨ä¸è¿è¡ï¼ä»è¾å ¥æ¡ä¸è¯»å password = document.getElementById("password").value; }å¦æä¸¤ä¸ªåæ¯å®é 䏿ç»å ·æç¸åçè¡ä¸ºï¼âåæâï¼ï¼è¿æ¯æ´å¯åçãå¦ææ æ³æä¾ç¸åçåè½ï¼æè è¿æ ·åæ¶åå 载大é代ç è大é¨å仿ªä½¿ç¨ï¼æå¥½ä½¿ç¨ä¸åçâç»å®âã
-
ä½¿ç¨ polyfill æä¾ç¼ºå¤±ç¹æ§çåéãä¾å¦ï¼å¦æä½ æ³ä½¿ç¨
fetch彿°ï¼å®ä» å¨ Node.js v18 åæ´é«çæ¬ä¸æ¯æï¼ä½ å¯ä»¥ä½¿ç¨ç±»ä¼¼ç APIï¼å¦node-fetchæä¾ç APIãä½ å¯ä»¥éè¿å¨æå¯¼å ¥ææ¡ä»¶å°è¿è¡ï¼js// myModule.js if (typeof fetch === "undefined") { // æä»¬å¨ Node.js ä¸è¿è¡ï¼ä½¿ç¨ node-fetch globalThis.fetch = (await import("node-fetch")).default; } // â¦globalThiså鿝ä¸ä¸ªå¨æ¯ä¸ªç¯å¢ä¸é½å¯ç¨çå ¨å±å¯¹è±¡ï¼å¦æä½ æ³å¨æ¨¡åä¸è¯»åæåå»ºå ¨å±åéï¼å®é常æç¨ã
è¿äºå®è·µå¹¶ä¸æ¯æ¨¡åç¬æçãå°½ç®¡å¦æ¤ï¼éç代ç å¯éç¨æ§å模ååçè¶å¿ï¼ä½ 被é¼å±ä½¿ä½ ç代ç 跨平å°ï¼ä»¥ä¾¿å°½å¯è½å¤ç人å¯ä»¥äº«åå®ãå Node.js è¿æ ·çè¿è¡æ¶ä¹å¨ç§¯æå®ç° web APIï¼ä»¥æé«ä¸ web çäºæä½æ§ã
æ éæé¤
å¦æä¸ºäºä½ çæ¨¡åæé®é¢ï¼è¿éæä¸äºæç¤ºæå¯è½å¸®å©å°ä½ ãå¦æä½ åç°æ´å¤çå å®¹æ¬¢è¿æ·»å è¿æ¥ï¼
- æä»¬ä¹åæå°è¿è¿ä¸ç¹ï¼ä½è¿æ¯éç³ä¸ä¸ï¼
.mjsåç¼çæä»¶éè¦ä»¥text/javascriptMIME ç±»åæ¥å è½½ï¼æè å ¶ä»ç JavaScript å ¼å®¹ç MIME ç±»åï¼ä½å»ºè®®ä½¿ç¨text/javascriptå è½½ï¼ï¼å¦åï¼ä½ ä¼å¾å°ä¸¥æ ¼ç MIME ç±»åæ£æ¥é误ï¼ä¾å¦âThe server responded with a non-JavaScript MIME typeâã - å¦æä½ å°è¯ç¨æ¬å°æä»¶å è½½ HTML æä»¶ï¼å³ï¼å
·æ
file://ç URLï¼ï¼ç±äº JavaScript 模åçå®å ¨æ§è¦æ±ï¼ä½ ä¼éå° CORS é误ãä½ éè¦éè¿æå¡å¨æ¥åä½ çæµè¯ãGitHub pages éå¸¸çæ³ï¼å 为å®å¨æä¾.mjsæä»¶æ¶å ·ææ£ç¡®ç MIME ç±»åã - å 为
.mjsæ¯éæ åçæä»¶æ©å±åï¼å æ¤ä¸äºæä½ç³»ç»å¯è½æ æ³è¯å«ï¼æè å°è¯æå®æ¿æ¢æå ¶ä»æä»¶ãæ¯å¦ï¼æä»¬åç° macOS ææå°å¨æä»¬ç.mjsåç¼çæä»¶å颿·»å ä¸.jsç¶åèªå¨éèè¿ä¸ªåç¼ãæä»¥æä»¬çæä»¶å®é ä¸é½æ¯x.mjs.jsãå½æä»¬å ³éèªå¨éèæä»¶æ©å±åï¼è®©å®å»æ¥å.mjs就好äºã
åè§
- v8.dev ä¸ç JavaScript 模åï¼2018ï¼
- hacks.mozilla.org ä¸ç ES 模åï¼æ¼«ç»ç深度解æï¼2018ï¼
- hacks.mozilla.org ä¸çæ·±å ¥ ES6ï¼æ¨¡åï¼2015ï¼
- æ¢ç´¢ JSï¼ç¬¬ 16 ç« ï¼æ¨¡åï¼æ¥èª Axel Rauschmayer å士