在日常开发工作中,相信大家对于 package.json 并不陌生,但对于 package.json的各属性的含义,是否都详细了解呢?如果对于它了如指掌了,那么可忽略本文。对于尚不太熟悉的人,请继续阅读。
对于应用程序,package.json 文件中的内容没有固定的要求。 唯一的要求是必须遵守 JSON 格式,否则,尝试以编程的方式访问其属性的程序则无法读取它。
它必须是实际的JSON,而不仅仅是JavaScript对象文字。
实例
选取了一个典型的package.json实例,vue仓库的package.json:
1 | { |
主要属性简介
name ✨
设置 npm包或者工程项目的名称。
一些规则:
- 名称必须少于214个字符,且不能包含空格,只能包含小写字母、连字符(-)或下划线(_)。
- 新包的名称不能有大写字母
- 名称最终成为URL的一部分、命令行上的参数和文件夹名称。因此,名称不能包含任何非url安全字符。
一些tips:
- 不要使用与 Node 核心模块相同的名称
- 不要在名称中加入 js 或 node。
- 名称可能作为参数传递给 require(), 因此它应该简短,但也具有合理的描述性。
1 | { |
author
npm包或者工程项目的作者
contributors
除作者外,该项目可以有一个或多个贡献者。此属性为数组结构。
version ✨
指定 npm包或者工程项目的当前版本。
该属性遵循版本的语义版本控制记法,意味着该版本始终以3个数字表示: x.x.x
Version 必须能够被 node-semver 解析。具体规范参考semver。
1 | { |
description ✨
对 npm包或者工程项目的简短描述。
它将被展示在 npm search, 这有助于开发者发现你的 package。
1 | { |
keywords ✨
设置关键字,它是一个字符串数组。
它将被列出在 npm search,这有助于开发者发现你的 package。
1 | { |
homepage
设置 npm包或者工程项目的主页,通常指向项目的readme。
1 | { |
bugs
项目的问题跟踪的 url 或应该报告问题的电子邮件地址。
这些对遇到您的软件包问题的人很有帮助。最常见的和上面的 vue 的类似,指向项目的 issues。
1 | { |
licence ✨
指定软件的许可证。
1 | { |
最流行的六开源许可证: GPL、BSD、MIT、Mozilla、Apache和 LGPL。
具体区分参考如何选择开源许可证?
funding
可以指定一个对象,其中包含一个URL,该URL提供有关帮助您的 package 开发的资金的最新信息(比较少看到😂),可以是一个字符串URL,也可以为数组。
1 | "funding": { |
files
可选的 files 字段为一个文件模式数组,描述当你的 package 作为依赖被安装时要包含的选项。
1 | "files": [ |
文件模式遵循与 .gitignore相近的语法,但是表达的意义想法,它是指包含一个文件、目录或者 glob模式。
省略该字段,将使其默认为 [“*”],意味着它将包含所有文件。
您还可以在包的根目录或子目录中提供.npmignore文件,它将防止包含文件。在包的根目录下,它不会覆盖“files”字段,但在子目录中会覆盖。npmignore文件就像.gitignore一样工作。如果有一个.gitignore文件,并且丢失了.npmignore,那么.gitignore的内容将被使用。
包含在 “package.json#file” 中的文件,不能通过.npmignore或.gitignore排除。
main
设置 package 的入口。
当在应用程序中导入此 package 时,应用程序会在该位置搜索模块的导出。
1 | { |
browserslist
如果你的 package 用于浏览器端,该字段用于说明,你的 package 支持的浏览器及其版本
1 | { |
scripts ✨
scripts 指定了运行脚本命令的 npm 命令行的缩写。
1 | { |
bin
bin项用来指定各个内部命令对应的可执行文件的位置。
1 | { |
上面代码指定,someTool 命令对应的可执行文件为 bin 子目录下的 someTool.js。Npm会寻找这个文件,在node_modules/.bin/目录下建立符号链接。在上面的例子中,someTool.js会建立符号链接node_modules/.bin/someTool。由于node_modules/.bin/目录会在运行时加入系统的PATH变量,因此在运行npm时,就可以不带路径,直接通过命令来调用这些脚本。
因此,像下面这样的写法可以采用简写。
1 | { |
所有node_modules/.bin/目录下的命令,都可以用npm run [命令]的格式运行。在命令行下,键入npm run,然后按tab键,就会显示所有可以使用的命令。
config
config 对象可以用来设置 package 脚本中使用的配置参数。
比如,一个 package 有如下配置:
1 | { |
然后,在 server.js 脚本中可引用 config字段的值:
1 | http |
然用户可通过执行 npm config set foo:port 8001 来覆盖。
dependencies
dependencies 字段指定了项目运行依赖的模块。
该对象的各个成员分别有模块名和对应的版本组成,表示依赖模块及其版本范围。版本范围遵循semver
1 | { |
请不要在依赖对象中放置测试用例或者转译器。
devDependencies
devDependencies 字段指定了项目开发所需要的模块。
该对象的各个成员分别有模块名和对应的版本组成,表示依赖模块及其版本范围。版本范围遵循semver
peerDependencies
该字段用来供插件指定去所需要的主工具的版本。
peerDependencies的目的是提示宿主环境去安装满足插件peerDependencies所指定依赖的包,然后在插件import或者require所依赖的包的时候,永远都是引用宿主环境统一安装的npm包,最终解决插件与所依赖包不一致的问题。
举例,我们使用 element-ui, element-ui的 package.json中有如下配置:
1 | { |
它要求宿主环境安装指定版本的 vue 版本。
private
如果设置为 true,则可以防止应用程序/软件包被意外发布到 npm 上。
engines
设置此 package 或 项目要运行的 Node.js 或其他命令的版本。
1 | { |
结语
本片文章介绍了日常使用中使用频率较高的属性描述,如需查看全部属性,可查阅package.json
参考