[具身智能-603]:Node.js详解以及对应的包管理器(npm)
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 支持两种模块规范用于组织和管理代码。CommonJS (Node.js 原生规范)导出使用module.exports或exports。导入使用require()函数这是一个同步加载的过程。示例javascript1// utils.js (导出) 2const sum (a, b) a b; 3module.exports { sum }; 4 5// main.js (导入) 6const { sum } require(./utils.js);ECMAScript Modules (ESM, 现代标准)导出使用export。导入使用import。示例javascript1// 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项目在生产环境中运行所必需的包例如express、mongoose。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。