Skip to content

Node.js 简介

Node.js 是一个功能强大的开源、跨平台 JavaScript 运行时环境(runtime environment)。它允许开发者在 Web 浏览器之外执行 JavaScript 代码,主要用于构建服务器端应用(server-side applications)。Node.js 基于 Google Chrome 的 V8 JavaScript 引擎构建,以其高性能著称。Node.js 最初由 Ryan Dahl 于 2009 年开发,现已显著发展,并提供长期支持(LTS - Long-Term Support)版本,确保生产应用的稳定性(请访问 Node.js 官方网站查看最新的 LTS 版本)。

Node.js 官方文档对其定义如下:

Node.js® 是一个基于 Chrome V8 JavaScript 引擎构建的 JavaScript 运行时。Node.js 使用事件驱动、非阻塞 I/O 模型,这使其轻量且高效。Node.js 的包生态系统 npm,是世界上最大的开源库生态系统。

本质上,Node.js 既提供了在服务器(或其他系统)上运行 JavaScript 的环境,也提供了一个丰富的标准库(standard library),包含许多模块来简化开发,特别是在网络(networking)和文件系统操作(file system operations)方面。它可在 macOS、Windows 和 Linux 上运行。

Node.js = V8 引擎 + libuv + 标准库 + JavaScript

凭借其独特的特性,Node.js 已成为各种应用的流行选择:

  • 异步和事件驱动(Asynchronous and Event-Driven): Node.js 中的大多数 API 都是异步的(非阻塞 non-blocking)。它不会等待操作(如读取文件或查询数据库)完成,而是注册一个回调函数(callback function),然后继续执行下一个任务。当操作完成后,事件循环(event loop)会调用注册的回调函数。这种模型允许 Node.js 服务器使用单线程(single thread)高效地处理数千个并发连接(concurrent connections)。
  • 高性能(High Performance): Node.js 构建于 Google 的 V8 引擎之上,该引擎将 JavaScript 直接编译为原生机器码,因此提供了出色的执行速度。
  • 单线程(带事件循环)(Single-Threaded (with Event Loop)): Node.js 通过事件循环机制在单个主线程上运行。这比传统的多线程服务器简化了并发管理(concurrency management),但在 I/O 密集型任务(I/O-bound tasks)上表现出色。对于 CPU 密集型任务(CPU-intensive tasks),Node.js 提供了工作线程(Worker Threads)或子进程(Child Processes)等机制来利用多核系统。
  • 跨平台(Cross-Platform): Node.js 应用可以无缝运行在 Windows、macOS 和 Linux 上。
  • 丰富的生态系统(npm): Node Package Manager (npm) 是 Node.js 的默认包管理器,提供了访问海量可重用开源库的途径,极大地加快了开发速度。
  • 流处理能力(Streaming Capabilities): Node.js 擅长处理数据流(data streams),使其适用于实时数据处理、文件上传和媒体流等应用。
  • 许可证(License): Node.js 在 MIT 许可下发布,提供了宽松的使用权限。

Node.js 被各种规模的公司广泛采用,从初创公司到大型企业。知名用户包括 Netflix、Uber、LinkedIn、PayPal、eBay、NASA 等等。它通常用于构建 Web API、微服务(microservices)、实时应用(如聊天应用和在线游戏)、命令行工具和 IoT 应用。

你可以在网上找到社区维护的使用 Node.js 的公司和项目列表(例如,在 GitHub 或社区论坛上搜索)。

理解 Node.js 需要掌握几个将在后续章节中探讨的关键概念:

  • Modules (CommonJS / ES Modules)(模块)
  • npm (Node Package Manager)(Node 包管理器)
  • Asynchronous Programming (Callbacks, Promises, Async/Await)(异步编程)
  • Event Loop & libuv(事件循环与 libuv)
  • Event Emitter(事件触发器)
  • Buffers & Streams(缓冲器与流)
  • File System (fs module)(文件系统模块)
  • HTTP Module(HTTP 模块)
  • Child Processes & Worker Threads(子进程与工作线程)

Node.js 在涉及大量 I/O 操作的场景中表现出色:

  • I/O 密集型应用(I/O-bound Applications): 应用大部分时间等待网络请求或数据库操作(例如,Web 服务器、API)。
  • 数据流应用(Data Streaming Applications): 以块(chunk)为单位处理数据的应用(例如,视频流、实时数据 feed、文件上传)。
  • 实时应用(RTAs - Real-time Applications): 需要持久连接和低延迟(low latency)的应用(例如,聊天应用、在线游戏、协作工具),通常使用 WebSockets 等技术。
  • API 服务器(API Servers): 构建 RESTful 或 GraphQL API 为 Web 或移动客户端提供数据。
  • 微服务(Microservices): 创建通过网络通信的、小而独立的服务。
  • 单页应用(SPAs - Single Page Applications): 经常用作现代前端框架(React, Angular, Vue)的后端。
  • 工具和构建系统(Tooling & Build Systems): 许多开发工具(如代码检查工具 linters、打包工具 bundlers、任务运行器 task runners)都是用 Node.js 构建的。

Node.js 不太适用的场景(主要)?

Section titled “Node.js 不太适用的场景(主要)?”

虽然 Node.js 可以使用工作线程或子进程处理 CPU 密集型任务,但与 Python(及其 NumPy/SciPy 等库)、C++ 或 Java 等语言相比,对于以繁重计算(如复杂的科学计算、图像处理)为主的应用,通常不是首选,除非也涉及大量的 I/O。