Node.js 基礎(chǔ)

切換版本:nvm

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

異步 I/O:

比如去醫(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 ?

Node.js 提供了 cluster / child_process 模塊

模塊化機(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

加載方式:

  1. 加載內(nèi)置模塊 require('fs')
  2. 加載 相對(duì)|絕對(duì) 路徑的文件模塊
require('./file.js')
require('/User/.../file.js')
  1. 加在 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 中緩存著加載過的模塊,緩存的原因:同步加載

  1. 文件模塊查找耗時(shí),如果每次 require 都需要重新遍歷查找,性能會(huì)比較差。
  2. 在實(shí)際開發(fā)中,模塊可能包含副作用代碼。


AMD 是 RequireJS 在推廣過程中規(guī)范化產(chǎn)出,異步加載,推崇依賴前置。
CMD 時(shí) SeaJS 在推廣過程中規(guī)范化產(chǎn)出,異步加載,推崇就近依賴。
UMD(Universal Module Definition)規(guī)范,兼容 AMD 和 CommonJS 模式

ES Modules(ESM),語言層面的模塊化規(guī)范,與環(huán)境無關(guān),可借助 babel 編譯
  • CommonJS 模塊輸出的是一個(gè)值的拷貝;ESM 模塊輸出的是值的引用


  • CommonJS 模塊時(shí)運(yùn)行時(shí)加載;ESM 模塊是編譯時(shí)輸出(提前加在)

Web 應(yīng)用開發(fā)

Koa——基于 Node.js 平臺(tái)的下一代 Web 開發(fā)框架

執(zhí)行過程:

  1. 服務(wù)啟動(dòng)
  • 實(shí)例化 application
  • 注冊(cè)中間件
  • 創(chuàng)建服務(wù)、監(jiān)聽端口
  1. 接受/處理請(qǐng)求
  • 獲取請(qǐng)求 req、res 對(duì)象
  • req -> request、res -> response 封裝
  • request & response -> context
  • 執(zhí)行中間件
  • 輸出設(shè)置到 ctx.body 上的內(nèi)容

Koa 是一個(gè)包含一組中間件函數(shù)的對(duì)象,它是按照洋蔥模型組織和執(zhí)行的

常用中間件

  • 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)程管理
  • 腳手架
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容