Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,用于在服务器端运行 JavaScript 代码。它的设计目标是让开发者能够用 JavaScript 构建高性能、可扩展的网络应用。以下是关于 Node.js 的详细介绍:
1. 核心特点
-
事件驱动与非阻塞 I/O :
Node.js 采用事件驱动架构,通过单线程处理大量并发请求,利用非阻塞 I/O 操作(如文件读写、网络请求)避免等待耗时任务,显著提升性能。
-
轻量高效 :
基于 V8 引擎的即时编译(JIT)技术,执行 JavaScript 速度极快,适合高并发场景。
-
跨平台 :
支持 Windows、Linux、macOS 等操作系统。
-
模块化与 npm 生态 :
内置模块化系统(CommonJS),配合 npm(Node Package Manager)------全球最大的开源库生态系统,可轻松集成第三方库。
2. 历史背景
-
诞生:2009 年由 Ryan Dahl 创造,旨在解决传统服务器(如 Apache)的并发性能瓶颈。
-
关键版本:
-
2015 年:Node.js 4.0 引入 ES6 语法支持。
-
2020 年:Node.js 14+ 支持 ECMAScript Modules(ESM)。
-
长期支持(LTS)版本确保稳定性。
-
3. 架构与原理
-
事件循环(Event Loop) :
Node.js 的核心机制,负责调度异步任务。通过 事件队列 处理 I/O 回调,实现非阻塞操作。
javascript// 示例:异步读取文件 const fs = require('fs'); fs.readFile('file.txt', (err, data) => { if (err) throw err; console.log(data); }); console.log('继续执行其他任务...'); // 非阻塞
-
单线程与多进程 :
主线程是单线程,但可通过
cluster
模块或child_process
创建子进程,利用多核 CPU。
4. 适用场景
-
Web 服务器/API 服务 :
使用 Express、Koa、Fastify 等框架快速构建 RESTful API。
-
实时应用 :
聊天室、在线游戏等需要 WebSocket 的场景(如 Socket.IO)。
-
微服务架构 :
轻量级、低资源消耗,适合分布式系统。
-
工具链开发 :
前端构建工具(Webpack、Babel)、CLI 工具等。
-
IoT 与数据流 :
处理传感器数据流或实时分析(如使用 MQTT)。
5. 核心模块与工具
-
内置模块 :
http
(创建服务器)、fs
(文件操作)、path
(路径处理)、stream
(流数据处理)等。 -
流行框架:
-
Express:最轻量的 Web 框架。
-
NestJS:支持 TypeScript 的企业级框架。
-
Socket.IO:实时双向通信库。
-
-
工具链 :
PM2(进程管理)、Nodemon(热重载)、Jest(测试)。
6. 优势与劣势
-
优势:
-
高并发性能(适合 I/O 密集型任务)。
-
统一语言栈(前后端均用 JavaScript/TypeScript)。
-
活跃的社区和丰富的生态(npm 超过 200 万个包)。
-
-
劣势:
-
不适合 CPU 密集型任务(如图像处理、复杂计算)。
-
回调地狱(可通过
Promise
/async/await
解决)。 -
单线程崩溃影响全局(需用进程管理工具如 PM2 容错)。
-
7. 代码示例
javascript
// 使用 Express 创建简单服务器
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello Node.js!');
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Node.js 在前端开发中常用的核心 API 列表
1. fs
模块(文件系统)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
fs.readFile(path, [encoding], callback) |
异步读取文件内容 | - path : 文件路径 - encoding : 编码格式(如 'utf8' ) - callback(err, data) |
fs.readFile('file.txt', 'utf8', (err, data) => { console.log(data); }); |
fs.writeFile(path, data, [encoding], callback) |
异步写入文件内容 | - data : 写入的数据 - 其他同上 |
fs.writeFile('file.txt', 'Hello', 'utf8', (err) => { /* 处理错误 */ }); |
fs.readdir(path, callback) |
读取目录内容 | - callback(err, files) : 返回文件名数组 |
fs.readdir('./src', (err, files) => { console.log(files); }); |
fs.existsSync(path) |
同步检查文件/目录是否存在 | - path : 路径 返回布尔值 |
if (fs.existsSync('config.json')) { ... } |
2. path
模块(路径处理)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
path.join(...paths) |
拼接路径片段 | 接收多个路径片段 | path.join(__dirname, 'src', 'index.js') → 绝对路径 |
path.resolve(...paths) |
解析绝对路径 | 基于当前工作目录解析 | path.resolve('src') → /project/src |
path.extname(path) |
获取文件扩展名 | path : 文件路径 |
path.extname('file.js') → .js |
path.basename(path) |
获取文件名(含扩展名) | 同上 | path.basename('/src/file.js') → file.js |
3. process
模块(进程信息)
API/属性 | 作用 | 关键参数/说明 | 示例 |
---|---|---|---|
process.cwd() |
获取当前工作目录路径 | 无参数,返回字符串 | console.log(process.cwd()); |
process.env |
访问环境变量 | 常用于区分开发/生产环境 | if (process.env.NODE_ENV === 'dev') { ... } |
process.argv |
获取命令行参数 | 返回参数数组 | node script.js arg1 → ['arg1'] |
4. http
/ https
模块(创建本地服务)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
http.createServer((req, res) => { ... }) |
创建 HTTP 服务器 | - req : 请求对象 - res : 响应对象 |
const server = http.createServer((req, res) => { res.end('Hello'); }); |
server.listen(port, callback) |
启动服务器监听端口 | - port : 端口号 - callback : 启动回调 |
server.listen(3000, () => { console.log('Running'); }); |
5. child_process
模块(执行子进程)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
exec(command, callback) |
执行 shell 命令 | - command : 命令字符串 - callback(err, stdout, stderr) |
exec('npm install', (err) => { ... }); |
spawn(command, [args]) |
启动子进程(流式输出) | - args : 命令参数数组 |
const child = spawn('npm', ['run', 'build']); |
6. util
模块(工具函数)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
util.promisify(fn) |
将回调函数转为 Promise | 接收一个遵循回调风格的函数 | const readFile = promisify(fs.readFile);<br>readFile('file.txt').then(...); |
7. os
模块(操作系统信息)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
os.platform() |
获取操作系统类型 | 无参数,返回字符串(如 'darwin' 表示 macOS) |
console.log(os.platform()); |
8. Buffer
(二进制数据处理)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
Buffer.from(string) |
将字符串转为 Buffer | - string : 输入字符串 |
const buf = Buffer.from('Hello'); |
9. events
模块(事件驱动)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
EventEmitter |
创建自定义事件 | 通过 on 监听、emit 触发 |
const emitter = new EventEmitter();<br>emitter.on('event', () => { ... }); |
10. stream
模块(流数据处理)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
fs.createReadStream(path) |
创建可读文件流 | 用于大文件分块读取 | const readStream = fs.createReadStream('bigfile.txt'); |
11. url
模块(URL 解析)
API | 作用 | 关键参数 | 示例 |
---|---|---|---|
url.parse(urlString) |
解析 URL 为对象 | 返回包含 pathname 、query 等属性的对象 |
url.parse('http://example.com/path?name=test') |
Node.js 常用模块 API 示例
javascript
/**
* Node.js 常用模块 API 示例合集
* 执行方式:在终端中运行 `node 本文件路径.js`
*/
// ---------------------- 1. fs 模块(文件系统) ----------------------
const fs = require('fs');
const path = require('path');
// 示例 1.1: 异步读取文件内容
fs.readFile(path.join(__dirname, 'example.txt'), 'utf8', (err, data) => {
if (err) throw err;
console.log('1.1 读取文件内容:', data); // 假设文件存在且内容为 "Hello Node.js"
});
// 示例 1.2: 异步写入文件
fs.writeFile(path.join(__dirname, 'output.txt'), '新内容', 'utf8', (err) => {
if (err) throw err;
console.log('1.2 文件写入成功!');
});
// 示例 1.3: 检查文件是否存在(同步方法)
const fileExists = fs.existsSync(path.join(__dirname, 'example.txt'));
console.log('1.3 文件是否存在:', fileExists ? '是' : '否');
// ---------------------- 2. path 模块(路径处理) ----------------------
console.log('2.1 路径拼接:', path.join(__dirname, 'src', 'index.js')); // 输出绝对路径
console.log('2.2 文件扩展名:', path.extname('app.component.ts')); // 输出 .ts
console.log('2.3 解析绝对路径:', path.resolve('src')); // 基于当前工作目录解析
// ---------------------- 3. process 模块(进程信息) ----------------------
console.log('3.1 当前工作目录:', process.cwd()); // 执行 Node 命令时的目录
console.log('3.2 环境变量 NODE_ENV:', process.env.NODE_ENV || '未设置'); // 需通过命令行设置
// ---------------------- 4. http 模块(创建本地服务器) ----------------------
const http = require('http');
// 示例 4.1: 创建简单 HTTP 服务器
const server = http.createServer((req, res) => {
res.end('4.1 服务器响应成功!');
});
// 启动服务器(默认端口 3000)
server.listen(3000, () => {
console.log('4.1 服务器运行在 http://localhost:3000');
});
// ---------------------- 5. child_process 模块(子进程) ----------------------
const { exec, spawn } = require('child_process');
// 示例 5.1: 执行 shell 命令(如列出文件)
exec('ls -l', (err, stdout) => {
if (err) throw err;
console.log('5.1 当前目录文件列表:\n', stdout);
});
// 示例 5.2: 启动子进程(如运行 npm install)
const child = spawn('npm', ['install'], { stdio: 'inherit' }); // 实时输出日志
// ---------------------- 6. util 模块(工具函数) ----------------------
const util = require('util');
// 示例 6.1: 将回调函数转为 Promise
const readFilePromise = util.promisify(fs.readFile);
readFilePromise(path.join(__dirname, 'example.txt'), 'utf8')
.then(data => console.log('6.1 Promise 读取内容:', data))
.catch(err => console.error(err));
// ---------------------- 7. os 模块(操作系统信息) ----------------------
const os = require('os');
console.log('7.1 操作系统类型:', os.platform()); // 如 'darwin'(Mac)、'win32'
// ---------------------- 8. Buffer(二进制处理) ----------------------
const buffer = Buffer.from('Hello Buffer!');
console.log('8.1 Buffer 内容:', buffer.toString()); // 转为字符串输出
// ---------------------- 9. events 模块(事件驱动) ----------------------
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
// 示例 9.1: 自定义事件
const myEmitter = new MyEmitter();
myEmitter.on('event', () => console.log('9.1 事件触发成功!'));
myEmitter.emit('event'); // 立即触发
// ---------------------- 注意事项 ----------------------
/**
* 1. 运行前确保项目中有 example.txt 文件(用于 fs 示例)。
* 2. HTTP 服务器启动后,按 Ctrl+C 终止进程。
* 3. child_process 示例可能需要根据系统调整命令(如 Windows 用 dir 代替 ls)。
*/
使用说明
-
将代码保存为
node-api-demo.js
。 -
在文件同目录下创建
example.txt
(内容随意)。 -
在终端中运行:
bashnode node-api-demo.js
-
观察控制台输出,或访问
http://localhost:3000
测试服务器。