当前位置: 首页 > article >正文

理解 package-lock.json 何时推送与忽略

package.json 和 package-lock.json 是 Node.js 和前端开发中的核心配置文件,管理着项目的依赖关系、脚本和其他重要配置。下面简单介绍下这两个文件以及它们的使用规则。

1. package.json

package.json 是 Node.js 和 JavaScript 项目的配置文件,它包含了项目的元数据(如名称、版本、描述等)以及项目的依赖管理。

1.1 项目元数据

1、name:项目的名称。必须是小写字母和中划线(-)的组合,通常用于 npm 包发布。

2、version: 项目的版本,遵循 semver(语义化版本)规范。

3、main:指定该项目的入口文件,通常是 index.js。

4、scripts:定义 npm 脚本命令,比如:npm start、npm run build 等,这些命令可以用于自动化执行构建、测试等操作。

5、description:项目的简短描述,通常是对项目功能的概述。

🌰

{
  "name": "my-vue-app",
  "version": "1.0.0",
  "description": "A Vue.js application",
  "main": "index.js"
}
1.2 依赖管理

package.json 文件指定了项目的 依赖,分为两种类型:

1、dependencies:项目在运行时需要的依赖。一般来说,这些是项目正常运行时必需的库和工具。

2、devDependencies:开发过程中需要的依赖。比如,构建工具、测试工具、开发服务器等。

🌰

{
  "dependencies": {
    "vue": "^3.2.0",
    "axios": "^0.21.0"
  },
  "devDependencies": {
    "webpack": "^5.0.0",
    "babel-loader": "^8.2.2"
  }
}
1.3 脚本管理

package.json 文件中的 scripts 字段允许我们自定义命令,可以让开发者通过 npm 或 yarn 来执行一系列的构建任务。比如:配置 build、serve、test 等命令。

常见的脚本包括:

- start:启动开发服务器,通常会调用 vue-cli-service serve 或其他工具来启动一个本地开发环境。

- build:用于构建生产环境的代码,通常会调用 vue-cli-service build 进行打包。

- test:执行单元测试。

🌰

{
  "scripts": {
    "start": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "test": "jest"
  }
}
1.4 版本控制

package.json 中的 version 字段遵循 semver(语义化版本)规范规则,帮助团队和开发者清楚地了解每个版本的变化。

- 主版本号(major):当修改了不兼容的 API,增加了破坏性的改动时,升级主版本号。

- 次版本号(minor):当向下兼容的功能中增加了新功能时,升级次版本号。

- 修订版本号(patch):当修复了向下兼容的问题时,升级修订版本号。

🌰

{
  "version": "1.2.3"
}
1.5 package.json 的目的

1、简化项目配置

将项目的关键信息、脚本、依赖等内容集中存储,方便开发者和构建工具访问和管理。

2、共享项目依赖

通过 npm install 或 yarn install 安装依赖时,package.json 文件会根据预设的依赖版本范围安装匹配的依赖。

2. package-lock.json

package-lock.json 是自动生成的文件,用于锁定所有项目依赖的版本,以确保每次安装依赖时使用相同版本的包。这个文件不会手动编辑,它会由 npm install 自动创建和更新。

2.1 作用

1、锁定依赖版本

package-lock.json 中记录了 node_modules 中每个依赖包的确切版本。这样即便 package.json 中的版本范围使用的是类似 ^~ 这种可变的版本号,package-lock.json 会确保每次 npm install 时,依赖的版本是相同的。

2、提高安装速度

由于 package-lock.json 中包含了每个包的准确版本信息,npm 可以更快地查找依赖并避免不必要的版本解析。

3、确保一致性

保证团队中的每个开发者和 CI/CD 环境中使用相同的依赖版本,避免了 "works on my machine" 的问题。

2.2 文件内容 🌰
{
  "name": "my-project",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "dependencies": {
    "express": {
      "version": "4.17.1",
      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
      "integrity": "sha512-...",
      "dev": false
    },
    "lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-..."
    }
  }
}

