Appearance
Node.js 基础与应用
Node.js 是什么?
- Node.js 不是一种编程语言,它是让 JavaScript 可以运行在服务端的运行时环境。
- 由 Chrome V8 引擎 构建(V8 负责 JS 代码的解析与执行)。
- Node 内置了许多模块(如文件系统、网络、操作系统等 API),让 JS 能和底层系统进行交互。
- Node 只包含 ECMAScript,不内置 DOM/BOM 等浏览器特有的对象。
Node.js 能做什么?
- Web 服务器/中间层
作为前端和后端的数据中转站,常用于 BFF (Backend For Frontend) 模式。 - 解决跨域问题
通过代理方式,使前端请求先发给 Node,再由 Node 转发至后端服务器。 - 前端工具开发
如 Webpack、Vue CLI、ESLint、Babel 等,底层都依赖 Node 环境。 - 服务端渲染(SSR)
服务器端运行 JS 代码生成 HTML,提高 SEO 和首屏速度。常见于 React/Vue 等框架。 - 高并发场景
适合处理大量 I/O(网络、文件等)请求。 - 开发命令行工具、脚本、自动化任务
- 实时应用
如聊天室、协作编辑等需要长连接的场景(如基于 WebSocket)。
Node.js 的单线程与多线程
Node.js 主线程是单线程的
只开一个主线程处理 JS 代码。单线程优势
- 没有多线程的锁与同步问题,避免资源竞争。
- 更易于编程和调试。
多线程劣势
- 线程间切换有上下文切换开销。
- 多线程占用更多内存(可用线程池缓解,但仍有资源消耗)。
- 多线程更适合 CPU 密集型任务(如压缩、加密、图片处理等)。
Node.js 的多线程实现
- Node 的 I/O 操作底层借助了 libuv 库,使用了线程池(本质还是多线程,但对开发者屏蔽)。
- JS 层面暴露的 API(如 fs、网络等)大多数是异步、非阻塞的,主线程不会被阻塞。
- 需要大量计算时,可以用
worker_threads模块进行多线程处理。
阻塞 & 非阻塞、同步 & 异步
阻塞/非阻塞
- 描述的是调用方的行为。
- 阻塞:调用发起后,必须等待结果才能执行后续代码。
- 非阻塞:调用发起后,立即返回,可以继续执行其他代码,不必等待结果。
同步/异步
- 描述的是被调用方执行任务的方式。
- 同步:任务完成后才返回。
- 异步:任务发起后立即返回,任务完成后通过回调、事件等机制通知调用方。
例子:
js
// 异步非阻塞
fs.readFile('file.txt', (err, data) => {
// 任务完成后通知我(通过回调)
});
// 同步阻塞
const data = fs.readFileSync('file.txt');readFileSync是同步阻塞,调用方必须等待文件读取完成。readFile是异步非阻塞,调用方可以继续执行后续代码,任务完成后通过事件/回调通知。
总结:
- 阻塞/非阻塞关注的是“调用方是否被卡住”
- 同步/异步关注的是“被调用方如何处理任务”
Node.js 适合的场景
- I/O 密集型(推荐)
例如:高并发 API 服务、文件读写、数据库操作、网络通信等。 - CPU 密集型(不推荐,容易阻塞主线程)
例如:加密、视频编解码、大量计算等,可用 worker 线程或将计算任务交给其他服务。
Node.js 事件驱动与异步非阻塞
- Node.js 使用事件驱动模型(Event Loop)管理任务。
- 绝大多数 API(如网络、文件等)都是异步的,任务完成后以事件/回调/Promise 的方式通知主线程,保证主线程不会被 I/O 阻塞。
典型 Node.js 应用流程
- 客户端请求发给 Node 服务。
- Node 服务处理请求(如转发、数据加工、读取文件等)。
- 通过异步非阻塞方式向后端/数据库/文件系统发起请求。
- 等待响应期间,主线程可以继续处理其他请求(高并发)。
- 任务完成后,通过事件/回调/Promise 通知主线程,将结果返回给客户端。
包管理
npm node package manager
nvm node version manager
环境变量配置
电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> Path -> 编辑 -> 新建
C:\Program Files\nodejs\