当前位置: 首页 > news >正文

从零开始认识 Node.js:异步非阻塞的魅力

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 回调,实现非阻塞操作。

    // 示例:异步读取文件
    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. 代码示例

// 使用 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)将字符串转为 Bufferstring: 输入字符串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 为对象返回包含 pathnamequery 等属性的对象url.parse('http://example.com/path?name=test')

 Node.js 常用模块 API 示例 

/*** 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)。*/

使用说明

  1. 将代码保存为 node-api-demo.js

  2. 在文件同目录下创建 example.txt(内容随意)。

  3. 在终端中运行:

    node node-api-demo.js
  4. 观察控制台输出,或访问 http://localhost:3000 测试服务器。

相关文章:

  • IP68防水Type-C连接器实测:水下1米浸泡72小时的生存挑战
  • LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
  • windows下卸载虚拟机VMware(保姆级教程)
  • SQL Server 与 Oracle 常用函数对照表
  • LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析
  • 一场关于BOM物料清单的深度对话
  • Python训练营打卡Day28
  • 寻找树的中心(重心)
  • 湖北理元理律师事务所:科学债务管理模型构建实录
  • 【JDBC】JDBC常见错误处理方法及驱动的加载
  • C语言:在 Win 10 上,g++ 如何编译 gtk 应用程序
  • linux网络内核的核心函数作用和简介
  • 手写tomcat:基本功能实现(3)
  • Java IO流进阶实战详解(含文件读写、拷贝、加密、字符集)
  • R语言空间数据处理入门教程
  • BC 范式与 4NF
  • AI日报 - 2024年5月17日
  • 【React中虚拟DOM与Diff算法详解】
  • 日期数据渲染转换问题
  • Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
  • 海外市场,押注中国无人驾驶龙头
  • 习近平向第三十四届阿拉伯国家联盟首脑理事会会议致贺信
  • “9+2”复式票,浦东购彩者拿下体彩大乐透1153万头奖
  • 长期吃太饱,身体会发生什么变化?
  • 郑钦文憾负高芙,止步WTA1000罗马站四强
  • A股三大股指涨跌互现:银行股领涨,两市成交12915亿元