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

news2025/5/18 12:12:59

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 测试服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】BEVFormer

〇、Introduction BEVFormer是现在端到端无人驾驶中常使用的一个Backbone&#xff0c;用于将六个视角下的图像转换为鸟瞰图视角下的特征&#xff0c;转换出的BEV特征则会被用于后续模块的特征交互。然而在这个模型设计的初期&#xff0c;其最本质的意图是为了提取用于各种CV任…

IDEA编辑器设置的导出导入

背景 最近新换了电脑&#xff0c;因为之前是 Intel 芯片的 Mac&#xff0c;这次换了 arm 架构的 M 芯片的 Mac&#xff0c;旧 Mac 上的很多软件不兼容&#xff0c;所以就没有选择换机数据迁移&#xff0c;一点一点下载、配置了所有环境。 导出 IDEA 支持设置的导入导出&…

成功案例丨从草图到鞍座:用先进的发泡成型仿真技术变革鞍座制造

案例简介 在鞍座制造中&#xff0c;聚氨酯泡沫成型工艺是关键环节&#xff0c;传统依赖实验测试的方法耗时且成本高昂。为解决这一问题&#xff0c;意大利自行车鞍座制造商 Selle Royal与Altair合作&#xff0c;采用Altair Inspire PolyFoam软件进行发泡成型仿真。 该工具帮助团…

电机试验平台:创新科技推动电动机研究发展

电机试验平台是电机制造和研发过程中不可或缺的重要设备&#xff0c;其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大&#xff0c;对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…

【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…

Qt与Hid设备通信

什么是HID&#xff1f; HID&#xff08;Human Interface Device&#xff09;是‌直接与人交互的电子设备‌&#xff0c;通过标准化协议实现用户与计算机或其他设备的通信&#xff0c;典型代表包括键盘、鼠标、游戏手柄等。‌ 为什么HID要与qt进行通信&#xff1f; 我这里的应…

2024 山东省ccpc省赛

目录 I&#xff08;签到&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; A&#xff08;二分答案&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; K&#xff08;构造&#xff09; 题目&#xff1a; 思路&#xff1a; 代…

SAP HCM 0008数据存储逻辑

0008信息类型&#xff1a;0008信息类型是存储员工基本薪酬的地方&#xff0c;因为很多企业都会都薪酬带宽&#xff0c;都会按岗定薪&#xff0c;所以在上线前为体现工资体系的标准化&#xff0c;都会在配置对应的薪酬关系&#xff0c;HCM叫间接评估&#xff0c;今天我们就分析下…

如何使用通义灵码辅助学习C++编程 - AI编程助手提升效率

一、引言 C 是一门功能强大且灵活的编程语言&#xff0c;在软件开发、系统编程、游戏开发等领域广泛应用。然而&#xff0c;其复杂的语法和丰富的特性使得学习曲线较为陡峭。对于初学者而言&#xff0c;在学习过程中难免会遇到各种问题&#xff0c;如语法理解困难、代码调试耗…

【Docker】CentOS 8.2 安装Docker教程

目录 1.卸载 2.安装依赖 3.设置yum源 4.安装Docker 5.启动Docker 6.设置Docker开机自启 7.验证Docker是否安装成功 8.配置多个国内镜像地址 9.重启Docker 10.Docker指令大全 10.1.启动与关闭Docker 10.2.Docker镜像操作 10.3.Docker容器操作 10.4.Docker Compose操作…

K230 ISP:一种新的白平衡标定方法

第一次遇见需要利用光谱响应曲线进行白平衡标定的方法。很好奇是如何利用光谱响应曲线进行白平衡标定的。 参考资料参考&#xff1a;K230 ISP图像调优指南 K230 介绍 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核异构单元加速计算架构&a…

桃芯ingchips——windows HID键盘例程无法同时连接两个,但是安卓手机可以的问题

目录 环境 现象 原理及解决办法 环境 PC&#xff1a;windows11 安卓&#xff1a;Android14 例程使用的是HID Keyboard&#xff0c;板子使用的是91870CQ的开发板&#xff0c;DB870CC1A 现象 连接安卓手机时并不会出现该现象&#xff0c;两个开发板都可以当做键盘给手机发按…

[Linux] vim及gcc工具

目录 一、vim 1.vim的模式 2.vim的命令集 (1):命令模式 (2):底行模式 3.vim配置 二、gcc 1.gcc格式及选项 2.工作布置 三、自动化构建工具makefile 1.基本使用方法 2.配置文件解析 3.拓展 在linux操作系统的常用工具中&#xff0c;常用vim来进行程序的编写&#xff1b…

MySQL只操作同一条记录也会死锁吗?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL只操作同一条记录也会死锁吗?】面试题。希望对大家有帮助&#xff1b; MySQL里where条件的顺序影响索引使用吗&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;死锁通常发生在多…

数据结构与算法——双向链表

双向链表 定义链表分类双向链表&#xff1a;带头双向循环链表 初始化打印尾插头插尾删头删查找在pos(指定位置)之后插入结点在pos(指定位置)之前插入结点删除pos(指定位置)的结点销毁顺序表与链表的分析 定义 链表分类 单向和双向 带头和不带头 带头是指存在一个头结点&…

MODBUS RTU调试助手使用方法详解

一、软件简介 485调试助手是一款常用的串口通信调试工具&#xff0c;专门用于RS-485总线设备的测试、调试和通信监控。它支持多种串口参数设置&#xff0c;提供数据收发功能&#xff0c;是工业现场调试的必备工具之一。 二、软件安装与启动 1. 系统要求 Windows 7/10/11操作…

自由学习记录(60)

Lecture 16 Ray Tracing 4_哔哩哔哩_bilibili 老师说的“高频采样”问题是什么&#xff1f; 现在考虑一个特殊情况&#xff1a; ❗ 一个像素内&#xff0c;图像信号变化很剧烈&#xff08;高频&#xff09;&#xff1a; 比如&#xff1a; 细网格纹理 马赛克背景 很高频的…

现代计算机图形学Games101入门笔记(三)

三维变换 具体形式缩放&#xff0c;平移 特殊点旋转。这里涉及到坐标系&#xff0c;先统一定义右手坐标系&#xff0c;根据叉乘和右手螺旋判定方向。这里还能法线Ry Sina 正负与其他两个旋转不一样。这里可以用右手螺旋&#xff0c;x叉乘z&#xff0c;发现大拇指朝下&#xff0…

WeakAuras Lua Script <BiaoGe>

WeakAuras Lua Script <BiaoGe> 表格拍卖插件WA字符串 表格字符串代码&#xff1a; !WA:2!S3xA3XXXrcoE2VH9l7ZFy)C969PvDpSrRgaeuhljFlUiiSWbxaqXDx(4RDd0vtulB0fMUQMhwMZJsAO5HenLnf1LPSUT4iBrjRzSepL(pS)e2bDdWp5)cBEvzLhrMvvnAkj7zWJeO7mJ8kYiJmYiImYF0b(XR)JR9JRD…

chrome 浏览器插件 myTools, 日常小工具。

1. 起因&#xff0c; 目的: 比如&#xff0c;chatgpt, google&#xff0c; 打开网页&#xff0c;就能直接输入文字&#xff0c;然后 grok 就不行&#xff0c;必须用鼠标点一下&#xff0c;才能输入文字。 对我而言&#xff0c;是个痛点&#xff01;写个插件&#xff0c;自动点…