先來了解Node.js發展
Node.js 發展關鍵里程碑與趨勢:
誕生與興起 (2009-2014):
Ryan Dahl 為了處理高並發網路應用,將 Chrome 的 V8 引擎移植到伺服器端,推出了輕量、高效的 Node.js,快速在開源社群流行。
io.js 分裂與合併 (2014-2015):
因管理與發展方向分歧,社群分支出 io.js,後在 2015 年合併回 Node.js 基金會,讓社群更健康地運作。
成熟與現代化 (2015-至今):
納入 OpenJS Foundation,擁抱現代 JavaScript (ES6+),並建立強大的 npm 生態系統,成為企業級應用 (如 Netflix, Uber, PayPal) 的主流後端技術。
高效能優勢:
Node.js 擅長處理大量並發請求 (如 WebSocket 即時服務),且因為使用 JavaScript,顯著提升了開發效率與代碼共用性。
未來發展:
隨著 Deno 等新興執行環境出現,Node.js 依然持續優化其穩定性、安全性和效能。
JavaScript 是語言,Node.js 是執行環境
在JavaScript程式語言本身,原本只能在瀏覽器執行,主要用途為網頁互動,用於前端交互的腳本語言,通常必須透過瀏覽器才能執行。
JavaScript並沒有模組化概念,所以沒有提供原生的模組化系統。
Node.js 是基於 Google Chrome V8 引擎 的開源、跨平台 JavaScript 執行環境 (Runtime Environment),它讓 JavaScript 脫離瀏覽器,直接在電腦或伺服器上運作。Node.js 採用非阻塞 I/O 與事件驅動模型,具備高效能,適用於開發即時通訊、Web 伺服器等後端應用,是現代前端與後端開發的關鍵工具。
它做了幾件重要的事:
* 使用 V8 引擎(來自 Chrome)
* 提供伺服器 API(fs、http…)
* 提供模組系統(Modules)
* 提供事件迴圈(Event Loop)
👉 總結來說,Node.js 已經從當初的實驗性專案,轉變為現代 Web 開發不可或缺的基礎設施。
👉 Node.js 是一個讓 JavaScript 可以在「瀏覽器外」執行的執行環境(Runtime)
👉 Node.js = JavaScript + 系統執行 + 模組化
Node.js 特點
Node.js 是一個開源且跨平台,它轉變成一種功能全面的開發方式,模組化將龐大程式碼拆分為獨立、具相關性的 JS 檔案(模組),可用於構建高性能、事件驅動的伺服器應用程序。
最大特點之一是憑藉基於 V8 引擎的非阻塞I/O模型(Non-blocking I/O model)與事件驅動架構,徹底改變了 JavaScript 僅能運行於瀏覽器端的限制,實現了「前後端語言統一」。
其歷經了與 io.js 的分合,如今已成為成熟的跨平台開源執行環境,在即時通訊、微服務與高並發應用中扮演關鍵角色。
Node.js 因此先自定義了一套模組系統,就是CommonJS。
CommonJS 是 Node.js 最初採用的模組系統規範,而 Core Modules (核心模組,如 fs, http, path) 是內建於 Node.js 中並遵循此規範的基礎組件。
Modules 是 JavaScript 的「組織方式」
🔹 為什麼需要 Modules?
如果沒有模組:會變成難維護、變數污染、團隊難協作
// 全部寫在同一個檔案
function add() {}
function login() {}
function connectDB() {}
function sendEmail() {}
🔹 Modules 解決的問題
Modules 是:把程式拆分成多個檔案,每個檔案只負責一件事
例如:
// 不同檔案做的事情
app.js
db.js
auth.js
utils.js
Node.js 與 Modules 的核心關係
關係其實是這樣:
JavaScript (語言)
↓
Node.js (執行環境)
↓
提供 Module System (模組機制)
👉 模組系統不是 JavaScript 本來就有的東西
👉 是 Node.js 先實作出來的
Node.js 核心模組 介紹
1. fs (File System) - 檔案系統
用於操作檔案和目錄,提供異步和同步方法,常見於讀取、寫入、刪除檔案。
用法: const fs = require('fs');
2. http & https - 網路服務
用於建立伺服器 (Server) 或發送 HTTP 請求 (Client)。
用法: const http = require('http');
3. path - 路徑處理
處理檔案路徑、目錄路徑,確保程式在不同作業系統(Windows/Linux)上路徑格式一致。
用法: const path = require('path');
4. events - 事件驅動
Node.js 核心機制,用於建立和觸發事件,核心類別是 EventEmitter。
用法: const EventEmitter = require('events');
5. url - URL 解析
用於解析、格式化及處理 URL 字串,拆解主機名、路徑、查詢參數等。
用法: const url = require('url');
6. querystring - 查詢字串處理
解析和格式化 HTTP 查詢參數(例如 ?id=1&name=node)。
用法: const querystring = require('querystring');
7. util - 工具程式
提供許多實用的函式,例如輔助繼承、格式化字串。
用法: const util = require('util');
Node.js 的模組本質是什麼?
在 Node.js 裡:
👉 每一個 .js 檔案就是一個模組
👉 每個模組都有自己的作用域(scope)
👉 不會污染全域變數,這就是為什麼變數不會跑到全域。
// 實際上 Node.js 會幫你包成:
(function (exports, require, module, __filename, __dirname) {
// 你的程式碼
});
Node.js 模組主要類型 Module Types
1. CommonJS (CJS) - 傳統預設
CommonJS 定義了 require() 匯入與 module.exports 匯出方式,Core Modules 則是透過這套機制直接載入使用的內建功能。
語法:const module = require('module') 與 module.exports。
特性:同步載入,檔案後綴通常為 .js (未設定時) 或 .cjs。
適用:舊版 Node.js 專案或不需 ESM 的輕量腳本。
2. ECMAScript Modules (ESM) - 現代標準
語法:import { func } from 'module' 與 export。
特性:非同步載入,支援靜態分析。檔案後綴通常為 .mjs 或在 package.json 設定 "type": "module"。
適用:現代 JavaScript 專案、需要前端語法一致性。
3. 依來源分類
核心模組 (Core Modules):Node.js 內建原生模組,如 fs (檔案系統)、http (網路)、path (路徑)。
第三方模組 (Third-party Modules):透過 npm 安裝的套件,存放於 node_modules 目錄。
自定義模組 (Local Modules):開發者自行編寫的 .js 檔案。
三者的關係總結圖
JavaScript
│
├── 語法 (function, class, arrow function)
│
└── ECMAScript Module (import/export)
↑
Node.js 提供
│
├── CommonJS (require)
├── 內建模組 (fs, http)
├── 第三方模組 (npm)
└── 檔案系統 API