由於 Node.js 其非同步和事件驅動的特性,Node.js 特別適合構建高效能的網絡應用程式。本文將介紹 Node.js 的三個基礎概念:事件驅動和非阻塞I/O、模組系統以及 npm 套件管理器。
在傳統的伺服器架構中,每一個請求通常會分配一個單獨的執行緒來處理,這種方式雖然簡單,但會在大量並發請求時消耗大量的資源。Node.js 則不同, Node.js 是採用了事件驅動和非阻塞 I/O 的架構。
Node.js 使用單執行緒來處理所有請求,但它會透過事件驅動的方式來管理。當一個請求到達時,Node.js 將其分派給事件迴圈(Event Loop),並註冊一個回調函數來處理該請求。當 I/O 操作(如讀寫文件或查詢數據庫)完成後,回調函數會被觸發,繼續處理後續邏輯。
在傳統的阻塞 I/O 模式中,執行緒會等待 I/O 操作完成後再繼續後續的操作。這樣會導致資源的浪費。Node.js 則採用了非阻塞 I/O,即在發出 I/O 請求後,Node.js 會繼續處理其他請求,而不會等待 I/O 操作完成。當 I/O 操作完成後,對應的回調函數才會被執行。
以下是一個簡單的例子來說明非阻塞 I/O:
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
console.log('這行程式碼會先執行,即使文件尚未讀取完成');
在這段程式碼中,readFile
是一個非阻塞方法,它不會等待文件讀取完成,而是立即繼續執行後續程式碼。
Node.js 內建了一個強大的模組系統,使得開發者可以將程式碼分解為小而易於管理的模組。每個模組都是一個單獨的文件,具有自己的作用域。這樣的設計有助於避免變量衝突,並程式碼碼更具可維護性。
在 Node.js 中,我們可以通過 require
函數來加載模組。例如:
// 加載內建的 http 模組
const http = require('http');
// 創建一個簡單的 HTTP 伺服器
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('伺服器運行在 http://127.0.0.1:3000/');
});
這段程式碼展示了如何使用 Node.js 的內建模組 http
來創建一個簡單的 HTTP 伺服器。模組系統不僅限於內建模組,你也可以創建自己的模組並在項目中使用。
npm(Node Package Manager)是 Node.js 的套件管理工具,它允許開發者輕鬆地分享和管理項目中的依賴套件。透過 npm,你可以安裝現成的開源套件,節省開發時間。
例如,要安裝一個名為 express
的 web 框架,你只需運行以下命令:
npm install express
安裝完成後,你可以在項目中使用這個套件:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(3000, () => {
console.log('伺服器運行在 http://localhost:3000/');
});
npm 也提供了套件的版本管理功能,讓你可以鎖定某個特定版本,確保項目的穩定性。此外,透過 package.json
文件,你可以清晰地定義項目的依賴關係,讓其他開發者能夠輕鬆地在自己的環境中復製你的開發環境。
Node.js 的事件驅動和非阻塞 I/O 架構,使其在高並發應用中表現優異。模組系統讓程式碼結構更清晰,而 npm 套件管理器則提高了開發效率。這些是學習 Node.js 的基礎概念,理解它們能夠幫助你更好地掌握 Node.js。
😊 感謝你的耐心閱讀,若是你喜歡這篇內容,可以透過以下方式表達你的喜歡 😊
❤️按個愛心|💬留言互動|🔗分享此文|📌追蹤阿梧