Node.js基本概念理解

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

这句话是 Node.js 的核心设计理念,我用餐厅服务员的比喻来帮你拆解理解:


一、整体比喻:Node.js 是一家"超高效快餐店"

  • 传统服务器(如PHP):一个服务员从头到尾服务一桌客人(点单→做菜→上菜→结账),期间不能服务其他桌
  • Node.js :一个服务员快速记录 所有桌的订单,交给后厨(I/O操作)后,立刻服务下一桌,做好了通知他再去端菜

二、分句详解

1. "基于 Chrome V8 引擎"

理解:Node.js 用 Chrome 浏览器的"发动机"来跑 JS 代码

场景 解释
浏览器中的JS V8引擎解析JS → 操作DOM → 渲染页面
Node.js中的JS V8引擎解析JS → 操作文件/网络/数据库 → 返回数据

好处:V8是C++写的,性能极高(JIT编译、垃圾回收优化),让JS运行速度接近原生代码


2. "事件驱动"

理解 :代码不是按顺序死板执行,而是 "有事我叫你,没事别管我"

javascript 复制代码
// ❌ 传统方式:主动等待(阻塞)
const data = fs.readFileSync('/file.txt'); // 干等文件读完
console.log(data);                         // 才能执行这行

// ✅ Node.js方式:注册回调(事件驱动)
fs.readFile('/file.txt', (err, data) => {  // 告诉Node:读完文件"叫"我
  console.log('文件读完了!', data);        // 这个函数是"事件处理函数"
});
console.log('我先去干别的了...');          // 不等待,立即执行

输出顺序

css 复制代码
我先去干别的了...
文件读完了! [文件内容]

类比 :你点外卖后不需要在门口干等 ,而是继续工作,外卖到了小哥打电话通知你(事件触发)


3. "非阻塞式 I/O"

理解 :I/O操作(文件、网络、数据库)就像烧水 ,Node.js 不会傻等水开

  • 阻塞式(同步):站在水壶前,啥也不干,水开了才走
  • 非阻塞式 (异步):按下烧水按钮,立刻去做别的事,水壶响了(事件)再回来
javascript 复制代码
// 同时发起1000个网络请求
for (let i = 0; i < 1000; i++) {
  http.get('http://api.example.com', (res) => { // 非阻塞:发出请求就下一循环
    console.log(`请求${i}完成`); // 响应返回后自动执行回调
  });
}
// 1000个请求几乎瞬间发完,不需要等任何一个返回

关键 :单线程的 Node.js 能同时处理数万个连接,不是靠多线程,而是靠不等待


三、三者如何协同工作?

javascript 复制代码
// 完整事件循环示意图
┌─────────────────────────────────────┐
│        Node.js 主线程(单线程)       │
│  不断检查"事件队列"(像前台接待员)    │
└─────────────────────────────────────┘
         ↑               ↓
    有新事件吗?       执行回调函数
         ↑               ↓
┌────────┴────────┬────────┴────────┐
│  文件系统完成   │   网络响应到达   │   数据库查询完成
│  (V8不管这些)    │  (V8不管这些)    │   (V8不管这些)
└─────────────────┴─────────────────┘

工作流程

  1. V8引擎:快速执行你的JS代码,注册回调函数
  2. 非阻塞I/O :遇到耗时操作,交给操作系统内核线程池处理,主线程立即继续
  3. 事件驱动:操作完成后,内核通知 Node.js,V8执行对应的回调函数

四、为什么"轻量又高效"?

传统多线程服务器 (Apache) Node.js
每个请求 = 一个线程(约2MB内存) 所有请求 = 一个线程(几KB内存)
10000个连接 ≈ 20GB内存 10000个连接 ≈ 几十MB内存
线程切换CPU开销大 无线程切换,CPU只做有用功
适合CPU密集型(如图像处理) 适合I/O密集型(API、聊天室、实时推送)

代价 :如果回调函数里有for(let i=0; i<1000000000; i++)这种CPU重计算,会卡住整个事件循环,后续所有请求都等待(这叫"阻塞事件循环")。


五、一句话总结

Node.js = 用V8引擎跑JS + 单线程不等待 + 有事call back

它就像一家只有一个服务员但永不空闲 的餐厅,通过"事件通知"机制,用极少的资源处理海量并发,但不适合做需要长时间占用CPU的复杂计算(那种任务要交给其他语言或用Worker Threads)。

相关推荐
G_GreenHand6 小时前
vue自定义日历
前端·javascript·vue.js
冴羽6 小时前
前端性能革命:200 行 JavaScript 代码实现 Streaming JSON
前端·javascript·react.js
inksci6 小时前
上传文件可以用飞帆的组件
前端·javascript
DIKKOO6 小时前
React 19 修复了一个遗留多年的类型乌龙,过程竞如此曲折
前端·react.js
程序员爱钓鱼6 小时前
Node.js 编程实战:Node.js + React Vue Angular 前后端协作实践
前端·后端·node.js
程序员爱钓鱼6 小时前
Node.js 编程实战:前后端结合的 SSR 服务端渲染
前端·后端·node.js
haokan_Jia6 小时前
Java 并发编程-ScheduledFuture
java·前端·python
bst@微胖子6 小时前
CrewAI+FastAPI实现多Agent协作项目
java·前端·fastapi
掘金酱6 小时前
TRAE 2025 年度报告分享活动|获奖名单公示🎊
前端·人工智能·后端
jqq6667 小时前
解析ElementPlus打包源码(三、打包类型)
前端·javascript·vue.js