【NPM 笔记(二)】package.json 与 package-lock.json 的作用

package.json

package.json 是 NPM 项目的核心配置文件。

  • 项目基本元信息:记录脚本命令、项目入口、执行环境等。
  • 管理项目依赖:记录项目运行时所需的第三方依赖包以及版本范围。
  • 支持开源项目发布:记录项目开源协议、开源目录、项目名称、项目版本等。

字段详解

json 复制代码
{
  // 项目名称:小写,可含 @ 或斜杠(如 @username/project),用于标识项目
  "name": "npm-demo",
  // 项目版本:遵循语义化版本(X.Y.Z),开源发布时必填
  "version": "1.0.0",
  // 项目描述:简要说明项目用途,便于开源时被搜索和理解
  "description": "A demo project for NPM learning",
  // 作者信息:格式可为 "姓名 <邮箱>" 或 "组织名",开源项目常用
  "author": "Your Name <your@email.com>",
  // 开源协议:如 MIT、ISC 等,规定项目使用权限(开源项目必填)
  "license": "ISC",
  // 关键词:数组形式,用于开源项目被搜索时匹配(如 ["vue", "npm"])
  "keywords": ["npm", "package.json"],
  // 私有项目标识:设为 true 时,禁止发布到 NPM 仓库(本地项目建议开启)
  "private": true,
  // 入口文件:其他项目引用当前项目时(如 require('npm-demo'))的默认加载路径
  "main": "./src/index.js",
  // 副作用文件声明:告知打包工具(如 Webpack)哪些文件不可被"树摇"(删除未引用代码)
  "sideEffects": ["./src/utils/polyfill.js", "*.css"],
   // 开发环境提示:运行时需满足以下版本要求
   "engines": {
      "node": ">=18.0.0" // Node.js ≥ 18.0.0
   },
  // 自定义脚本命令:通过 npm run <命令名> 执行,简化开发流程
  "scripts": {
     // 示例:npm run start 启动项目
    "start": "node ./src/index.js", 
     // 示例:构建生产环境代码
    "build": "webpack --mode production" 
  },
  // 生产环境依赖:项目运行时必需的库(如 UI 框架、工具库)
  // 安装命令:npm install <包名> -S 或 npm install <包名> --save
  "dependencies": {
     // 版本规范见下方说明
    "element-plus": "^2.7.6" 
  },
  // 开发环境依赖:仅开发时需要的工具(如打包工具、测试框架)
  // 安装命令:npm install <包名> -D 或 npm install <包名> --save-dev
  "devDependencies": {
     // 版本规范见下方说明
    "webpack": "^5.92.1"
  },
  // peer 依赖:开源项目中声明的"同伴依赖",需用户手动安装(避免重复依赖)
  // 例:Vue 组件库通常声明 peerDependencies: { "vue": "^3.0.0" }
  "peerDependencies": {
     // 版本规范见下方说明
    "vue": "^3.2.0"
  }
}

版本号规范

版本号各部分含义

在 NPM 生态中,所有包的版本号均遵循 语义化版本规范 (SemVer),格式为 X.Y.Z,每个数字代表明确的更新含义。

  • X(主版本号,Major) :当进行 不兼容的 API 变更 时,主版本号递增(如 1.2.32.0.0)。
  • Y(次版本号,Minor) :当 新增功能但保持向后兼容 时,次版本号递增(如 1.2.31.3.0)。
  • Z(补丁版本号,Patch) :当 仅修复 bug 且保持向后兼容 时,补丁版本号递增(如 1.2.31.2.4)。

注意:版本规则并非所有库都能严格遵守,具体取决于开发者的实现风格。

版本号前缀

package.json 中声明依赖时,版本号前可添加前缀,控制 npm install 时的更新范围,避免项目依赖版本意外升级导致的兼容性问题。

  • 无前缀 :固定版本(如 1.2.3),仅安装指定版本。
  • ~ :锁定 X 和 Y,允许 Z 更新(如 ~1.2.3 → 可更新至 1.2.9)。
  • ^ :锁定 X,允许 Y 和 Z 更新(如 ^1.2.3 → 可更新至 1.9.9)。
  • *****:始终安装最新版本(不推荐,可能导致兼容性问题)。

