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.
基本字段
name
和 version
必须能组合成一个完全唯一的标识符。如果包产生了更新,那么 version
字段必须同时更新,用于产生一个新的唯一的 name-version 标识符。
如果没有打算发布你的包,那么 name
和 version
字段是可选择的。name
包的名称,简称包名。名称(包含scope)必须少于 214 个字符,且不能包含空格,只能包含小写字母、连字符(-)或下划线(_)。
如果将包发布到 NPM,则 name 属性是必需的且必须是唯一的,所以名称前可添加一个 scope。
"name": "abcname"
"name": "@chrayo/abcname" // 带scope
version
- 主版本号:第一个数字,表示具有重大更改
- 次版本号:第二个数字,表示引入向后兼容的更改的版本
- 补丁版本号:第三个数字,表示仅修复缺陷的版本是补丁版本
信息类
信息类字段可以看做是包的基本概述,并且这些字段往往被引用到其他地方展示。
- 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.1http://...
: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
指包的许可证,让别人知道使用该包是否有许可限制。这是非常重要但经常被忽略的属性。
private
该字段设为
true
时,用来防止包被意外发布到NPM,特别是设置了publishConfig的情况下。publishConfig
发布使用的配置。
其他
除此上述内容之外,还可能会针对特定场景使用一些字段,比如Babel, Prettier 等,这些对应的字段通常会在搭配他们使用的工具的文档上有写,这里就不一一列举了。
不过,建议把这些其他配置独立出去,便于维护。
参考资料:
- package.json 指南 ——官方文档的中文版