切換版本:nvm
特點(diǎn):異步 I/O、單線程、跨平臺(tái)

比如去醫(yī)院看病掛完號(hào)可以去干別的,等醫(yī)生通知
單線程:Node.js 保持了 JS 在瀏覽器中單線程的特點(diǎn)(一個(gè)進(jìn)程只開一個(gè)線程)
Node.js 雖然是單線程模型,但是其基于事件驅(qū)動(dòng)、異步非阻塞模式,可以應(yīng)用于高并發(fā)場(chǎng)景
優(yōu)點(diǎn):
- 不用處處在意狀態(tài)同步問題,不會(huì)發(fā)生死鎖。
- 沒有線程上下文切換帶來的性能開銷
缺點(diǎn)(解決方案后邊會(huì)講):
- 無法利用多核CPU
- 錯(cuò)誤會(huì)引起整個(gè)應(yīng)用退出,健壯性不足
- 大量計(jì)算占用 CPU,導(dǎo)致無法繼續(xù)執(zhí)行
如何利用多核 CPU ?

模塊化機(jī)制
何為模塊化?
根據(jù)功能或者業(yè)務(wù)將一個(gè)大程序拆分成相互依賴的小文件,再用簡(jiǎn)單的方式拼接起來。
為什么要模塊化?不模塊化會(huì)產(chǎn)生什么問題?
- 所有 script 標(biāo)簽必須保證順序正確,否則會(huì)依賴報(bào)錯(cuò)。
- 全局變量存在命名沖突,占用內(nèi)存無法被回收
- IIFE(Immediately Invoked Functions Expressions)/namespace 會(huì)導(dǎo)致代碼可讀性低等諸多問題
Node.js 支持 CommonJS 模塊規(guī)范,采用同步機(jī)制加載模塊。
Node.js 讀文件的速度很快,因?yàn)?Node.js 部署在服務(wù)端,不用像瀏覽器那樣發(fā)網(wǎng)絡(luò)請(qǐng)求。
// greeting.js
const preFix = 'Hello';
const sayHi = function () {
return `${preFix} world`;
};
module.exports = {
sayHi,
};
// exports.sayHi = sayHi;
// index.js
const { sayHi } = require('./greeting');
console.log(sayHi()); // Hello world
加載方式:
- 加載內(nèi)置模塊 require('fs')
- 加載 相對(duì)|絕對(duì) 路徑的文件模塊
require('./file.js')
require('/User/.../file.js')
-
加在 npm 包,require('lodash')
npm 包查找原則:當(dāng)前目錄 node_modules -> 父級(jí)目錄的 node_modules -> 沿著路徑向上遞歸,直到根目錄下的 node_modules -> 找到之后會(huì)加載 package.json main 指向的文件,如果沒有 package.json 則依次查找 index.js、index.json、index.node
require.cache 中緩存著加載過的模塊,緩存的原因:同步加載
- 文件模塊查找耗時(shí),如果每次 require 都需要重新遍歷查找,性能會(huì)比較差。
-
在實(shí)際開發(fā)中,模塊可能包含副作用代碼。
AMD 是 RequireJS 在推廣過程中規(guī)范化產(chǎn)出,異步加載,推崇依賴前置。
CMD 時(shí) SeaJS 在推廣過程中規(guī)范化產(chǎn)出,異步加載,推崇就近依賴。
UMD(Universal Module Definition)規(guī)范,兼容 AMD 和 CommonJS 模式


-
CommonJS 模塊輸出的是一個(gè)值的拷貝;ESM 模塊輸出的是值的引用
- CommonJS 模塊時(shí)運(yùn)行時(shí)加載;ESM 模塊是編譯時(shí)輸出(提前加在)
Web 應(yīng)用開發(fā)
Koa——基于 Node.js 平臺(tái)的下一代 Web 開發(fā)框架
執(zhí)行過程:
- 服務(wù)啟動(dòng)
- 實(shí)例化 application
- 注冊(cè)中間件
- 創(chuàng)建服務(wù)、監(jiān)聽端口
- 接受/處理請(qǐng)求
- 獲取請(qǐng)求 req、res 對(duì)象
- req -> request、res -> response 封裝
- request & response -> context
- 執(zhí)行中間件
- 輸出設(shè)置到 ctx.body 上的內(nèi)容



常用中間件
- koa-router:路由解析
- koa-body:request body 解析
- koa-logger: 日志記錄
- koa-views:模版渲染
- koa2-cors:跨域處理
- koa-session:session 處理
- hoa-helmet:安全防護(hù)
Koa 中間件繁多,質(zhì)量參差不齊,需要合理選擇,高效組合。
基于 Koa 的前端框架:ThinkJS/Egg
他們做了什么?
- Koa 對(duì)象 response / request / context / application 等拓展
- Koa 常見中間件庫(kù)
- 進(jìn)程管理
- 腳手架


