Node.js 核心基础:运行机制、全局对象与 Buffer 详解

作者:缓存笔记时间:2026-10-23 21:08:22浏览:414

本文系统梳理 Node.js 核心基础,涵盖应用场景与性能优势,深入解析 global 全局对象与模块系统。重点阐述 process 常用属性、事件循环(Event Loop)各阶段执行顺序,以及 Buffer 类的定义、创建方式与常用操作方法,帮助开发者掌握 Node.js 底层运行机制。

Node.js 介绍与性能优势

Node.js 介绍

Node.js 的应用场景广泛,主要涵盖以下几个方向:

  • 工具类开发:如 Gulp、Webpack、Vite 等构建工具,利用 Node.js 使 JavaScript 能够在服务器端运行。
  • 服务端开发:用于构建后端服务,优化服务端渲染(SSR)性能。
  • 中间层开发:作为 API 网关或中间件,解决跨域问题并对数据进行格式化。

Node.js 的性能特点

  • 非阻塞:I/O 操作不会阻塞主线程执行。
  • 异步 I/O:方法调用后不会立即返回结果,而是通过回调或 Promise 机制处理。
  • 事件驱动:基于发布订阅模式,通过事件触发机制处理并发请求。

Node.js 的优势

在 Java、PHP 或 .NET 等传统服务器语言中,每个客户端连接通常会创建一个新的线程,每个线程约消耗 2MB 内存。这意味着理论上,8GB 内存的服务器最多只能同时连接约 4000 个用户。若要支持更多用户,必须增加服务器硬件数量,从而大幅推高成本。

Node.js 不为每个客户连接创建新线程,而是仅使用单线程模型。当有新连接时,触发内部事件,通过非阻塞 I/O 和事件驱动机制,使 Node.js 程序在宏观上实现并行处理。使用 Node.js,8GB 内存的服务器可同时处理超过 4 万用户的连接。

全局对象与模块系统

Node.js 的全局对象和模块系统

global 全局对象

global 是 Node.js 中的全局对象,其属性可直接访问。

global 中包含以下常用属性:

  • Buffer:用于处理二进制数据。
  • process:提供当前 Node.js 进程的信息和控制方法。
  • setInterval、setTimeout、setImmediate:定时器相关函数。
  • console:用于输出日志信息。
  • queueMicrotask:用于调度微任务。

模块系统

  • __dirname:当前模块所在目录的绝对路径。
  • __filename:当前模块文件的绝对路径。
  • exports:用于导出模块接口。
  • module:当前模块对象,包含模块的元数据。
  • require():用于加载和引入其他模块。

进程管理(process)

process 常用属性或方法

process.platform:获取当前操作系统平台。

process.kill():终止指定进程。

process.exit():退出当前进程,可指定退出代码。

process.nextTick():Node.js 中的微任务,在当前执行栈底部执行,优先级高于 Promise。

process.cwd():获取当前工作目录,该值随命令执行位置变化;与 __dirname(当前文件所在文件夹,路径固定)不同。

process.env:环境变量对象,可通过 set 设置,例如 process.env.NODE_ENV。

process.argv:执行脚本时传入的参数数组。

事件循环机制

事件循环机制

Node.js 介绍与性能优势

事件循环包含几个重要阶段:

timer 阶段:处理 setTimeout 和 setInterval 回调。

poll 阶段:轮询处理 I/O 回调。

check 阶段:处理 setImmediate 回调。

若在 I/O 回调中调用 setImmediate,其执行优先于 timer。

这是因为 poll 阶段结束后进入 check 阶段。

nextTick 属于微任务,不参与事件循环各阶段。

在 Node.js 11 及以上版本中,宏任务与微任务的执行顺序与浏览器环境一致。

Buffer 缓冲区详解

Buffer 类详解

JavaScript 语言本身仅支持字符串数据类型,缺乏原生二进制数据处理能力。

在处理 TCP 流或文件流时,必须使用二进制数据。因此,Node.js 定义了 Buffer 类,专门用于创建存放二进制数据的缓存区。Buffer 是随 Node 内核发布的核心库,提供了存储原始数据的方法,使 Node.js 能够处理二进制数据。每当在 I/O 操作中移动数据时,常需使用 Buffer 库。原始数据存储在 Buffer 实例中,其结构类似整数数组,但对应于 V8 堆内存之外的一块原始内存。Buffer 属于 global 属性,可直接访问。读取文件或写入二进制数据时,从硬盘读取的数据均存入内存中的 Buffer,且 Buffer 可与字符串相互转换。

定义 Buffer 的三种方式:


let buf1 = Buffer.alloc(6);
let buf2 = Buffer.from('珠峰');
let buf3 = Buffer.from([65,66,67]);

Buffer 中常用的方法

  • buff.toString():将 Buffer 内容转换为字符串。
  • buff.fill():填充 Buffer 内容。
  • buff.slice():截取 Buffer 的一部分。
  • buff.copy():复制 Buffer 内容到另一个 Buffer。
  • Buffer.concat():合并多个 Buffer 实例。
  • Buffer.isBuffer():判断对象是否为 Buffer 实例。
  • indexOf():查找指定值在 Buffer 中的索引。

以上即为 Node.js 基础知识汇总的详细内容,更多关于 Node.js 基础知识的资料请关注本站其它相关文章!

作者最新文章
相关文章
更多