一文了解 `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
英文地址,請注明出處:http://en.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控制點 節點矢…