> For the complete documentation index, see [llms.txt](https://node.course.90byte.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://node.course.90byte.com/basic/01_know_node.md).
# 01 èµ°è¿ Node çä¸çï¼è®¤è¯ Node
è¿ä¸è¯¾çå
容ï¼å¸¦ä½ èµ°è¿ Node çä¸çï¼ç¸å¯¹èè¨ï¼å®æ¯ä¸é¨æ¯è¾å¹´è½»çææ¯ï¼èéç¼ç¨è¯è¨ãä¸ Java å PHP çæ¦å¿µä¸ä¸æ ·ï¼Node 使ç¨ççç¼ç¨è¯è¨æ¯ JavaScript ï¼è¿ä¹ä¸è¯´ï¼æ´è®©äººç³æ¶äºï¼é£ Node å°åºæ¯ä»ä¹æ ·çä¸ä¸ªåå¨ï¼ä¸å¬ææ
¢æ
¢éæ¥ã
## Node çå®ä¹
çä¸ä¸ç»´åºç¾ç§ä¸çå®ä¹ã
> Node.js æ¯ä¸ä¸ªè½å¤å¨æå¡å¨ç«¯è¿è¡ JavaScript ç弿¾æºä»£ç ãè·¨å¹³å° JavaScript è¿è¡ç¯å¢ãNode.js ç± Node.js åºé伿æåç»´æ¤ï¼å¹¶ä¸ Linux åºé伿åä½å
³ç³»ãNode.js éç¨ Google å¼åç V8 è¿è¡ä»£ç ï¼ä½¿ç¨äºä»¶é©±å¨ãéé»å¡å 弿¥è¾å
¥è¾åºæ¨¡åçææ¯æ¥æé«æ§è½ï¼å¯ä¼ååºç¨ç¨åºçä¼ è¾éåè§æ¨¡ã
æ ¹æ®ä¸è¿°çå®ä¹ï¼æä»¬æåºå¦ä¸æ¦å¿µï¼
* Node æ¯ JavaScript çæå¡å¨è¿è¡ç¯å¢ï¼runtimeï¼
* Node éç¨ Google å¼åç V8 弿è¿è¡ä»£ç
* Node éç¨äºä»¶é©±å¨ï¼éé»å¡å弿¥ I/O 模å
ä¸å¥è¯æ»ç»ä¸ä¸ï¼Node æ¯éç¨**äºä»¶é©±å¨**ï¼**éé»å¡å¼æ¥ I/O** 模åï¼è¿è¡å¨ V8 弿ä¸ï¼ JavaScript è¯è¨å¨æå¡å¨ç«¯çè¿è¡ç¯å¢ãå
³äºäºä»¶é©±å¨ï¼éé»å¡å¼æ¥ I/O çæ¦å¿µï¼ä¼å¨åç»ç课ç¨ä¸è¯¦ç»ä»ç»å°ã
## Node çè¯ç
Node è¯çäº 2009 å¹´ï¼ä»çä½è
Ryan Dahl èµ·åæ³è¦å建ä¸ä¸ªé«æ§è½ç Web æå¡å¨å¹¶æä¾ä¸å¥åºãæ³è¦åå»ºé«æ§è½ç Web æå¡å¨ï¼è³å°è¦å
·å¤ä¸¤ä¸ªæ¡ä»¶ï¼**äºä»¶é©±å¨**ï¼**éé»å¡å¼æ¥ I/O**ã
äºæ¯ï¼ä»çç®æ å°±æ¯è¦åä¸è¿æ ·ç Web æå¡å¨ï¼èä»å¹¶ä¸æ³éæ°ååé ä¸é¨ç¼ç¨è¯è¨ï¼é£ä¹ä½¿ç¨ä»ä¹ç¼ç¨è¯è¨å¢ï¼è¿æ¯ä¸ä¸ªé®é¢ã仿¬èº«æ¯ C/C++ ç¨åºåï¼ç¶èä»è®¤ä¸º C++ ç鍿§å¤ªé«äºï¼å¾å¤å¼åè
å¯è½å¹¶ä¸æ³å»åå®é
çä¸å¡å¼åï¼èåºäº **äºä»¶é©±å¨**ï¼**éé»å¡å¼æ¥ I/O** è¿ä¸¤ç¹çèèï¼è¡¡éäº Rubyï¼Haskell çè¯è¨åï¼ä»æç»éæ©äº JavaScript ä½ä¸ºå®çè¯è¨ã
卿¤ä¹åï¼JavaScript åªæ¯ä¸é¨å¨æµè§å¨ç¯å¢ä¸è¿è¡çè¯è¨ï¼å®çå¦ä¹ 鍿§é常ä½ï¼è卿å¡å¨ç«¯å 乿²¡æå¸åºï¼å¯ä»¥è¯´ãè¿æ¯ä¸çååãï¼ä¸ºå®åå
¥ä¸å¥ãéé»å¡å¼æ¥ I/O åºãè¦å®¹æå¾å¤äºãå¦å¤ä¸ä¸ªéè¦çåå ï¼JavaScript 卿µè§å¨ç¯å¢ä¸ï¼å°±å·²ç»å¹¿æ³ç使ç¨äºãäºä»¶é©±å¨ãï¼å页颿é®ççå¬ç¹å»å¨ä½ï¼é¡µé¢å è½½å®æäºä»¶ççï¼é½æ¯ãäºä»¶é©±å¨ãæ¹é¢çåºç¨ã
æ£æ¯å 为 JavaScript è¿ä¸ä¸ªæ¹é¢çä¼å¿ï¼ 1. å¦ä¹ 鍿§ä½ 2. æ 太å¤é»åæå»ºéé»å¡å¼æ¥ I/O 模å 3. äºä»¶é©±å¨ç天ç¶ä¼å¿
让 JavaScript æä¸ºäº Node çå®ç°è¯è¨ãè卿µè§å¨å¤§æä¸ï¼Google ç Chrome æµè§å¨ JavaScript V8 弿䏿æåï¼äºæ¯ Node éç¨é«æ§è½ç V8 ä½ä¸ºè¿è¡ç¯å¢ï¼ä¹å°±é¡ºçæç« äºã
说å°è¿éï¼ç¸ä¿¡ä½ å·²ç»å¤§æ¦äºè§£ Node å®ä¹ä¸ç飿®µè¯ï¼æ¥ä¸æ¥çé®é¢æ¯ï¼å®è½åä»ä¹å¢ï¼
## Node çç¨é
å
¶å®ï¼ææ¯è¾åæå»åçï¼æä¸ªè¯è¨è½åä»ä¹ï¼æè®¤ä¸ºè¿æ¯ä¸ä¸ªç¹å«æ²¡æææçé®é¢ï¼æ¯å¦ï¼æç¹äººå¯è½ä¼è¯´ï¼æè¦åç¬è«ï¼æä»¥æè¦å¦ Pythonï¼æè¦å¦å¼åç½ç«ï¼æä»¥æè¦å¦ PHP å Javaãè¿å
¶ä¸ï¼å
¶å®æ²¡æä»»ä½çå æå
³ç³»ï¼æå
³ç³»çåªæ¯ä½ ææ¡çç¨åº¦ã
å°±å¦ Ryan Dahl æ³è¦ä¸ä¸ªé«æ§è½ç Web æå¡å¨ï¼ä»çéæ©æ¯åé äº Nodeï¼ä½¿ç¨äº JavaScript è¯è¨ã卿¤ä¹åï¼ä½ 妿è¦é® JavaScript è½åä»ä¹ï¼å¾å°ççæ¡åºè¯¥æ¯ï¼è®©ç½é¡µå¨èµ·æ¥ã**èå¦ä»ï¼ä½ å ä¹å¯ä»¥ä½¿ç¨ JavaScript åä»»ä½äºæ
**ã
好äºï¼æä»¬æ¢ä¸ªé®æ³ï¼Node éååä»ä¹ï¼åé¢ä»ç»äºï¼å®æ¯ä¸ä¸ªé«æ§è½ç Web æå¡å¨ï¼ éç¨çæ¯äºä»¶é©±å¨ï¼å¼æ¥I/O模åï¼é£ä¹å®çä¼å¿å°±å¨ Webï¼é«æ§è½ I/O ä¸é¢ï¼äºæ¯å®æ
é¿åå¦ä¸åºç¨ï¼
* Web æå¡ APIï¼ REST ï¼
* æå¡ç«¯ Web åºç¨ï¼é«å¹¶å请æ±
* 峿¶éä¿¡åºç¨
* éææä»¶æå¡å¨ï¼ I/O ç±»ï¼
* ......
æ
é¿çåºç¨å¯è½å¤äºå»äºï¼é£ä¹ï¼å®ä¸æ
é¿ä»ä¹ï¼
åå±ä¹åçæ¶åï¼ç±äºå线ç¨çå¼±ç¹ï¼æå¯è½ä¼è¯´ï¼å®ä¸éåå¨å¤ CPU æ¶ææå¡å¨ä¸è¿è¡ï¼å ä¸ºä»æ¯å线ç¨çï¼ï¼ä¸éååå¤§è§æ¨¡è®¡ç®ç±»çåºç¨ï¼å 为å线ç¨ï¼ä¸æ¦ CPU 被计ç®é»å¡ï¼å¼æ¥ä¹å°±ç½æ¯äºï¼ï¼ä½æ¯ï¼å¦ä»è¿äºæ¾ç»çé®é¢ï¼é½å·²ç»ä¸æ¯é®é¢äºï¼Node å¼å
¥äº child\_process åè¿ç¨æ¨¡åï¼è§£å³å线ç¨é®é¢ã
æä»¥ï¼Node çç¨éæ¯é常广æ³çï¼æ³åç¬è«ï¼ä½¿ç¨ Node 乿¯å¯ä»¥å®ç°çï¼æ³å Web ï¼Node æ´æ¯å¯ä»¥èä»»ã
å¨æçæ¥ï¼å
¶ä»ç¼ç¨è¯è¨ä¹é½ä¸æ ·ï¼ä»ä»¬åªæ¯ä¸ä¸ªå·¥å
·ï¼ä¸ºæä»¬æå¡çå·¥å
·ï¼é®é¢æ¯æä»¬è½ä¸è½ç¨å¥½è¿ä¸ªå·¥å
·ï¼è䏿¯å·¥å
·æ¬èº«çé®é¢ï¼å½ç¶ï¼ä¹ä¸å¯å¦è®¤å·¥å
·æ¯å¦åéçé®é¢ã**å¨æäº Node ä¹åï¼å¦ä»ç JavaScript å ä¹å¯ä»¥åä»»ä½äºæ
**ã
## é²èï¼JavaScript çé£äºè§è
ä½ å·²ç»ç¥éäºï¼Node åªæ¯ JavaScript 卿å¡å¨ç«¯çè¿è¡ç¯å¢ï¼æä»¥ï¼å¨ä½¿ç¨ Node å¼åè¿ç¨ä¸ï¼æä»¬ä½¿ç¨çæ¯ JavaScript è¿é¨è¯è¨ï¼é´äºå®çç¹æ®æ§ï¼ä»¥åå岿¸æºï¼æè§å¾è¿æ¯æå¿
è¦èä¸èï¼å
³äº JavaScript çä¸äºè§èã
JavaScript è¯è¨çç¼é è
ãç½æ¯ãå
¬å¸ï¼å¸æ JavaScript è¯è¨è½å¤æä¸ºå½é
æ åï¼æå¼å§äº¤ç»æ ååç»ç» ECMA å»å¶ä½è§èï¼ç±äºä¸ Java åæ çå ç´ ï¼ECMA ç»ç»åå¸çè¿å¥è§èï¼ä¸å« JavaScript ï¼èæ¯å« ECMAScriptï¼è¿å°±æ¯ ECMAScript çç±æ¥ï¼ä¹æ¯æåç JavaScript è¯è¨ç宿¹è§èã
ECMAScript 5.1 å° 6.0 çæ¬çæ¶åï¼ECMA æ ååç»ç»æ³è®©å叿 ååæä¸ä¸ªå¸¸è§æµç¨ï¼äºæ¯è§å®æ¯å¹´ 6 æä»½çæ¶ååå¸ä¸æ¬¡æ£å¼çæ¬ï¼ä¸åæ²¿ç¨æ§çæ¬å·æ¥è®°å½ï¼ç´æ¥ä»¥å½å¹´å¹´ä»½ä½ä¸ºåç§°ï¼ä¾å¦ï¼ECMAScript 2018ï¼ç®ç§° ES2018ï¼å°±æ¯å¨ 2018 å¹´ 6 æåå¸çææ°ä¸çã以è¿ç§è§ååå¸ç第ä¸ä¸ªçæ¬æ¯å¨ 2015 å¹´ 6 æï¼å®æ¯ 5.1 å° 6.0 ç第ä¸ä¸ªçæ¬ï¼ç§°ä½ ES2015 ï¼ä¹ç§°ä½ ES6ï¼ç±äºè¿ä¸æ¬¡çååéå¸¸å¤§ï¼æä»¥ï¼ES6 æ³æä¸ä¸ä»£ JavaScript æ åã
æä»¬é½ç¥éï¼å¨ Node è¯çä¹åï¼JavaScript ä¸ç´ä¸»è¦åºç¨äºæµè§å¨ç«¯ï¼å®å¨æå¡å¨ç«¯çä½ä¸ºï¼å ä¹å¯ä»¥å¿½ç¥ä¸è®¡ãæä»¥ ES6 æ åä¹åï¼JavaScript çè§èé½åéäºæµè§å¨ç«¯çç¯å¢ï¼æä»¥ï¼å®ç宿¹è§èæ¯ç¸å½èå¼±çï¼é½ä¸è½ç§°ä½ä¸ºä¸ä¸ªå®æ´çè¯è¨ã
è CommonJS å°±å¨è¿ç§èæ¯ä¸ï¼ç± JavaScript å¼åè
社åºå
±åå¶å®åºæ¥äºï¼å®å®ä¹äº JavaScript è¯è¨ç模åç³»ç»ï¼Bufferï¼I/Oå¤çï¼Web æå¡å¨æ¥å£ççè§èï¼å¡«è¡¥äº JavaScript 卿å¡å¨ç«¯ç空缺ï¼Node æ£æ¯åå©äº CommonJS çä¸äºè§èï¼è¿
é卿å¡å¨ç«¯æå¼å¸åºã
éçæ¶é´æ¨ç§»ï¼å大æµè§å¨å¯¹ ES6 çæ¯æä»¥å Node çåå±ï¼ES6 æ£å¼æä¸ºä¸ä¸ä»£ JavaScript è¯è¨çå½é
æ åã
> æ¥çæµè§å¨å¯¹ ES6 çæ¯æç¨åº¦ 访é®ï¼