npm能帮我们高效管理项目依赖,还能规范开发流程、提升协作效率。本文将从基础到进阶,全面讲解 npm 的使用方法。
一、npm 是什么?
npm 是随同 Node.js 一起安装的包管理工具,全称为 Node Package Manager。主要功能是管理项目所需的第三方代码,称为“包”或“模块”,同时也是全球最大的开源软件注册表,托管了超过 200 万个包,涵盖从前端框架到后端工具的各类开发资源。
简单来说,npm 就像一个“代码超市”:
- 开发者可以从“超市”免费获取别人写好的代码(安装包);
- 也可以把自己写的代码放到“超市”供他人使用(发布包);
- 还能通过它记录项目需要哪些“商品”,确保在任何环境都能复现相同的依赖配置。
二、npm 能做什么?
npm 的核心价值在于解决开发中的依赖管理和流程标准化问题,具体功能包括:
1. 依赖管理:清晰记录项目所需包
通过 package.json
文件记录项目依赖的包及其版本,避免“代码在我电脑上能运行,在你那却报错”的问题。安装的包会统一存放在 node_modules
目录中,无需手动下载和管理文件。
2. 版本控制:语义化版本确保稳定性
采用 SemVer(语义化版本) 规范管理包版本,格式为 主版本号.次版本号.修订号
(如 4.17.21
):
- 主版本号(Major):不兼容的 API 变更(如
1.0.0 → 2.0.0
); - 次版本号(Minor):新增功能但兼容旧版本(如
4.17.0 → 4.18.0
); - 修订号(Patch):仅修复 bug 且兼容旧版本(如
4.17.20 → 4.17.21
)。
3. 锁文件:锁定依赖版本
安装依赖后会生成 package-lock.json
文件,精确锁定每个依赖的具体版本、安装路径和依赖树结构。无论在开发环境、测试环境还是生产环境,只要有锁文件,安装的依赖版本就完全一致,避免版本差异导致的兼容性问题。
4. 脚本运行:标准化开发流程
在 package.json
中定义自定义脚本(如启动项目、构建、测试等),通过 npm run <脚本名>
执行,统一团队开发命令。例如:
- 用
npm start
启动项目; - 用
npm test
运行测试; - 用
npm run build
打包代码。
5. 包发布与共享:成为开源贡献者
支持将自己开发的包发布到 npm 注册表,与全球开发者共享代码。也可搭建私有仓库,管理公司内部专用的包,保障代码安全。
三、npm 基础使用
使用 npm 前需先安装 Node.js,以下是基础操作流程:
1. 安装 Node.js 与 npm
- 访问 Node.js 官网 下载对应操作系统的安装包(推荐 LTS 长期支持版);
- 安装完成后,打开终端/命令行,输入以下命令验证安装:
若返回版本号,说明安装成功。node -v # 查看 Node.js 版本,如 v20.10.0 npm -v # 查看 npm 版本,如 v10.2.3
2. 初始化项目:生成 package.json
package.json
是项目的“身份证”,记录项目名称、版本、依赖等核心信息。初始化步骤:
- 新建项目文件夹(如
my-npm-project
),并在终端进入该文件夹:mkdir my-npm-project && cd my-npm-project
- 执行初始化命令:
npm init # 交互式初始化,需手动输入项目信息 # 或使用默认配置快速初始化(推荐) npm init -y
- 生成的
package.json
结构如下(默认配置示例):{ "name": "my-npm-project", // 项目名称(小写,无空格) "version": "1.0.0", // 版本号(遵循 SemVer) "description": "", // 项目描述 "main": "index.js", // 入口文件 "scripts": { // 自定义脚本 "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], // 项目关键词(用于 npm 搜索) "author": "", // 作者 "license": "ISC" // 开源协议(默认 ISC) }
四、核心操作
安装依赖是 npm 最常用的功能,根据依赖用途不同,分为生产依赖和开发依赖,安装方式略有差异。
1. 安装生产依赖(项目运行必需)
生产依赖是项目运行时必须的包(如 React、Vue 等框架,Express 等后端库),安装命令:
npm install <包名>
# 简写:npm i <包名>
示例:安装 Express 框架(用于 Node.js 后端开发):
npm install express
执行后,会发生三件事:
- 包被下载到项目的
node_modules
文件夹; package.json
中新增dependencies
字段,记录包名和版本:"dependencies": { "express": "^4.18.2" }
- 生成/更新
package-lock.json
,锁定具体版本和安装路径。
2. 安装开发依赖(仅开发时需要)
开发依赖是开发阶段使用的工具(如代码检查工具 ESLint、测试工具 Jest、打包工具 Webpack 等),项目运行时不需要。安装命令:
npm install <包名> --save-dev # 完整写法
# 简写(推荐)
npm install <包名> -D
示例:安装 ESLint 作为开发依赖:
npm install eslint -D
执行后,package.json
中新增 devDependencies
字段:
"devDependencies": { "eslint": "^8.56.0" }
3. 安装指定版本的包
默认安装最新版本,若需指定版本,格式为 包名@版本号
:
# 安装 4.17.21 版本的 lodash
npm install lodash@4.17.21
# 安装 18.x 系列的 React(主版本号固定为 18)
npm install react@18
4. 安装全局包(跨项目使用)
部分工具需要全局安装(如 Vue 脚手架、PM2 进程管理工具),使用 -g
参数:
# 全局安装 Vue CLI
npm install @vue/cli -g
# 全局安装后可直接在终端使用命令
vue --version
5. 卸载依赖
不再需要的包可以卸载,命令:
# 卸载生产依赖
npm uninstall express
# 卸载开发依赖
npm uninstall eslint -D
# 卸载全局包
npm uninstall @vue/cli -g
卸载后,package.json
和 package-lock.json
会自动移除该包的记录。
6. 批量安装依赖
当我们从 Git 克隆项目或复制他人项目时,通常没有 node_modules
文件夹,此时只需执行:
npm install # 简写:npm i
npm 会读取 package.json
和 package-lock.json
,自动安装所有依赖到 node_modules
,快速复现开发环境。
五、npm 脚本:自动化开发流程
npm 脚本是定义在 package.json
中 scripts
字段的命令,用于自动化重复操作(如启动服务、打包、测试等),是团队协作的“统一命令规范”。
1. 定义脚本
在 package.json
的 scripts
中添加键值对,键是脚本名,值是要执行的命令:
{
"scripts": {
"start": "node server.js", // 启动服务
"dev": "nodemon server.js", // 开发环境热更新(需先安装 nodemon)
"test": "jest", // 运行测试
"build": "webpack", // 打包代码
"lint": "eslint src/**/*.js" // 代码检查
}
}
2. 运行脚本
通过 npm run <脚本名>
执行,部分简写脚本(如 start
、test
)可省略 run
:
npm run dev # 执行 dev 脚本
npm start # 等价于 npm run start
npm test # 等价于 npm run test
npm run build # 执行 build 脚本
3. 脚本进阶:生命周期钩子
npm 提供了特殊的“生命周期钩子”脚本,会在特定命令执行前后自动运行。例如:
pre
+ 脚本名:在目标脚本前执行;post
+ 脚本名:在目标脚本后执行。
示例:定义 build
脚本的前后钩子:
{
"scripts": {
"prebuild": "echo '开始打包...'", // build 前执行
"build": "webpack",
"postbuild": "echo '打包完成!'" // build 后执行
}
}
执行 npm run build
时,会自动按顺序运行:prebuild → build → postbuild
。
4. 常用场景
- 开发环境热更新:用
nodemon
监听文件变化,自动重启服务:npm install nodemon -D # 先安装开发依赖
"scripts": { "dev": "nodemon app.js" }
- 并行执行多个脚本:用
&&
串行执行,&
并行执行(Windows 需用start
命令):"scripts": { "lint:js": "eslint src", "lint:css": "stylelint src/**/*.css", "lint": "npm run lint:js && npm run lint:css" // 先检查 JS 再检查 CSS }
六、npm 常用命令速查表
命令 | 作用 | 示例 |
---|---|---|
npm init |
初始化项目,生成 package.json |
npm init -y (默认配置) |
npm install <包名> |
安装生产依赖 | npm i express |
npm install <包名> -D |
安装开发依赖 | npm i eslint -D |
npm install <包名> -g |
全局安装包 | npm i @vue/cli -g |
npm uninstall <包名> |
卸载依赖 | npm uninstall lodash |
npm update <包名> |
更新依赖到最新版本(遵循语义化版本) | npm update express |
npm run <脚本名> |
执行自定义脚本 | npm run dev |
npm start |
执行 start 脚本(简写) |
npm start |
npm test |
执行 test 脚本(简写) |
npm test |
npm list |
查看已安装的依赖列表 | npm list --depth 0 (只看顶层依赖) |
npm info <包名> |
查看包的详细信息(版本、作者等) | npm info react |
npm outdated |
检查哪些依赖有更新 | npm outdated |
npm cache clean --force |
清空 npm 缓存(解决安装异常时使用) | npm cache clean --force |
npm login |
登录 npm 账号(发布包前使用) | npm login |
npm publish |
发布包到 npm 注册表 | npm publish |
七、进阶技巧:提升 npm 使用效率
1. 语义化版本符号详解
package.json
中依赖版本前的符号代表版本范围规则,确保依赖更新的安全性:
^4.17.21
:允许更新次版本和修订号(如4.17.21 → 4.18.0
);~4.17.21
:只允许更新修订号(如4.17.21 → 4.17.22
);4.17.21
:固定版本,不允许任何更新;*
:始终安装最新版本(不推荐,风险高)。
2. 使用 .npmrc
配置 npm
通过项目根目录的 .npmrc
文件自定义 npm 配置,如切换镜像源(解决国内下载慢问题)、配置私有仓库等:
# 使用淘宝镜像源(国内加速)
registry=https://registry.npmmirror.com/
# 配置公司私有仓库(仅 @yourcompany 前缀的包使用)
@yourcompany:registry=https://npm.yourcompany.com/
3. 本地包开发:npm link
开发自己的包时,可通过 npm link
实现本地调试,无需反复发布和安装:
- 在自己开发的包目录下执行:
npm link # 将包链接到全局
- 在需要使用该包的项目目录下执行:
npm link <包名> # 关联本地包
- 调试完成后,解除关联:
# 项目中解除关联 npm unlink <包名> # 包目录中移除全局链接 npm unlink
4. 多包管理:npm 工作区(Workspaces)
适用于 Monorepo 项目(一个仓库管理多个关联包),通过工作区统一管理依赖和脚本:
- 在根目录
package.json
中配置工作区:{ "name": "my-monorepo", "workspaces": ["packages/*"] // 包存放路径 }
- 项目结构:
my-monorepo/ ├── package.json └── packages/ ├── pkg1/ # 子包 1 └── pkg2/ # 子包 2
- 安装依赖到指定子包:
npm install lodash --workspace=pkg1 # 仅给 pkg1 安装 lodash
- 运行所有子包的脚本:
npm run build --workspaces # 执行所有子包的 build 脚本
← 上一篇 AngularJS知识快速入门(上) |
记得点赞、关注、收藏哦!
|
下一篇 Ajax——在OA系统提升性能的局部刷新 → |