😺😺😺 一、Node.js 底層原理(簡化版)
Node.js 是一個 基于 Chrome V8 引擎構建的 JavaScript 運行時,底層核心由幾部分組成:
組成部分簡要說明
1.V8 引擎
將 JS 編譯成機器碼執行,提供高性能執行環境。
2.libuv 庫
用于實現事件循環、非阻塞 I/O、線程池等。
3.C++模塊
Node.js 內部很多底層模塊(如 fs、net)是用 C++ 寫的。
4.事件循環(Event Loop)
負責調度異步任務(定時器、I/O、Promise 等)。
5.Bindings機制
JS 和 C++ 之間的橋梁,用于 JS 調用底層 C++ 模塊。
😺😺😺 二、Node.js 核心特性 + 示例 + 簡單底層機制
😺😺1.事件驅動(Event-driven)
Node 使用 觀察者模式 和 事件循環 來處理事件。
😺示例
下面展示一些 內聯代碼片
。
const EventEmitter = require(‘events’);
const emitter = new EventEmitter();
emitter.on(‘sayHi’, () => {
console.log(‘Hi!’);
});
emitter.emit(‘sayHi’);
😺底層原理
? EventEmitter 是 Node 封裝的事件機制;
? 內部維護一個事件與回調函數的映射表;
? emit 觸發時,把對應回調函數放入 事件隊列,由 事件循環 取出執行。
😺😺2. 非阻塞 I/O(Non-blocking I/O)
Node 的所有 I/O 操作默認都是異步的。
😺示例
fs = require(‘fs’);
fs.readFile(‘demo.txt’, ‘utf8’, (err, data) => {
console.log(data);
});
console.log(‘Start reading file…’);
😺底層原理
? JS 發起調用后,實際由 libuv 用 C/C++ 發出系統調用;
? I/O 任務交給內核或線程池去執行;
? 操作完成后將回調放入事件隊列;
? 最終由事件循環執行回調。
😺😺3.單線程+事件循環(Single Thread + Event Loop)
Node 只有一個主線程在跑 JS,但能處理高并發任務。
😺示例
setTimeout(() => {
console.log(‘Timeout called’);
}, 1000);
console.log(‘After setTimeout’);
😺底層原理
? 主線程執行 setTimeout,libuv 記錄定時器;
? 到時間后將回調放入事件隊列;
? 事件循環輪詢隊列并執行回調。
😺😺4. 模塊化(CommonJS 模塊系統)
Node 用 CommonJS 實現模塊導入與導出。
😺示例
// math.js
module.exports.add = (a, b) => a + b;
// app.js
const math = require(’./math’);
console.log(math.add(2, 3));
😺底層原理
? Node 內部用 C++ 實現了模塊加載器;
? require() 會先緩存模塊,防止重復加載;
? 模塊包裝成 (function(exports, require, module) {…}) 執行。
😺😺5.跨平臺
Node 可在 Windows、Linux、macOS 上運行。
😺底層原理
? 使用 C++ 寫的 libuv 提供跨平臺兼容性;
? 統一抽象了不同操作系統的 I/O 接口。
😺😺總結對照表
😺😺 😺三 具體源碼學習
1. fs 模塊(文件讀寫)
? JS 層:lib/fs.js
? C++ 層綁定:src/node_file.cc、src/fs_event_wrap.cc
? libuv 層:deps/uv/src/unix/fs.c / fs-poll.c
2. http 模塊(網絡)
? JS 層:lib/http.js
? C++ 層綁定:src/stream_base.cc、src/tcp_wrap.cc
3. 事件循環
? 核心文件:src/node.cc、src/env.cc
? 事件循環封裝在 libuv:deps/uv/src/unix/core.c
4. 模塊加載機制(CommonJS / ESM)
? 代碼:lib/module.js、lib/internal/modules、src/module_wrap.cc
可以用 VS Code 加 ctags / ripgrep 輔助跳轉分析。
…
4.vue.js特性
5.js原生語法 promise async/await的使用