一文了解 `package.json` 和 `package-lock.json`文件

所有使用 npm 或 yarn(部分场景)管理依赖的 JavaScript/Node.js 项目都会存在**的核心文件–package.jsonpackage-lock.json,无论项目类型是 Vue、React、Angular,还是纯 Node.js 后端项目、普通 JavaScript 工具库等。

所以这两个文件究竟有什么作用?

package.json

package.json 是每个 Node.js/ 前端项目的必备文件,它就像项目的 “身份证”,记录了项目的基本信息、依赖关系、脚本命令等核心元数据。无论使用 Vue、React 还是其他框架,npm init初始化项目后都会自动生成这个文件。

1. 核心作用

  • 描述项目信息:如项目名称、版本、作者、许可证等。
  • 声明依赖关系:记录项目依赖的第三方包(dependencies 生产依赖、devDependencies 开发依赖)。
  • 定义脚本命令:通过 scripts 字段配置可执行脚本(如 npm run servenpm run build)。
  • 指定项目规范:如 Node.js 版本要求、模块入口文件、浏览器兼容性等。

2. 关键字段解析

一个典型的 package.json 结构如下(以通过脚手架创建的 Vue 2项目为例):

{// 项目名称(小写,无空格,通常用于 npm 发布标识)"name": "my-directive",// 项目版本(遵循语义化版本:主版本.次版本.补丁版本)"version": "0.1.0",// 设为 true 表示私有项目,不会被发布到 npm 仓库(避免误发布)"private": true,// 自定义脚本命令(通过 npm run <命令名> 执行)"scripts": {"serve": "vue-cli-service serve", // 启动开发服务器(带热重载)"build": "vue-cli-service build", // 打包生产环境代码(输出到 dist 目录)"lint": "vue-cli-service lint"    // 执行代码检查(基于 ESLint 规则)},// 生产环境依赖(项目运行时必需,会被打包到最终产物中)"dependencies": {"core-js": "^3.8.3", // 提供 ES6+ 语法的 polyfill,兼容旧浏览器"vue": "^2.6.14"     // Vue 2 核心库(^ 表示允许次版本和补丁版本更新)},// 开发环境依赖(仅开发时需要,不会被打包到生产环境)"devDependencies": {"@babel/core": "^7.12.16",          // Babel 核心库,用于转译 ES6+ 语法"@babel/eslint-parser": "^7.12.16", // ESLint 解析器,支持 Babel 转译后的代码"@vue/cli-plugin-babel": "~5.0.0",  // Vue CLI 的 Babel 插件(~ 表示允许补丁版本更新)"@vue/cli-plugin-eslint": "~5.0.0", // Vue CLI 的 ESLint 插件"@vue/cli-service": "~5.0.0",       // Vue CLI 核心服务(处理项目构建、开发服务器等)"eslint": "^7.32.0",                // ESLint 核心库,用于代码规范检查"eslint-plugin-vue": "^8.0.3",      // Vue 专用 ESLint 插件(检查 .vue 文件语法)"vue-template-compiler": "^2.6.14"  // Vue 2 模板编译器(将 .vue 模板编译为渲染函数)},// ESLint 配置(代码规范检查规则)"eslintConfig": {"root": true, // 表示当前配置为根配置,不继承父目录的 ESLint 配置"env": {"node": true // 启用 Node.js 环境的全局变量(如 require、module 等)},"extends": ["plugin:vue/essential", // 继承 Vue 官方基础 ESLint 规则"eslint:recommended"    // 继承 ESLint 官方推荐规则],"parserOptions": {"parser": "@babel/eslint-parser" // 指定 ESLint 使用 Babel 解析器},"rules": {} // 自定义规则(此处为空,表示使用默认规则)},// 浏览器兼容性配置(供 Babel、Autoprefixer 等工具使用)"browserslist": ["> 1%",         // 支持全球市场份额 >1% 的浏览器"last 2 versions", // 支持各浏览器的最新两个版本"not dead"      // 排除已停止维护的浏览器(如 IE 10 及以下)]
}
关于依赖版本的 “特殊符号”

