认识package.json
2021-04-10 本文已影响0人
小杰66
每个项目根目录下都有一个 package.json
文件,其定义了运行项目所需要的各种依赖和项目的配置信息。可以使用 npm init -y
命令在项目目录下生成一个 package.json
文件。
必备属性(name & version)
-
package.json
中有非常多的配置项,其中必须填写的两个字段分别是name
字段和version
字段,它们是组成一个npm
模块的唯一标识。
name 字段
-
name
字段定义了模块的名称,其命名时需要遵循官方的一些规范和建议:- 模块名会成为模块
url
、命令行中的一个参数或者一个文件夹名称,任何非url
安全的字符在模块名中都不能使用(我们可以使用validate-npm-package-name
包来检测模块名是否合法); - 语义化模块名,可以帮助开发者更快的找到需要的模块,并且避免意外获取错误的模块;
- 若模块名称中存在一些符号,将符号去除后不得与现有的模块名重复,例如:由于
react-router-dom
已经存在,react.router.dom
、reactrouterdom
都不可以再创建。
- 模块名会成为模块
-
name
字段不能与其他模块名重复,我们可以执行npm view <packageName>
命令查看模块名是否已经被使用。 - 或者,我们也可以去
npm
上输入模块名,如果搜不到,则可以使用该模块名。
version 字段
-
npm
包中的模块版本都需要遵循SemVer
规范,该规范的标准版本号采用X.Y.Z
的格式,其中X
、Y
和Z
均为非负的整数,且禁止在数字前方补零:-
X
是主版本号(major):修改了不兼容的 API -
Y
是次版本号(minor):新增了向下兼容的功能 -
Z
为修订号(patch):修正了向下兼容的问题
-
- 当某个版本改动比较大、并非稳定而且可能无法满足预期的兼容性需求时,我们可能要先发布一个先行版本。
- 先行版本号可以加到
主版本号.次版本号.修订号
的后面,通过-
号连接一连串以句点分隔的标识符和版本编译信息:- 内部版本(alpha)
- 公测版本(beta)
- 正式版本的候选版本rc(即 Release candiate)
- 我们可以执行以下命令查看模块的版本:
npm view <packageName> version # 查看某个模块的最新版本
npm view <packageName> versions # 查看某个模块的所有历史版本
描述信息(description & keywords)
-
description
字段用于添加模块的描述信息,便于用户了解该模块。 -
keywords
字段用于给模块添加关键字。 - 当我们使用
npm
检索模块时,会对模块中的description
字段和keywords
字段进行匹配,写好package.json
中的description
和keywords
将有利于增加我们模块的曝光率。
安装项目依赖(dependencies & devDependencies)
-
dependencies
字段指定了项目运行所依赖的模块(生产环境使用),如antd
、react
、moment
等插件库:- 它们是我们生产环境所需要的依赖项,在把项目作为一个
npm
包的时候,用户安装npm
包时只会安装dependencies
里面的依赖。
- 它们是我们生产环境所需要的依赖项,在把项目作为一个
-
devDependencies
字段指定了项目开发所需要的模块(开发环境使用),如webpack
、typescript
、babel
等:- 在代码打包提交线上时,我们并不需要这些工具,所以我们将它放入
devDependencies
中。
- 在代码打包提交线上时,我们并不需要这些工具,所以我们将它放入
- 如果一个模块不在
package.json
文件之中,我们可以单独安装这个模块,并使用相应的参数,将其写入dependencies
字段/devDependencies
字段中:
# 使用 npm
npm install <package...> --save # 写入 dependencies 属性
npm install <package...> --save-dev # 写入 devDependencies 属性
# 使用 yarn
yarn add <package...> # 写入 dependencies 属性
yarn add <package...> --dev # 写入 devDependencies 属性
- 有了
package.json
文件,开发直接使用npm install
命令,就会在当前目录中自动安装所需要的模块,安装完成项目所需的运行和开发环境就配置好了。
简化终端命令(scripts)
-
scripts
字段是package.json
中的一种元数据功能,它接受一个对象,对象的属性为可以通过npm run
运行的脚本,值为实际运行的命令(通常是终端命令),如:
"scripts": {
"start": "node index.js"
},
- 将终端命令放入
scripts
字段,既可以记录它们又可以实现轻松重用。
定义项目入口(main)
-
main
字段是package.json
中的另一种元数据功能,它可以用来指定加载的入口文件。假如你的项目是一个npm
包,当用户安装你的包后,require('my-module')
返回的是main
字段中所列出文件的module.exports
属性。 - 当不指定
main
字段时,默认值是模块根目录下面的index.js
文件。
发布文件配置(files)
-
files
字段用于描述我们使用npm publish
命令后推送到npm
服务器的文件列表,如果指定文件夹,则文件夹内的所有内容都会包含进来。 - 我们可以查看下载的
antd
的package.json
的files
字段,内容如下:
"files": [
"dist",
"lib",
"es"
],
- 另外,我们还可以通过配置一个
.npmignore
文件来排除一些文件, 防止大量的垃圾文件推送到npm
上。
定义私有模块(private)
- 一般公司的非开源项目,都会设置
private
属性的值为true
,这是因为npm
拒绝发布私有模块,通过设置该字段可以防止私有模块被无意间发布出去。
指定模块适用系统(os)
- 假如我们开发了一个模块,只能跑在
darwin
系统下,我们需要保证windows
用户不会安装到该模块,从而避免发生不必要的错误。 - 这时候,使用
os
属性则可以帮助我们实现以上的需求,该属性可以指定模块适用系统的系统,或者指定不能安装的系统黑名单(当在系统黑名单中的系统中安装模块则会报错):
"os" : [ "darwin", "linux" ] # 适用系统
"os" : [ "!win32" ] # 黑名单
Tips:在
node
环境下可以使用process.platform
来判断操作系统。
指定模块适用 cpu 架构(cpu)
- 和上面的
os
字段类似,我们可以用cpu
字段更精准的限制用户安装环境:
"cpu" : [ "x64", "ia32" ] # 适用 cpu
"cpu" : [ "!arm", "!mips" ] # 黑名单
Tips:在
node
环境下可以使用process.arch
来判断cpu
架构。
指定项目 node 版本(engines)
-
engines
字段可以指定适用的 node 版本:
"engines": {
"node": ">= 8.16.0"
},
- 该字段也可以指定适用的
npm
版本:
"engines": {
"npm": ">= 6.9.0"
},
- 需要注意的是,engines属性仅起到一个说明的作用,当用户版本不符合指定值时也不影响依赖的安装。