package.json这些字段都是干啥的?

437 阅读5分钟

前端开发中,我们都离不开package.json,但很多人和它的关系也仅限于“点头之交”:知道它有 scripts 用来跑命令,有 dependenciesdevDependencies 管理依赖,觉得其他的配置也没什么用,用不到。但如果用好package.json,对于开发效率、项目维护、代码质量提升等都有很大的帮助。

为了方便以后查阅,我总结了package.json的常用配置,希望对大家有所帮助。有错误之处,欢迎指正。

废话少说,直接上干货。

基础信息

name

项目名称,标识NPM包的名称,必须唯一,搜索和安装时使用

version

版本号,推荐规范为 major.minor.patch,如1.0.0

  • patch为补丁版本,修复bug
  • minor为小版本,表示新增功能,向下兼容
  • major为重大版本,表示不向下兼容

title

项目标题

description

项目描述

keywords

关键字,用于优化NPM包的搜索

license

开源协议,主要是为了明确软件的使用、修改、分发等行为的规则和限制,防止版权问题。

  • MIT:允许自由使用、修改、复制、分发,但必须保留原作者的版权声明
  • GPL:强制开源,使用或修改代码的衍生品也必须开源。
  • Apache:允许闭源使用,要求注明改动、保留原版权声明,并附带专利授权,同时保护贡献者免于责任。

repository

项目的源码仓库地址url和类型type

bugs

项目的问题反馈地址url

homepage

项目主页地址

funding

项目赞助地址url和类型type

private

是否私有,true表示私有,无法发布到NPM

packageManager

指定包管理工具及版本,如npmpnpm@9.5.0等,仅提示,不强制使用

workspaces:指定工作区,用于管理多个包

  • 统一安装依赖,共享根目录的mode_modules),统一发布包等
  • 跨包引用:直接通过workspace名称引用其他包,无需发布到远程仓库
  • 简化脚本管理:在根目录的package.json中定义脚本,可以在工作区中直接使用
    • 应用到所有工作区:npm run <script> --workspaces
    • 应用到指定工作区:npm run <script> --workspace=<workspace-name>

文件和入口

main

项目的入口文件,默认index.js,当用commonjs的方式引入包时,默认会加载该文件

module

ES模块的入口文件,默认index.js,当使用ES模块方式引入包时,默认会加载该文件,没有则会加载main字段指定的文件,但可能导致tree-shaking失效,并在仅支持ESM的环境中报错

unpkg

unpkg是一个CDN服务,专门为开源的NPM包提供静态资源的在线访问,unpkg字段指定unpkg地址访问的代码文件,默认index.js。当访问https://unpkg.com/<package-name>时,会加载unpkg指定的文件,完整路径为https://unpkg.com/<package-name>@<version>/<file-path>

typings

TypeScript类型声明文件,默认index.d.ts。当前包被引用时,Typescript编译器会根据该包的typings字段找到类型声明文件,用于该包的类型检查。

files

指定需要包含在发布包中的文件。减少不必要的文件,减少包体积。如["dist", "lib", "*.d.ts"]

兼容

browserslist

指定项目支持的浏览器版本,用于babel、eslint等工具的代码转译,兼容不同浏览器。

  • > 0.5%:全球超过0.5%的浏览器用户
  • last 2 versions:最新两个版本的浏览器
  • Firefox ESR:Firefox的长期支持版本
  • not dead:排除已经停止维护的浏览器

engine

指定运行项目所需的Node.js、npm或pnpm的版本范围

  • x*: 表示任意版本
  • 14.x: 表示14.x.x版本
  • 14.0.0: 表示特定版本,14.0.0版本
  • >=: 表示大于等于某版本,如>=12.0.0
  • >: 表示大于某版本,如<12.0.0
  • ^: 表示兼容大版本,如^12.0.0支持12.x.x版本
  • ~: 表示兼容小版本,如~12.0.0支持12.0.x版本
  • -: 表示范围,如12.0.0 - 12.0.5表示12.0.012.0.5版本
  • ||: 表示或,如>=12.0.0 || <12.0.5表示大于等于12.0.0或者小于12.0.5版本

脚本与依赖

scripts

定义可以通过 npm run <script> 执行的命令。

dependencies

项目依赖,生产环境需要用到的包。

devDependencies

开发环境依赖,仅在开发时需要用到的包。

peerDependencies

指定当前包作为另一个包的依赖时,需要安装的包的版本范围。peerDependencies不会被当前包安装,因为这些依赖通常由使用该包的项目(而非包本身)来管理。

配置

config

用于存储自定义的配置数据,主要用于命令脚本。 通过$npm_package_config_<key>的方式在脚本中使用配置数据,如node app.js --port=$npm_package_config_port

{
  "config": {
    "port": 3000,
    // 比较常见的配置,项目中使用了husky时,husky会调用该配置校验代码提交信息
    "commitizen": {
      "path": "node_modules/cz-git",
      "czConfig": "./scripts/commitizen.js"
    }
  }
}

sideEffects

用于tree-shaking优化,用来标记哪些文件或模块没有副作用,可以安全地移除。

  • 默认为true,表示所有模块都有副作用,即不进行tree-shaking优化。
  • 如果设置为false,表示所有模块都没有副作用,可以进行tree-shaking优化。
  • 如果设置为数组,表示数组中的模块有副作用,其他文件可以进行tree-shaking优化。如["site/*", "*.vue", "*.md", "dist/*", "*.css"]

pnpm

指定pnpm的配置,有兴趣可前往查看更多:pnpm.io/zh/package_…

{
  "pnpm": {
    // 强制依赖树中的指定包使用特定版本,无视其他包/项目的版本要求
    "overrides": {
      "react": "18.0.0"
    },
    // 避免和其他包同时使用了相同的依赖时,依赖版本冲突的问题
    "peerDependencyRules": {
      // 忽略缺失的 peerDependencies
      "ignoreMissing": ["vite", "react"],
      // 如果引用该包的项目安装的依赖版本与该包指定的版本不一致,则抛出错误
      "allowedVersions": {
        "react": "18.0.0"
      },
      // 忽略指定列表中包的 peerDependencies 不匹配问题
      "allowAny": ["@babel/*", "eslint"]
    },
    // 使用补丁修复依赖问题,如某个依赖的某个版本存在bug,可以通过补丁文件修复
    "patchedDependencies": {
      "react@18.0.0": "patch/react-18.0.0.patch"
    }
  }
}

web-types

用于增强 IDE 智能提示和补全能力的字段,为开发提供更好的代码提示,减少阅读文档的时间,提升开发效率。可以通过工具生成web-types.json文件,然后将其添加到package.json中。有兴趣可前去了解 github.com/JetBrains/w…

// web-types.json案例
{
  "framework": "vue",
  "name": "my-vue-library",
  "version": "1.0.0",
  "components": [
    {
      "name": "MyButton",
      "description": "A customizable button component.",
      "props": [
        {
          "name": "type",
          "type": "string",
          "default": "primary",
          "description": "The button type."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "description": "Disables the button."
        }
      ],
      "events": [
        {
          "name": "click",
          "description": "Fires when the button is clicked."
        }
      ]
    }
  ],
  "directives": [
    {
      "name": "v-focus",
      "description": "A directive to focus an element."
    }
  ]
}

全文完,觉得有用的话记得点个赞哦~