dependencies 中依赖的版本号常带有 ^~,这是 npm 版本范围语法

主版本 ≥1 时:

  • 2.6.14这三位数从左到右依次对应 主版本、次版本、补丁版本
  • ^2.6.14:允许次版本、补丁版本更新,安装 2.x.x 中最新的版本(不超过 3.0.0),如 2.6.15、2.7.0 均可。
  • ~2.6.14:允许补丁版本更新,安装 2.6.x 中最新的版本(不超过 2.7.0),如 2.6.15 可安装,2.7.0 不行。
  • 无符号(如 2.6.14):锁定为精确版本,只能安装 2.6.14。

主版本 =0 时:

  • ^0.1.2 仅允许 补丁版本更新 (和 ~ 效果一致),不允许次版本升级(如 0.2.0 不行)。
  • 原因:主版本 0 表示 API 开发中、不稳定,次版本升级可能包含不兼容变更,因此 ^ 会限制更严格。

package-lock.json

package-lock.json 是 npm 5+ 新增的文件,它的核心作用是锁定项目依赖的精确版本,确保在不同环境下安装的依赖完全一致。

1. 为什么需要它?

package.json 中依赖的版本通常是 “范围版本”(如 ^2.6.14),这会导致一个问题:

  • 开发者 A 第一天安装依赖时,vue 可能安装的是 2.6.14。
  • 一周后,开发者 B 克隆项目并执行 npm install 时,vue 可能已经发布了 2.6.15,此时会自动安装新版本。


如果新版本存在兼容性问题,就会出现 “在我电脑上能运行,在你电脑上不能运行” 的尴尬情况。
package-lock.json 正是为解决这个问题而生:它会记录首次安装时所有依赖的精确版本、下载地址和依赖树结构,后续无论何时何地执行 npm install,都会严格按照这个快照安装,确保依赖版本完全一致。

2. 核心内容解析

package-lock.json 的结构较为复杂,以下解析核心字段:

{"name": "my-directive",  // 项目名称(与 package.json 一致)"version": "0.1.0",      // 项目版本(与 package.json 一致)"lockfileVersion": 3,    // lock 文件版本(3 对应 npm 9+,不同版本格式有差异)"requires": true,        // 表示依赖树必须被严格遵守,npm 会强制按照此文件安装依赖"packages": {            // 存储所有依赖包的详细信息(核心字段)"": {  // 根项目入口(对应当前项目本身)"name": "my-directive","version": "0.1.0",// 生产依赖声明(与 package.json 中 dependencies 一致,记录版本范围)"dependencies": {"core-js": "^3.8.3","vue": "^2.6.14"},// 开发依赖声明(与 package.json 中 devDependencies 一致,记录版本范围)"devDependencies": {"@babel/core": "^7.12.16","@babel/eslint-parser": "^7.12.16","@vue/cli-plugin-babel": "~5.0.0","@vue/cli-plugin-eslint": "~5.0.0","@vue/cli-service": "~5.0.0","eslint": "^7.32.0","eslint-plugin-vue": "^8.0.3","vue-template-compiler": "^2.6.14"}},// 单个依赖包的详细信息(以 vue 为例)"node_modules/vue": {"version": "2.7.16",  // 实际安装的精确版本(无 ^/~,此处与 package.json 中的 ^2.6.14 兼容)"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz",  // 依赖包的下载地址"integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",  // 哈希校验值(确保包未被篡改)"deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",  // 包的废弃提示"license": "MIT",  // 开源许可证类型"dependencies": {  // 该依赖的子依赖(递归锁定所有嵌套依赖的精确版本)"@vue/compiler-sfc": "2.7.16","csstype": "^3.1.0"}}}
}

3. package-lock.json会自动更新吗?

会,package-lock.json 会在以下场景自动更新:

  • 执行 npm install <package> 安装新依赖时。
  • 执行 npm update <package> 更新依赖版本时。
  • 手动修改 package.json 中的依赖版本后,执行 npm install 时。


