Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它让 JavaScript 能够脱离浏览器,在服务端运行。而 npm (Node Package Manager) 是随 Node.js 一起安装的官方包管理器,是全球最大的 JavaScript 软件生态系统和注册表。

下面将从核心原理、模块系统和包管理器三个方面为你详细解读。

🚀 Node.js 核心原理

Node.js 的核心设计理念是事件驱动非阻塞 I/O,这使得它特别擅长处理高并发、I/O 密集型的应用,如实时聊天、API 网关等。

单线程与事件循环 (Event Loop)

Node.js 采用单线程主线程模型,但这并不意味着它不能处理并发任务。其高性能的秘密武器就是事件循环

  • 主线程:负责执行 JavaScript 代码。
  • libuv 库:一个用 C 语言编写的跨平台库,它提供了一个线程池来处理耗时的操作(如文件读写、网络请求、DNS 查询等)。

当主线程遇到一个耗时的 I/O 操作时,它不会傻等,而是将这个任务交给 libuv 的线程池去处理,然后主线程继续执行后面的代码。当 libuv 完成 I/O 任务后,会将对应的回调函数放入一个队列中。事件循环会不断地检查这个队列,一旦主线程空闲下来,就取出队列中的回调函数来执行。

这个机制让 Node.js 能够用很少的系统资源处理成千上万的并发连接。

模块系统

Node.js 支持两种模块规范,用于组织和管理代码。

  1. CommonJS (Node.js 原生规范)

    • 导出:使用 module.exports 或 exports
    • 导入:使用 require() 函数,这是一个同步加载的过程。
    • 示例:javascript
      1// utils.js (导出)
      2const sum = (a, b) => a + b;
      3module.exports = { sum };
      4
      5// main.js (导入)
      6const { sum } = require('./utils.js');
  2. ECMAScript Modules (ESM, 现代标准)

    • 导出:使用 export
    • 导入:使用 import
    • 示例:javascript
      1// utils.js (导出)
      2export const sum = (a, b) => a + b;
      3
      4// main.js (导入)
      5import { sum } from './utils.js';

📦 包管理器 npm 详解

npm 是 Node.js 开发中不可或缺的工具,它管理着项目的依赖、脚本和配置。

核心文件
  • package.json:项目的“说明书”或“身份证”。它记录了项目的元数据(名称、版本、作者等)、依赖列表 (dependencies) 和脚本命令 (scripts)。
  • package-lock.json:依赖锁定文件。它记录了项目中所有依赖包(包括依赖的依赖)的确切版本和下载地址,确保在任何环境下安装依赖的结果都完全一致。
  • node_modules:存放所有已安装包代码的文件夹。注意:这个文件夹体积庞大,不应提交到 Git 仓库,通常会在 .gitignore 文件中将其忽略。
常用命令速查
功能 命令 说明
初始化项目 npm init -y 快速生成一个默认的 package.json 文件。
安装依赖 npm install <包名> 安装包,并记录到 dependencies
安装开发依赖 npm install <包名> -D 安装包,并记录到 devDependencies (如测试、构建工具)。
全局安装 npm install <包名> -g 将包安装到全局,使其可在命令行任何位置使用。
运行脚本 npm run <脚本名> 执行 package.json 中 scripts 字段定义的命令。
卸载依赖 npm uninstall <包名> 卸载包,并从 package.json 中移除记录。
依赖类型

在 package.json 中,依赖通常分为两类:

  • dependencies:项目在生产环境中运行所必需的包,例如 expressmongoose
  • devDependencies:仅在开发和测试阶段需要的包,例如单元测试框架 jest、代码检查工具 eslint
语义化版本控制 (SemVer)

npm 使用语义化版本控制来管理包的版本,格式为 MAJOR.MINOR.PATCH (例如 1.2.3)。

  • MAJOR (主版本号):不兼容的 API 修改。
  • MINOR (次版本号):向下兼容的功能性新增。
  • PATCH (修订号):向下兼容的问题修正。

在安装包时,你经常会看到版本前缀:

  • ^ (插入符号):例如 ^1.2.3,表示允许自动更新到 1.x.x 的最新版本(即允许更新 MINOR 和 PATCH)。
  • ~ (波浪号):例如 ~1.2.3,表示只允许自动更新到 1.2.x 的最新版本(即只允许更新 PATCH)。
Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