注意:建议使用 "无前缀",这样就能保证每个项目开发者本地依赖包版本号一致。当前也可以通过 package-lock.json 进一步固化版本号。

注意事项

  • 开发 第三方包 时,需严格区分 dependencies(用户运行时必需)和 devDependencies(仅开发者需要),避免冗余安装。
  • 本地项目建议设置 "private": true,防止误发布。

package-lock.json

package-lock.json 用于辅助package.json配置,确保团队协作依赖一致性。

  • 版本锁定 :精确记录每个依赖(包括间接依赖)的安装版本,避免 npm install 时因版本范围(如 ^ ~)自动升级导致的兼容性问题;

  • 加速安装 :通过 integrity 哈希值匹配本地缓存,无需重复从远程仓库下载;

  • 依赖可视化:清晰展示依赖树结构(直接依赖 → 间接依赖),便于排查版本冲突。

json 复制代码
{ 
  // 项目名称
  "name": "npm",
  // 项目版本号
  "version": "1.0.0",
  // 项目package-lock.json的版本号
  "lockfileVersion": 3,
  // 项目的依赖关联采用的字段,如果是true,就会检验`dependencies`和`resolutions`两个字段
  "requires": true,
  // 项目的依赖
  "packages": {
    // 根依赖的入口
    "": {
      // 项目的名称
      "name": "npm",
      // 项目的版本号
      "version": "1.0.0",
      // 项目的开源协议
      "license": "ISC",
      // 根依赖的关联依赖
      "dependencies": {
        "less": "^4.2.0",
        "vue": "^2.7.7"
      }
    },
    "node_modules/vue": {
      // 依赖的版本号
      "version": "2.7.7",
      // 依赖的registry仓库的压缩包地址
      "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.7.tgz",
      // 当需要下载时,使用该字段的值和本地依赖缓存进行比对,如果相同就不在去registry仓库下载,而是直接使用本地缓存
      "integrity": "sha512-osfkncsGCWqtch+YWYxbqTNQ9hl/UQ6TFRkdmK/VqAjuMpxzr5QotFsYpmJ1AB1ez2LJeIKXDmtMkXUotMOTsA==",
      // deprecated 字段用于标记某个依赖项已经被废弃
      "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
      "dependencies": {
        "@vue/compiler-sfc": "2.7.7",
        "csstype": "^3.1.0"
      }
    }
  }
}

注意事项

  • 无需手动修改 package-lock.json,NPM 会自动维护其内容。
  • 团队协作时,需将其纳入版本控制(如 Git),确保所有人使用一致的依赖版本。
相关推荐
Carlos_sam29 分钟前
Opnelayers:ol-wind之Field 类属性和方法详解
前端·javascript
小毛驴85039 分钟前
创建 Vue 项目的 4 种主流方式
前端·javascript·vue.js
誰能久伴不乏1 小时前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端
涔溪2 小时前
响应式前端设计:CSS 自适应布局与字体大小的最佳实践
前端·css
今禾2 小时前
前端开发中的Mock技术:深入理解vite-plugin-mock
前端·react.js·vite
你这个年龄怎么睡得着的2 小时前
Babel AST 魔法:Vite 插件如何让你的 try...catch 不再“裸奔”?
前端·javascript·vite
我想说一句2 小时前
掘金移动端React开发实践:从布局到样式优化的完整指南
前端·react.js·前端框架
jqq6662 小时前
Vue3脚手架实现(九、渲染typescript配置)
前端
码间舞3 小时前
Zustand 与 useSyncExternalStore:现代 React 状态管理的极简之道
前端·react.js
Dream耀3 小时前
提升React移动端开发效率:Vant组件库
前端·javascript·前端框架