package.json指南

date
Sep 11, 2022
slug
dakadfkd
status
Published
tags
前端
summary
介绍JavaScript工程的项目配置文件package.json的常用字段
type
Post
package.json在本文指JavaScript项目的根目录中记录依赖关系、元数据等信息的文件,它包含名称、描述、版本,以及运行、开发以及一些其他方面信息。
下面根据字段用途对常见的字段简单归类,然后用背景颜色表示字段来源。
  • 红色背景:表示必填
  • 黄色背景:表示非官方字段。官方字段请查阅官方说明
This document is all you need to know about what's required in your package.json file. It must be actual JSON, not just a JavaScript object literal.
notion image

基本字段

💡
name 和 version 必须能组合成一个完全唯一的标识符。如果包产生了更新,那么 version 字段必须同时更新,用于产生一个新的唯一的 name-version 标识符。 如果没有打算发布你的包,那么 name 和 version 字段是可选择的。

name

包的名称,简称包名。名称(包含scope)必须少于 214 个字符,且不能包含空格,只能包含小写字母、连字符(-)或下划线(_)。
如果将包发布到 NPM,则 name 属性是必需的且必须是唯一的,所以名称前可添加一个 scope
"name": "abcname"
"name": "@chrayo/abcname"    // 带scope

version

包的当前版本。遵循版本的语义版本控制记法值必须可以被 node-semver 解析,这意味着版本始终以 3 个数字表示:x.x.x
  • 主版本号:第一个数字,表示具有重大更改
  • 次版本号:第二个数字,表示引入向后兼容的更改的版本
  • 补丁版本号:第三个数字,表示仅修复缺陷的版本是补丁版本

信息类

💡
信息类字段可以看做是包的基本概述,并且这些字段往往被引用到其他地方展示。
  • description 包的简短描述。会被显示在搜索包的时候,显示在列表里或者其他地方,让用户清楚的知道它是用来干嘛的。更具体的描述应该写在 README.md 文件里。
  • keywords 包的功能相关的关键字数组。
  • homepage 包的主页链接。
  • repository 包仓库所在的位置。可以显示指定服务商、版本控制系统、包所在的实际目录。 该字段的本意是指向可访问包版本控制的位置,而不仅仅是指向已发布的代码库。
  • bugs 包的问题追踪的页面 url 地址,或是可以发送 bug 信息的邮件地址。
  • author 包的作者信息,可以是字符串,也可以是字段分开的对象。
  • contributors 除作者外该项目的其他一个或多个贡献者,此属性是列出他们的数组,格式同author。
 

文件类

文件类字段可以看做是对包内在的一些描述,或实际情况说明。
  • files 包被安装为一个项目依赖时,被 files 字段指定的文件将会被包含。 1、文件匹配采用的语法类似于 .gitignore 文件。忽略该字段,等价于 ["*"],表示包含所有文件。 2、files.npmignore.gitignore 三者具有同样效果,共存时有较复杂的逻辑关系,所以往往使用.gitignore。 3、一些文件会永远被包含在包内,而一些文件会永远被排除在包外,无论怎么设置。
  • main 包的入口点。当在应用程序中导入此软件包时,应用程序会在该位置搜索模块的导出。它的值通常是项目根目录中的index.js文件,但也可以选择其他任何文件作为包的主入口。
  • browser 包被用于客户端程序时,指定 browser而不是 main字段,用于提示用户它或许依赖于一些基础的在nodejs 环境下没有的东西(比如 window)。
  • browserslist 用于告知要支持哪些浏览器(及其版本),Babel、Autoprefixer 和其他工具会用到它,以将所需的 polyfill 和 fallback 添加到目标浏览器。更多请看browserslist
  • typings/types TypeScript 解析文件的入口, 该文件会被发布到 NPM, 并且可以被下载,为用户提供更加好的 IDE 支持。

任务类

  • scripts 包里包含脚本命令。
  • config 被用来配置 scripts 的参数,如
{
    "config" : { 
			"port" : "8080"
		}
}
  • 配置工程 如限定只能使用yarn
{
	"script": {
		"preinstall": "npx only-allow yarn"
	}
}

依赖类

  • dependencies 包的第三方依赖,值为第三方包名 + 第三方包的版本号。可以使用URL代替版本号,也可以使用本地路径。版本号可以指定一个范围,有以下语法:
    • version:精确的版本,例如 1.0.0
    • >version:大于 version
    • >=version:大于等于
    • <version:小于
    • <=version:小于等于
    • ~version:允许补丁级别的变化,例如 ~1.2.3 表示 >=1.2.3 <1.3.0
    • ^version:允许不更改最左侧非0版本号数字的变化,例如 ^1.2.3 表示 >=1.2.3 <2.0.0
    • 1.2.x:允许任一补丁级别的版本均可,如1.2.0、1.2.1
    • http://...:http\https协议的URL形式依赖
    • git…、:git协议的URL形式依赖,支持设置用户名密码,更多请看这里
    • *””:任意版本均可以
    • version1 - version2:等同于 >=version1 <=version2
    • user/repo:GitHub独有的URL形式依赖
    • path/path/path:本地文件式依赖,如:"file:../foo/bar”,更多请看这里
  • devDependencies 与 dependencies字段类似,但是这里列出的包仅在开发期间需要,而在生产中不需要。
💡
yarn/npm install 时使用--production-prod参数,或者当NODE_ENV环境变量被设置为production,将不会安装package.json中的devDependencies
  • peerDependencies 其作用一是防止包重复安装,二是宿主项目去安装peerDependencies所指定依赖的包。即通过宿主项目来统一安装的npm包,最终解决插件与所依赖包不一致的问题。
  • optionalDependencies 用于设置一些项目中的可选包。未下载这些包不影响项目,但这些包却很有用。设置在该字段下后,对应的包只会在需要的时候被下载。
  • bundleDependencies 打包项目时需要被打进的包。又叫做bundledDependencies

平台类

  • engines 指定一些运行环境,例如node和npm,可以扩大到只能使用yarn。
  • os 指明操作系统类别。
  • cpu 指明 cpu 类型。

发布类

license

指包的许可证,让别人知道使用该包是否有许可限制。这是非常重要但经常被忽略的属性。
notion image

private

该字段设为true时,用来防止包被意外发布到NPM,特别是设置了publishConfig的情况下。

publishConfig

发布使用的配置。

其他

除此上述内容之外,还可能会针对特定场景使用一些字段,比如Babel, Prettier 等,这些对应的字段通常会在搭配他们使用的工具的文档上有写,这里就不一一列举了。
不过,建议把这些其他配置独立出去,便于维护。
 

参考资料:
 

© 刘德华 2020 - 2023