npm 包管理器
1. npm 相关概念
npm 是 JavaScript 包管理器 (Package Manager)。它主要由两部分组成:
- 一个在线仓库 (Registry):一个巨大的、公开的数据库,存储了海量的、可重用的 JavaScript 代码包(Packages)。这些包可以是小型的辅助函数库(如
lodash
),也可以是完整的前端框架(如React
,Vue
)。 - 一个命令行工具 (CLI):一个安装在开发者电脑上的工具,用于与在线仓库进行交互,实现包的搜索、安装、更新和卸载等操作。
2. package.json
:项目的身份证
每个使用 npm
的项目都有一个核心文件:package.json
。它是一个 JSON 格式的文本文件,是项目的“身份证”和“说明书”。它定义了如下内容:
- 项目元数据:记录项目的名称、版本、描述、作者等基本信息。
- 依赖清单:列出项目运行和开发所需要的所有第三方包及其版本号。
- 脚本快捷方式:定义一些常用的命令,如启动、测试、打包等,通过
npm run <script-name>
来执行。
package.json
使得项目变得可移植和可复现。任何人只要获取了你的项目代码(其中包含 package.json
),然后运行 npm install
,就能自动下载所有必需的依赖,确保开发环境的一致性。
创建 package.json
文件
在你的项目根目录下,运行以下命令来交互式地创建一个 package.json
文件:
npm init
如果想快速生成一个包含默认值的 package.json
,可以使用 -y
标志:
npm init -y
核心字段解析
一个典型的 package.json
文件如下所示:
{
"name": "my-awesome-app",
"version": "1.0.0",
"description": "A brief description of my awesome app.",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "jest"
},
"dependencies": {
"lodash": "^4.17.21"
},
"devDependencies": {
"jest": "^29.7.0"
},
"author": "Your Name",
"license": "ISC"
}
name
: 项目名称,必须是小写字母和短横线的组合。version
: 项目的当前版本,遵循**语义化版本(SemVer)**规范(主版本号.次版本号.修订号
)。description
: 项目的简短描述。main
: 项目的入口文件,当其他项目require
或import
这个包时,会默认加载这个文件。scripts
: 定义可执行的脚本命令。dependencies
: 生产环境依赖。这些是应用程序在生产环境中实际运行所必需的包。devDependencies
: 开发环境依赖。这些包只在开发和测试阶段需要,例如代码格式化工具、测试框架、打包工具等。它们不会被打包到最终的生产代码中。
3. 管理依赖
安装包
npm 将依赖分为生产依赖和开发依赖:
- 生产依赖是应用程序在生产环境(即最终用户使用的环境)中运行时所必需的包。如果缺少了这些依赖,你的应用会立刻崩溃或无法启动。
- 开发依赖是只在本地开发和构建过程中使用的包。它们不是应用运行所必需的。
安装生产依赖的方法如下:
# 安装 lodash 并将其添加到 dependencies
npm install lodash
# 简写
npm i lodash
安装开发依赖的方法如下:
# 安装 jest 并将其添加到 devDependencies
npm install jest --save-dev
# 简写
npm i jest -D
当从 Git 等地方克隆一个新项目后,进入项目目录,可运行如下命令来安装 package.json
中列出的所有依赖:
npm install
node_modules
和 package-lock.json
在安装包的过程中,项目中会出现两个重要的部分:
-
node_modules
目录:所有已安装包的实际代码都存放在这个文件夹里。这个目录通常非常庞大,永远不要将它提交到版本控制系统中,应将其添加到.gitignore
文件里。 -
package-lock.json
文件:这个文件会自动生成,它精确地记录了node_modules
目录中每个包的确切版本号、下载地址以及它们的依赖关系树。它的作用是锁定依赖版本,确保团队中每个成员以及服务器在执行npm install
时,都能生成完全相同的node_modules
结构,避免“在我机器上能跑”的问题。这个文件应该被提交到版本控制系统中。
其他常用命令
- 卸载包:
npm uninstall lodash
- 更新包:
# 将 lodash 更新到 package.json 中指定的最新兼容版本
npm update lodash
- 查看过时的包:
npm outdated
- 运行脚本:
# 运行 package.json 中 "scripts" 定义的 "test" 命令
npm run test
# 对于 "start" 和 "test" 等常用命令,可以省略 "run"
npm test