牛逼视频:www.bilibili.com/video/BV1Nx...
1. 什么是 npm?
npm 有两层含义:
- 一个在线仓库:全球最大的开源 JavaScript 代码库,开发者可以分享和借用各种代码包(package)。
- 一个命令行工具:Node.js 的默认包管理器,用于与这个在线仓库交互,帮助你安装、管理项目依赖。
当你安装 Node.js 时,npm 会自动被一起安装。
2. 核心概念
package.json:项目的"身份证"和"菜单",记录了项目名称、版本、依赖包等信息。它是 npm 操作的核心。node_modules:一个文件夹,所有通过 npm 安装的包及其依赖都会存放在这里。通常不需要手动修改,也不应该提交到版本控制系统(如 Git)。package-lock.json或npm-shrinkwrap.json:精确描述当前安装的依赖树版本,确保团队协作和部署时安装完全一致的包。建议提交到版本库。
3. npm 命令详解(按功能分类)
A. 项目初始化与配置
| 命令 | 功能 | 示例与说明 |
|---|---|---|
npm init |
交互式地创建一个新的 package.json 文件。 |
npm init |
npm init -y / --yes |
使用默认值快速创建 package.json,跳过所有提问。 |
npm init -y |
npm config |
管理 npm 的配置。 | - npm config list:查看当前配置 - npm config set <key> <value>:设置配置,如 npm config set registry https://registry.npmmirror.com(设置淘宝镜像) - npm config get <key>:获取配置 |
B. 包(依赖)的安装
这是 npm 最核心的功能。依赖分为两种:
- 生产依赖 :项目运行时必须的包(如
react,express),会出现在dependencies字段。 - 开发依赖 :仅在开发阶段需要的包(如
webpack,eslint,jest),会出现在devDependencies字段。
| 命令 | 功能 | 示例与说明 |
|---|---|---|
npm install (或 npm i) |
根据 package.json 安装所有依赖。 |
在项目根目录执行,会创建 node_modules 并安装所有 dependencies 和 devDependencies。 |
npm install <package_name> |
安装一个包,并自动添加到 package.json 的 dependencies。 |
npm install lodash |
npm install <package_name> --save-dev (或 -D) |
安装一个包,并添加到 package.json 的 devDependencies。 |
npm install eslint --save-dev |
npm install <package_name> --global (或 -g) |
全局安装一个包(通常是命令行工具)。 | npm install @vue/cli -g(之后可以在任何地方使用 vue 命令) |
npm install <package_name>@<version> |
安装指定版本的包。 | npm install react@18.2.0 |
npm install <package_name>@latest |
安装包的最新版本。 | npm install webpack@latest |
npm ci |
清洁安装 ,用于自动化环境(如 CI/CD)。它依赖 package-lock.json,安装速度更快、更严格,但不会更新锁文件。 |
npm ci |
C. 依赖管理与更新
| 命令 | 功能 | 示例与说明 |
|---|---|---|
npm update |
更新所有包到 package.json 中允许的最新版本(遵循语义化版本规则)。 |
npm update |
npm update <package_name> |
更新指定的包。 | npm update lodash |
npm outdated |
检查有哪些过时的包。 | 会列出当前版本、期望版本和最新版本。 |
npm uninstall <package_name> (或 npm un) |
卸载一个包,并从 package.json 中移除。 |
npm uninstall lodash |
npm uninstall <package_name> --save-dev |
卸载一个开发依赖包。 | npm uninstall eslint --save-dev |
D. 运行脚本
package.json 中有一个 "scripts" 字段,可以定义自定义命令。
| 命令 | 功能 | 示例与说明 |
|---|---|---|
npm run <script_name> |
运行在 package.json 的 scripts 中定义的脚本。 |
如果 scripts 中有 "start": "node app.js",则 npm run start 会执行它。 |
npm start |
npm run start 的快捷方式。 |
npm start |
npm test (或 npm t) |
npm run test 的快捷方式。 |
npm test |
npm run |
列出所有可用的脚本。 | npm run |
E. 信息查看与审计
| 命令 | 功能 | 示例与说明 |
|---|---|---|
npm list (或 npm ls) |
查看当前项目安装的包及其依赖树。 | - npm list:查看顶级依赖 - npm list --depth=0:只查看直接依赖,更清晰 - npm list -g:查看全局安装的包 |
npm info <package_name> |
查看某个包的详细信息(版本、依赖、描述等)。 | npm info react |
npm search <keyword> |
在 npm 仓库中搜索包。 | npm search http server |
npm audit |
安全检查,扫描项目依赖中的已知漏洞。 | npm audit |
npm audit fix |
自动修复可自动修复的漏洞。 | npm audit fix |
npm audit fix --force |
强制修复漏洞,可能会进行破坏性更新(大版本升级)。 | npm audit fix --force |
npm view <package_name> versions |
查看一个包所有可用的历史版本。 | npm view webpack versions |
F. 发布与管理包(针对包开发者)
| 命令 | 功能 | 示例与说明 |
|---|---|---|
npm login |
登录到你的 npm 账户。 | npm login |
npm publish |
将当前目录的包发布到 npm 仓库。 | 在项目根目录执行,前提是已登录且有合法的 package.json。 |
npm version <update_type> |
更新包的版本号,并自动创建一个 Git tag。 | - npm version patch (小版本,如 1.0.0 -> 1.0.1) - npm version minor (次版本,如 1.0.0 -> 1.1.0) - npm version major (主版本,如 1.0.0 -> 2.0.0) |
npm unpublish <package_name>@<version> |
取消发布某个版本的包(有严格限制)。 | npm unpublish my-package@1.0.1 |
4. 常用工作流示例
1. 启动一个新项目
bash
csharp
mkdir my-new-project
cd my-new-project
npm init -y # 快速创建 package.json
npm install express # 安装生产依赖 express
npm install nodemon --save-dev # 安装开发依赖 nodemon
然后,在 package.json 的 scripts 中添加:
json
json
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
之后就可以使用 npm run dev 来启动开发服务器了。
2. 克隆并运行一个已有项目
bash
bash
git clone <project-url>
cd <project-folder>
npm install # 安装所有依赖
npm start # 启动项目
3. 更新项目依赖
bash
bash
npm outdated # 检查哪些包过时了
npm update # 更新所有包到允许的最新版本
npm audit # 检查安全性
npm audit fix # 修复漏洞
5. 实用技巧与最佳实践
-
使用
npx:npx随 npm 一起安装,用于临时执行包。它无需全局安装,非常方便。npx create-react-app my-app(临时下载并运行create-react-app)npx eslint .(运行项目本地安装的eslint)
-
使用
.npmrc文件:可以在项目根目录创建此文件来定义项目特定的 npm 配置,例如设置私有仓库地址。 -
理解语义化版本:
^1.2.3:允许更新次版本和修订号,如 1.2.4, 1.3.0,但不包括 2.0.0。~1.2.3:只允许更新修订号,如 1.2.4。- 这就是
package-lock.json重要的原因,它锁定了确切的版本。
-
不要手动修改
node_modules:任何修改都会在下次npm install时丢失。 -
将
package-lock.json提交到 Git:这是保证团队一致性的关键。