更新后,它会记录最新安装的精确版本,确保下次安装时一致。

核心区别与协作关系

特性package.jsonpackage-lock.json
核心作用描述项目信息和依赖范围锁定依赖的精确版本和安装信息
手动修改可手动编辑(如修改脚本、依赖范围)禁止手动编辑(由 npm 自动生成和维护)
版本记录方式范围版本(如 ^2.6.14精确版本(如 2.6.14
必要性必需(项目基础配置)可选但强烈推荐(确保依赖一致性)

协作流程

  1. 开发者初始化项目时,package.json 被创建,记录依赖范围。
  2. 首次执行 npm install 时,npm 根据 package.json 下载依赖,并生成 package-lock.json,记录所有依赖的精确版本。
  3. 其他开发者克隆项目后,执行 npm install 时,npm 会优先读取 package-lock.json,按照其中的精确版本安装依赖,忽略 package.json 中的范围版本。
  4. 当更新依赖时(如 npm install vue@latest),两者会同步更新:package.json 记录新的范围版本,package-lock.json 记录新的精确版本。

使用注意事项

1. 提交 package-lock.json 到代码仓库

必须将 package-lock.json 提交到 Git 等版本控制系统(此处指的是项目架构时期),这样团队所有成员、CI/CD 环境、生产服务器安装的依赖版本才能完全一致,避免 “环境差异” 导致的问题。

注意:如果项目没确定要变更依赖,你自己本地运行时该文件出现变更,也不要随便提交该文件,一定要再三确认!

2. 不要手动编辑 package-lock.json

该文件由 npm 自动生成和维护,手动修改可能导致依赖树错乱,引发安装失败或版本不一致。若需修改依赖版本,应通过 npm install <package>@x.y.z 等命令,让 npm 自动更新两个文件。

3. 理解 npm install 的行为

  • 当项目中存在 package-lock.json 时,npm install 会优先按照其中的精确版本安装,忽略 package.json 的范围版本(除非 package.json 中的版本范围不兼容 package-lock.json 的精确版本)。
  • 若删除 package-lock.json 后执行 npm install,npm 会根据 package.json 的范围版本重新安装最新兼容版本,并生成新的 package-lock.json

4. 处理版本冲突

如果团队中出现 package-lock.json 冲突(如多人更新了依赖),建议:

  • 先拉取最新代码,尝试自动合并。
  • 若合并失败,可删除 package-lock.jsonnode_modules,重新执行 npm install 生成新的锁定文件(前提是 package.json 已同步最新依赖)。

5. 与 yarn 的兼容性

如果你使用 yarn 包管理器,它会生成 yarn.lock 文件(作用与 package-lock.json 一致)。不要混合使用 npm 和 yarn,否则可能导致锁定文件冲突,依赖版本不一致。

常见误区

  1. “package-lock.json 会阻止依赖更新”?
    不会。它只是锁定当前版本,若需更新依赖,可通过 npm updatenpm install <package>@latest 命令,此时 package-lock.json 会自动更新为新的精确版本。
  2. “删除 package-lock.json 能解决所有依赖问题”?
    这是治标不治本的做法。删除后依赖版本可能发生变化,虽然可能暂时解决问题,但会引入版本不一致的风险。正确做法是找到版本冲突的根源,通过合理的版本范围或锁定策略解决。
  3. “只有生产环境需要 package-lock.json”?
    开发环境同样需要。开发依赖(如 Webpack、Babel)的版本不一致,可能导致本地构建失败或功能差异,影响开发效率。

本文到此,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917145.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI论文】大语言模型量化的几何原理:将GPTQ视为Babai最近平面算法

摘要&#xff1a;将大型语言模型&#xff08;LLMs&#xff09;的权重从16位量化到更低位宽&#xff0c;是实际部署大规模Transformer模型到更具性价比的加速器上的通用方法。GPTQ已成为大语言模型规模下一站式训练后量化的标准方法之一。然而&#xff0c;其内部工作原理被描述为…

数据处理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 数据清洗 特征可视化 Kaggle数据集实操 读者收获&#xff1a;1周内具备数据预处理能力 数…

计算机系统层次结构

计算机系统通过多层抽象&#xff0c;平衡硬件效率与软件灵活性&#xff0c;各层以独立语言和功能构成有机整体。一、层次划分&#xff08;从底层到顶层&#xff09;层级名称特点实现方式第1级微程序机器层硬件直接执行微指令&#xff08;如微操作控制信号&#xff09;。物理硬件…

04 基于sklearn的机械学习-梯度下降(上)

梯度下降一 、为什么要用到梯度下降&#xff1f;正规方程的缺陷&#xff1a;非凸函数问题&#xff1a;损失函数非凸时&#xff0c;导数为0会得到多个极值点&#xff08;非唯一解&#xff09;计算效率低&#xff1a;逆矩阵运算时间复杂度 O(n3)&#xff0c;特征量翻倍时计算时间…

淘宝 API HTTP/2 多路复用与连接优化实践:提升商品数据采集吞吐量

一、引言​随着电商行业的蓬勃发展&#xff0c;对淘宝平台商品数据的采集需求日益增长。无论是市场调研公司分析市场趋势、电商平台整合商品资源&#xff0c;还是商家进行竞品分析&#xff0c;都需要高效、稳定地获取大量淘宝商品数据。然而&#xff0c;传统的 HTTP 协议在面对…

javascript中call、apply 和 bind 的区别详解

文章目录深入浅出&#xff1a;JavaScript 中的 call、apply 和 bind一、三位魔法师的共同使命二、各显神通的魔法师们1. call - 即时通讯专家2. apply - 批量处理高手3. bind - 预约服务大师三、魔法师们的对比表格四、魔法师们的实际应用1. 借用方法2. 函数柯里化3. 事件处理五…

【PHP】接入百度AI开放平台人脸识别API,实现人脸对比

目录 一、需求 二、准备工作 1、申请服务 2、创建应用&#xff0c;获取开发密钥 3、官方开发文档 4、测试人像图片 三、PHP接入 1、鉴权&#xff0c;获取access_token 2、人脸对比 四、完整代码 一、需求 现在人脸识别、人脸对比技术越来越成熟&#xff0c;使用越来越…

【东枫科技】DreamHAT+

DreamHAT 是一款顶部附加硬件 (HAT) 套件&#xff0c;可为 Raspberry Pi 提供 60GHz 毫米波雷达供您使用。 全尺寸 HAT 包含一个英飞凌 BGT60TR13C 芯片&#xff0c;具有单个发射天线和三个接收器&#xff08;TX/RX&#xff09;&#xff0c;通过 GPIO 引脚和 SPI 连接到 Raspbe…

Spring Boot + MongoDB:从零开始手动配置 MongoConfig 实战

前言 你以为只要写上 spring.data.mongodb.*,就能一劳永逸,MongoDB 立马听话?别天真,这只是入门级操作,像是拿个自动挡钥匙,开个小车溜达溜达,远远算不上高手操作。当项目需求变得复杂,连接字符串需要灵活配置,或者多数据源并行作战时,自动配置的魔法显得捉襟见肘。…

建筑节能目标下,楼宇自控系统以高效运行助力节能减碳

随着全球气候变化问题日益严峻&#xff0c;节能减排已成为各国政府和企业的重要任务。在建筑领域&#xff0c;楼宇自控系统&#xff08;Building Automation System, BAS&#xff09;作为实现建筑节能目标的关键技术&#xff0c;正发挥着越来越重要的作用。根据中国政府发布的《…

LOVON——面向足式Open-Vocabulary的VLN导航:LLM做任务分解、YOLO11做目标检测,最后L2MM将指令和视觉映射为动作,且解决动态模糊

前言 因为项目需要(比如我们在做的两个展厅讲解订单)&#xff0c;近期我一直在研究VLN相关&#xff0c;有些工作哪怕暂时还没开源(将来可能会开源)&#xff0c;但也依然会解读&#xff0c;比如好处之一是构建完整的VLN知识体系&#xff0c;本文便是其中一例 我在解读过程中&am…

在线免费的AI文本转语音工具TTSMaker介绍

TTSMaker是一个在线的文本转语音工具&#xff0c; 支持多语言和中文方言&#xff0c;不同的语言和方言单次转换的字符上限从200-10000 不同&#xff0c;转换的效果还不错&#xff0c;听不出明显的AI痕迹。 工具的网址是&#xff1a;https://ttsmaker.cn/。 工具的界面如上&…

【AI问答】PromQL中interval和rate_interval的区别以及Grafana面板的配置建议

问题1&#xff1a;interval和rate_interval的区别 在PromQL中确实有 $__rate_interval 这个特殊的变量&#xff0c;它与 $__interval 有不同的用途和计算方式。 $__interval vs $__rate_interval 1. $__interval 含义&#xff1a;Grafana计算出的基本时间间隔计算方式&#xff…

STM32学习记录--Day5

今天了解了&#xff1a;中断中断有多个类别包括&#xff1a;USART中断&#xff0c;I2C中断等&#xff1b;并通过NVIC来分配中断的优先级EXTIEXTI的内部结构&#xff1a;EXTI线&#x1f527; ​​一、EXTI系统核心架构​​1. ​​中断源输入&#xff08;左上区域&#xff09;​​…

CentOS7下同步时间的几种方式(NTP 、Chrony和systemd-timesyncd)

文章目录前言一、NTP (Network Time Protocol) & ntpd1.原理2. 安装与配置(ntp 包)3.NTPd 优缺点对比二、Chrony1.原理2.安装与配置 (chrony 包)3. 优点4. 缺点三、systemd-timesyncd1.原理2.安装与配置 (systemd 自带)3. 优点4. 缺点四、手动同步工具1.ntpdate(已废弃&…

Web3:在 VSCode 中基于 Foundry 快速构建 Solidity 智能合约本地开发环境

相关文章推荐链接Web3专栏https://blog.csdn.net/qq_42392981/category_13016259.html在 VSCode 中基于 Foundry 快速构建 Solidity 智能合约本地开发环境引言1. 开发环境准备&#xff08;Windows&#xff09;1.1 安装 VSCode1.2 安装推荐插件1.3 安装 Foundry1.4 验证 Forge 和…

Implement recovery based on PITR using dump file and binlog

模拟生产场景中需要基于某个事务点的恢复&#xff0c;使用存量备份与存量binlog 生成测试数据 (rootlocalhost) [(none)]> create database NanJing; Query OK, 1 row affected (0.01 sec) (rootlocalhost) [test]> use NanJing; Database changed (rootlocalhost) [NanJ…

HTML-取消div,a等标签点击效果

一、背景当标签被设置onclick事件之后&#xff0c;在有些手机浏览器中&#xff0c;点击这些标签&#xff0c;会有点击变色效果。想要取消点击变色效果。通过为div和标签元素添加-webkit-tap-highlight-color样式属性&#xff0c;可以有效地解决这一问题二、解决方案已a标签示例…

VR 三维重建:开启沉浸式体验新时代

在科技飞速发展的今天&#xff0c;VR&#xff08;虚拟现实&#xff09;技术已经逐渐渗透到我们生活的各个领域&#xff0c;为我们带来了前所未有的沉浸式体验。而 VR 三维重建作为 VR 技术的重要应用之一&#xff0c;更是让人们能够身临其境地感受各种场景&#xff0c;无论是旅…

iTwinjs 几何 - Curve

CurvePrimitive 常用的见下 LineSegment3d直线段两点直线边、杆件、骨架LineString3d折线多点连续直线轮廓线、路径Arc3d圆弧 / 椭圆弧圆心 半径 起止角圆孔、圆角、弧段BezierCurve3d贝塞尔曲线端点 控制点平滑过渡、动画轨迹BSplineCurve3dB 样条 / NURBS控制点 节点矢…