package.json
-
作用
- 声明项目元数据:如项目名称、版本、描述、入口文件等。
- 定义依赖范围:在
dependencies
和devDependencies
中声明项目直接依赖的包及其版本范围(如^1.2.3
)。 - 脚本命令:通过
scripts
字段定义快捷命令(如npm start
)。
-
特点
- 版本范围语义化:使用
^
(允许次版本和补丁更新)、~
(仅允许补丁更新)等符号定义版本范围。 - 灵活性:允许安装符合版本范围的最新包,便于获取新功能或修复。
- 版本范围语义化:使用
-
示例
{"name": "my-app","version": "1.0.0","dependencies": {"express": "^4.18.1" // 支持安装 4.x.x 系列的最新版本} }
package-lock.json
-
作用
- 锁定依赖树:记录项目所有依赖(包括直接和间接依赖)的确切版本及下载地址。
- 确保一致性:保证不同环境下的
npm install
安装结果完全一致,避免“在我机器上能运行”问题。
-
特点
- 自动生成:由
npm install
或相关命令(如npm update
)自动创建/更新,不应手动修改。 - 精确版本控制:记录每个包的具体版本号(如
4.18.1
),无范围符号。 - 依赖树结构:描述依赖之间的嵌套关系,解决版本冲突。
- 自动生成:由
-
示例
{"name": "my-app","version": "1.0.0","dependencies": {"express": {"version": "4.18.1", // 指定版本"resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz","dependencies": {"body-parser": {// 间接依赖的详细信息}}}} }
关键区别
特性 | package.json | package-lock.json |
---|---|---|
目的 | 声明直接依赖及其版本范围 | 锁定整个依赖树的精确版本 |
生成方式 | 手动编写或通过 npm install --save | 自动由 npm install 生成 |
版本格式 | 语义化版本范围(如 ^1.2.3 ) | 固定版本号(如 1.2.3 ) |
内容范围 | 仅直接依赖 | 直接依赖 + 所有间接依赖 |
是否应提交到 Git | 是 | 是(确保团队环境一致) |
协作流程
-
安装依赖
- 首次运行
npm install
时,生成package-lock.json
。 - 后续安装时,若存在
package-lock.json
,则严格按该文件安装。
- 首次运行
-
更新依赖
- 小范围更新:
npm update
更新到符合package.json
版本范围的最新版,并更新package-lock.json
。 - 指定版本:
npm install package@x.x.x
直接修改版本,同时更新两个文件。 - 大版本升级:手动修改
package.json
中的版本范围,再运行npm install
。
- 小范围更新:
-
强制重建依赖树
删除node_modules
和package-lock.json
后运行npm install
,重新生成锁定文件。
最佳实践
- 始终提交
package-lock.json
:避免团队成员或环境间的版本差异。 - 勿手动编辑
package-lock.json
:依赖变更应通过npm
命令操作。 - 定期更新依赖:通过
npm outdated
和npm update
保持依赖健康。
通过合理使用这两个文件,可以平衡灵活性与稳定性,确保项目依赖安全可控。