字段解释:

1、lockfileVersion:指示 package-lock.json 的版本,当前为版本 1。

2、dependencies:每个依赖项的详细信息,包括:

- version:该依赖的确切版本。

- resolved:依赖包的 tarball URL。

- integrity:包内容的校验,用于确保下载的包没有被篡改。

- dev:指示依赖是开发依赖还是生产依赖。

3. ^ 和 ~ 的作用

在 package.json 中指定依赖版本时,常常会使用 ^~ 来允许一些版本范围。

3.1 ^(Caret)

表示兼容主版本号不变的最新次版本。即只会安装不改变 API 的版本。例如:

- "express":"^4.17.1" 表示允许安装 4.x.x 的所有版本(eg:4.18.0,4.19.1 等),但不运行安装 5.x.x 或更高版本。

- ^1.0.0 允许更新到 2.x.x 之前的任何版本。

3.2 ~(Tilde)

表示兼容次版本号不变的最新修订版本。即仅允许更新到同一 minor 版本中的新版本。例如:

"express":"~4.17.1" 表示允许安装 4.17.x 版本(如:4.17.3),但不允许安装 4.18.0 版本或更高。

3.3 *

表示接受所有版本。

3.4 >=<=

表示接受大于或小于某个版本的所有版本。

4. 什么时候推送 package-lock.json?

4.1 推送

始终将 package-lock.json 文件提交到版本控制系统(如 git),保证团队中的每个开发者都能使用相同版本的依赖,避免因不同版本导致的错误。

📢:在 package.json 或其他文件更新了依赖后(如新增or删除包),一定要将 package-lock.json 一并推送。

4.2 不推送

在某些开源项目中不推送,尤其是对于一些 库 类的项目,是因为:

1、用户需求的灵活性:开发者希望根据自己的需求自由选择依赖版本,而不是被锁定。

2、避免依赖冲突:如果一个库的 package-lock.json 锁定了某个版本,但它的使用者已经有其他版本的依赖,可能会发生冲突,特别是在跨库、跨团队的合作中。

单纯的前端项目依赖(例如:没有 Node.js 环境要求)且不会涉及多人开发时,可能不需要提交 package-lock.json,但在实际生产环境中推荐提交。


http://www.kler.cn/a/512539.html

相关文章:

  • 【Spring】定义的Bean缺少隐式依赖
  • VSCode的配置与使用(C/C++)
  • 计算机系统原理:一些断言
  • 第10章:Python TDD优化货币类方法与引入工厂方法
  • 如何用3个月零基础入门网络安全?_网络安全零基础怎么学习
  • uniapp——App 监听下载文件状态,打开文件(三)
  • 流行的开源高性能数据同步工具 - Apache SeaTunnel 整体架构运行原理
  • 【ARM】MDK-语言标准执行报错Error:268
  • C#操作Xml节点
  • 自动化办公|使用Python重命名并移动文件到对应文件夹
  • 基于微信小程序的医院挂号预约系统ssm+论文源码调试讲解
  • 基于行为分析的企业内网安全防护系统设计
  • 【大模型】ChatGPT 高效处理图片技巧使用详解
  • 《Vue3 十》Vue 底层原理
  • [gpu驱动] H200 nvidia-fabricmanager-550升级到nvidia-fabricmanager-565报错,升级步骤
  • Android 13 动态显示隐藏 HomeButton,RecentsButton
  • 100条Linux命令汇总
  • 微信小程序之 如何使用全局变量将openid传到其他页面
  • 【Tortoise-ORM】 高级特性与实战
  • Linux内核编程(二十一)USB驱动开发
  • 【Java数据结构】Java对象的比较
  • python如何导出数据到excel文件
  • 京东api接口获得JD商品详情接口PHP调用演示示例
  • 12 分布式事务
  • 深入 Flutter 和 Compose 的 PlatformView 实现对比,它们是如何接入平台控件
  • Pandas 数据重命名:列名与索引