è¿ç¯æåä¼ç»ä½ å ¥é¨ JavaScript 模åçå ¨é¨ä¿¡æ¯ã
模ååçèæ¯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 æ¨èäºè¿æ ·çåæ³ï¼æ¯å¦æä¸åçç±ï¼
使¯æä»¬å³å®ç»§ç»ä½¿ç¨ .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
åæäº
ä½ å¯ä»¥å¨ 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 çç¸å¯¹è·¯å¾ï¼å¦ ./
ã../
ã/
ï¼ãå¦æä½ æ³å°å
·æç»å¯¹è·¯å¾ç模åéæ å°å°ä½ èªå·±çæ¬å°èµæºï¼è¿å¯è½ä¼å¾æç¨ã
{
"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 èµæºä½ä¸ºæ¨¡åå è½½ãä¾å¦ï¼ä½ å¯ä»¥å° 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"
æ¥é¢å 载模ååå
¶ä¾èµé¡¹ãè¿å¯ä»¥æ¾èåå°ä½¿ç¨æ¨¡åæ¶çå è½½æ¶é´ã
file://
è·¯å¾çæä»¶ï¼ï¼ä½ å°ä¼éå° CORS é误ï¼å 为 JavaScript 模åå®å
¨æ§éè¦ãä½ éè¦éè¿ä¸ä¸ªæå¡å¨æ¥æµè¯ãdefer
屿§ï¼åè§ <script>
屿§ï¼æ¨¡åä¼èªå¨å»¶è¿å è½½ãæ¨¡åå®ä¹çåéæ¯æ¨¡åèå´å çï¼é¤éæç¡®éå å°å ¨å±å¯¹è±¡ãå¦ä¸æ¹é¢ï¼å ¨å±å®ä¹çåé卿¨¡åå æ¯å¯ç¨çãä¾å¦ï¼ç»å®ä»¥ä¸ä»£ç ï¼
<!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() {
// â¦
}
// â¦
}
ç¶åæä»¬å¯¼åºï¼
å¨ 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
卿¯ä¸ªå模åä¸ï¼è¾åºå ·æç¸åçå½¢å¼ï¼ä¾å¦ï¼
æ¥ä¸æ¥æ¯èåé¨åãå¨ 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ã
// 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ãä½ å¯ä»¥éè¿å¨æå¯¼å
¥ææ¡ä»¶å°è¿è¡ï¼
// 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/javascript
MIME ç±»åæ¥å è½½ï¼æè
å
¶ä»ç JavaScript å
¼å®¹ç MIME ç±»åï¼ä½å»ºè®®ä½¿ç¨ text/javascript
å è½½ï¼ï¼å¦åï¼ä½ ä¼å¾å°ä¸¥æ ¼ç MIME ç±»åæ£æ¥é误ï¼ä¾å¦âThe server responded with a non-JavaScript MIME typeâãfile://
ç URLï¼ï¼ç±äº JavaScript 模åçå®å
¨æ§è¦æ±ï¼ä½ ä¼éå° CORS é误ãä½ éè¦éè¿æå¡å¨æ¥åä½ çæµè¯ãGitHub pages éå¸¸çæ³ï¼å 为å®å¨æä¾ .mjs
æä»¶æ¶å
·ææ£ç¡®ç MIME ç±»åã.mjs
æ¯éæ åçæä»¶æ©å±åï¼å æ¤ä¸äºæä½ç³»ç»å¯è½æ æ³è¯å«ï¼æè
å°è¯æå®æ¿æ¢æå
¶ä»æä»¶ãæ¯å¦ï¼æä»¬åç° macOS ææå°å¨æä»¬ç .mjs
åç¼çæä»¶å颿·»å ä¸ .js
ç¶åèªå¨éèè¿ä¸ªåç¼ãæä»¥æä»¬çæä»¶å®é
ä¸é½æ¯ x.mjs.js
ã彿们å
³éèªå¨éèæä»¶æ©å±åï¼è®©å®å»æ¥å .mjs
就好äºãRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4