Published on

前端 package.json 完全指南

Authors
  • avatar
    Name
    Adain
    Twitter

package.json 是每个前端项目的核心配置文件,它定义了项目的基本信息、依赖关系、脚本命令等。理解 package.json 对于前端开发者来说至关重要。

什么是 package.json?

package.json 是一个 JSON 格式的配置文件,位于项目根目录,包含了项目的元数据和配置信息。它是 npm(Node Package Manager)生态系统的核心。

基本结构

{
  "name": "my-project",
  "version": "1.0.0",
  "description": "项目描述",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "build": "webpack --mode production",
    "test": "jest"
  },
  "dependencies": {
    "react": "^18.2.0",
    "lodash": "~4.17.21"
  },
  "devDependencies": {
    "webpack": "^5.88.0",
    "jest": "^29.6.0"
  },
  "keywords": ["react", "frontend"],
  "author": "Your Name",
  "license": "MIT"
}

核心字段详解

1. 基本信息字段

name(必需)

项目名称,必须是唯一的,用于 npm 发布。

{
  "name": "my-awesome-project"
}

规则:

  • 必须小写
  • 可以包含连字符和下划线
  • 不能包含空格
  • 长度不超过 214 个字符

version(必需)

项目版本号,遵循语义化版本(SemVer)规范。

{
  "version": "1.2.3"
}

description

项目描述,会显示在 npm 搜索结果中。

{
  "description": "一个用于学习的 React 项目"
}

main

项目的入口文件,当其他项目引用这个包时的默认入口。

{
  "main": "dist/index.js"
}

keywords

关键词数组,用于 npm 搜索。

{
  "keywords": ["react", "component", "ui", "frontend"]
}

author

作者信息,可以是字符串或对象。

{
  "author": "张三 <zhangsan@example.com> (https://zhangsan.dev)"
}

或者:

{
  "author": {
    "name": "张三",
    "email": "zhangsan@example.com",
    "url": "https://zhangsan.dev"
  }
}

license

许可证类型。

{
  "license": "MIT"
}

2. 脚本字段

scripts

定义可执行的脚本命令。

{
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "lint": "eslint src/",
    "lint:fix": "eslint src/ --fix",
    "dev": "webpack serve --mode development",
    "prebuild": "npm run lint",
    "postbuild": "echo 'Build completed!'"
  }
}

生命周期脚本:

  • preinstall: 安装前执行
  • postinstall: 安装后执行
  • prepublish: 发布前执行
  • postpublish: 发布后执行

3. 依赖字段

dependencies

生产环境依赖,应用运行时需要的包。

{
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "axios": "^1.4.0",
    "lodash": "^4.17.21"
  }
}

devDependencies

开发环境依赖,只在开发时需要的包。

{
  "devDependencies": {
    "webpack": "^5.88.0",
    "babel-loader": "^9.1.0",
    "eslint": "^8.45.0",
    "jest": "^29.6.0",
    "@types/react": "^18.2.0"
  }
}

peerDependencies

同伴依赖,表示当前包与指定包的兼容性。

{
  "peerDependencies": {
    "react": ">=16.8.0",
    "react-dom": ">=16.8.0"
  }
}

optionalDependencies

可选依赖,安装失败不会影响整个安装过程。

{
  "optionalDependencies": {
    "fsevents": "^2.3.0"
  }
}

版本管理详解

语义化版本(SemVer)

版本格式:主版本号.次版本号.修订号 (MAJOR.MINOR.PATCH)

1.2.3
│ │ │
│ │ └── 修订号:bug 修复
│ └──── 次版本号:新功能添加(向后兼容)
└────── 主版本号:重大变更(可能不向后兼容)

版本范围符号

1. 精确版本

{
  "dependencies": {
    "lodash": "4.17.21"
  }
}

只安装确切的 4.17.21 版本。

2. 波浪号 (~)

{
  "dependencies": {
    "lodash": "~4.17.21"
  }
}
  • ~4.17.21 → 允许 >=4.17.21 <4.18.0
  • 只更新修订号,不更新次版本号
  • 相当于 4.17.x

3. 插入号 (^)

{
  "dependencies": {
    "lodash": "^4.17.21"
  }
}
  • ^4.17.21 → 允许 >=4.17.21 <5.0.0
  • 可以更新次版本号和修订号,但不更新主版本号
  • 相当于 4.x.x

4. 范围版本

{
  "dependencies": {
    "lodash": ">=4.17.0 <5.0.0",
    "react": "16.8.0 - 18.2.0"
  }
}

5. 预发布版本

{
  "dependencies": {
    "next": "13.0.0-beta.1",
    "typescript": "5.0.0-rc.2"
  }
}

6. 最新版本

{
  "dependencies": {
    "lodash": "latest",
    "react": "*"
  }
}

版本范围对比表

符号示例允许的版本范围说明
1.2.31.2.3精确版本
~~1.2.3>=1.2.3 <1.3.0修订号更新
^^1.2.3>=1.2.3 <2.0.0次版本号更新
>=>=1.2.3>=1.2.3大于等于
<<2.0.0<2.0.0小于
-1.2.0-1.3.0>=1.2.0 <=1.3.0范围

高级配置字段

1. engines

指定运行环境版本要求。

{
  "engines": {
    "node": ">=14.0.0",
    "npm": ">=6.0.0",
    "yarn": ">=1.22.0"
  }
}

2. browserslist

指定浏览器兼容性。

{
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead",
    "not ie 11"
  ]
}

3. files

指定发布到 npm 时包含的文件。

{
  "files": [
    "dist/",
    "lib/",
    "README.md",
    "LICENSE"
  ]
}

4. bin

定义可执行文件。

{
  "bin": {
    "my-cli": "./bin/cli.js"
  }
}

5. repository

源码仓库信息。

{
  "repository": {
    "type": "git",
    "url": "https://github.com/username/repo.git"
  }
}

6. homepage

项目主页。

{
  "homepage": "https://my-project.com"
}

7. bugs

问题反馈地址。

{
  "bugs": {
    "url": "https://github.com/username/repo/issues",
    "email": "bugs@example.com"
  }
}

依赖锁定机制

package-lock.json

npm 自动生成的锁定文件,记录确切的依赖版本。

{
  "name": "my-project",
  "version": "1.0.0",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "name": "my-project",
      "version": "1.0.0",
      "dependencies": {
        "lodash": "^4.17.21"
      }
    },
    "node_modules/lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
    }
  }
}

yarn.lock

Yarn 的锁定文件格式。

lodash@^4.17.21:
  version "4.17.21"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==

实用配置示例

React 项目配置

{
  "name": "my-react-app",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "lint": "eslint src/ --ext .js,.jsx,.ts,.tsx",
    "lint:fix": "eslint src/ --ext .js,.jsx,.ts,.tsx --fix",
    "format": "prettier --write src/**/*.{js,jsx,ts,tsx,json,css,md}"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router-dom": "^6.14.0",
    "axios": "^1.4.0"
  },
  "devDependencies": {
    "@types/react": "^18.2.0",
    "@types/react-dom": "^18.2.0",
    "typescript": "^5.0.0",
    "eslint": "^8.45.0",
    "prettier": "^3.0.0",
    "react-scripts": "5.0.1"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

Vue 项目配置

{
  "name": "my-vue-app",
  "version": "0.1.0",
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "vue": "^3.3.0",
    "vue-router": "^4.2.0",
    "vuex": "^4.1.0"
  },
  "devDependencies": {
    "@vue/cli-service": "^5.0.0",
    "@vue/cli-plugin-router": "^5.0.0",
    "@vue/cli-plugin-vuex": "^5.0.0",
    "eslint": "^8.45.0",
    "eslint-plugin-vue": "^9.15.0"
  }
}

最佳实践

1. 版本管理策略

  • 生产依赖:使用 ^ 允许小版本更新
  • 开发依赖:可以使用更宽松的版本范围
  • 关键依赖:考虑锁定具体版本

2. 脚本命名规范

{
  "scripts": {
    "dev": "开发环境启动",
    "build": "生产环境构建",
    "build:dev": "开发环境构建",
    "build:prod": "生产环境构建",
    "test": "运行测试",
    "test:watch": "监听模式测试",
    "lint": "代码检查",
    "lint:fix": "自动修复代码",
    "format": "代码格式化"
  }
}

3. 依赖分类原则

  • dependencies: 运行时必需的包
  • devDependencies: 开发时工具和测试包
  • peerDependencies: 宿主环境提供的包
  • optionalDependencies: 可选功能包

4. 安全注意事项

  • 定期检查依赖漏洞:npm audit
  • 更新依赖包:npm update
  • 使用 .npmrc 配置私有源

常用命令

安装依赖

# 安装生产依赖
npm install lodash
npm i lodash --save

# 安装开发依赖
npm install webpack --save-dev
npm i webpack -D

# 安装全局依赖
npm install -g typescript

# 安装指定版本
npm install react@18.2.0

版本管理

# 查看过期依赖
npm outdated

# 更新依赖
npm update
npm update lodash

# 检查安全漏洞
npm audit
npm audit fix

脚本执行

# 运行脚本
npm run build
npm run test
npm start

# 查看所有脚本
npm run

总结

package.json 是前端项目的核心配置文件,理解其各个字段的作用和版本管理机制对于前端开发至关重要。合理配置 package.json 可以:

  • 🎯 明确项目依赖关系
  • 🔒 确保版本一致性
  • 🚀 简化开发流程
  • 📦 规范项目结构

掌握版本符号的含义(^~等)和依赖锁定机制,能够有效避免"在我机器上能跑"的问题,提升团队协作效率。

记住:好的 package.json 配置是项目成功的第一步!