目录
1. package.json 是什么
package.json 是一个 JSON 文件,位于项目的 根目录 中
package.json 包含关于项目的以下数据:
- 元数据(如项目名称和说明)
- 功能元数据(如程序包版本号、程序所需的依赖项列表等,在 3 中会详细描述)
package.json 使 npm(yarn)可以启动项目、运行脚本、安装依赖项、发布到 NPM 注册表以及许多其他有用的任务(package.json 配置了如何与程序进行交互,如何运行程序的方法)
npm(yarn)通过 package.json 来识别项目,并处理项目的依赖关系;npm(yarn)可以在项目的整个生命周期内,生成和更新 package.json
2. package.json 配置项说明
name
作用:定义了 包的名称、项目/模块名称
格式:name 不能超过 214 个字符;只能包含小写字母、下划线、连接线;并且必须是 URL安全的(不能以 "." (点) 或者 "_" (下划线) 开头)
备注:如果软件包需要发布到 NPM,则 name 属性 必需设置 且 保证全网唯一性(因为发布到 NPM 注册表时,软件包以这个变量作为名称);如果软件包不需要发布到 NPM,则 name 无需保持全网唯一性
version
作用:规定了 软件包的当前版本
备注:软件包发布于 NPM 之前,它的 version 是必填的;新版本的软件包发布到 NPM 之前,版本号会增加;
author
作用:项目开发者,必须是在 npm 的有效账户名
格式:遵循 “账户名<邮件>(url)” 的规则,email 和 url 是可选的
举个栗子:
lyrelion lyrelion@163.com
"author": {
"name" : "lyrelion",
"email" : "lyrelion@163.com",
"url" : "http://lyrelion.cn.com/"
}
"author": "lyrelion <lyrelion@163.com> (http://lyrelion.cn.com)"
contributors
作用:项目贡献者
备注:contributors 与 author 字段的功能类似,他们的区别在于:author 只有一个人,contributors 则可以有多个人
举个栗子:
"contributors": [
{
"name" : "lyrelion",
"email" : "lyrelion@163.com",
"url" : "http://lyrelion.cn.com/"
},
{
"name" : "lyrelion2333",
"email" : "lyrelion2333@163.com",
"url" : "http://lyrelion2333.cn.com/"
}
]
description
作用:描述(一个字符串),是软件包的简短摘要
备注:开发者在使用 npm search 时,可以通过 description 找到这个包
keywords
作用:关键字(一个字符串数组),作用与描述相似
备注:开发者在使用 npm search 时,可以通过 keywords 任一字符串 找到这个包;如果软件包不需要不发布到 NPM,则 keywords 用处不大,可以忽略
private
作用:规定了 是否私有,private 设置为 true 时,npm 拒绝发布,这是也是一个防止意外发布 私有库 的方式;
备注:如果软件包只发布在 内部 registry,则需要在 publishConfighash 中,重写 registry;registry 翻译:登记处;
举个栗子:
"publishConfig": {
"registry": "http://233.233.0.233:8081/repository/npm-vue-components/"
},
license
作用:规定了 软件包授权条款,定义了代码许可证;许可证可能会限制某些开发人员或组织对当前软件包的使用
格式:license 字段的值,通常是许可证的标识符代码(例如 MIT
或 ISC
之类的字符串,它们代表 MIT 许可证和 ISC 许可证);如果你不想提供许可证,则可以将 UNLICENSED
作为许可证
scripts
作用:定义了一些 npm 命令的简写,通过这些 npm 命令,可以运行脚本
备注:官方规定,"start" 指定了运行 "npm run start" t时,所要执行的命令
举个栗子:假设我这么写:"npm run start": "vite start"(或者 "start": "vite start"),那就意味着,我在执行 "npm run start" 命令时,就相当于执行 "vite start" 命令
dependencies
作用:定义了 生产环境下,项目运行所需依赖;dependencies 字段是一个对象(包名做为键,版本范围作为值);npm 通过 dependencies 字段,知道要安装哪些包(以及什么版本)
备注:
- 使用 npm 安装依赖时,依赖会被下载到 node_modules/ 文件夹中,依赖名和版本号会被添加到 dependencies 字段内
- 在依赖版本中看到的插入符号(
^
)和波浪号(~
),是 SemVer 中规定的 版本范围 的表示法
devDependencies
作用:定义了 开发环境下,项目所需依赖;
举个栗子:在开发过程中使用 ESLint,也只在开发过程中用,一旦程序部署并投入生产,将不会再使用 ESLint
peerDependencies
作用:指定 插件 所需要的 主工具的版本
bin
作用:规定了 内部命令 对应的 可执行文件的 路径
举个栗子:
- 假设有一个内部命令,他叫 someTool,someTool 命令对应的可执行文件为 bin 目录下的 someTool.js;
- Npm 会寻找这个文件,在 node_modules/.bin/ 目录下建立符号链接;也就是说,someTool.js 会建立符号链接 node_modules/.bin/someTool;
- 由于 node_modules/.bin/ 目录,会在运行时 加入系统的 PATH 变量,因此在运行 npm 时,就可以不带路径,直接通过命令来调用这些脚本;
// 此处的 bin,规定了 内部命令someTool 对应的 可执行文件的路径是./bin/someTool.js
"bin": {
"someTool": "./bin/someTool.js"
}
// 下面规定了 执行 npm run start 时,调用 内部命令 someTool
"scripts": {
"start": 'someTool build'
}
// 如果不定义 bin,那么上面的 scripts 字段就需要写完整,如下所示
"scripts": {
"start": './node_modules/bin/someTool.js build'
}
main
作用:入口文件,项目默认执行文件
举个栗子:
- require(‘webpack’);会加载 lib 目录下的 webpack.js 文件;
- 如果没有设置入口文件,则默认加载 项目根目录下的 index.js 文件
module
作用:规定了 以 ES Module (也就是 ES6) 模块化方案进行加载时的 入口文件
备注:
- 早期没有 ES6 模块化方案时,一般遵循 CommonJS 规范;CommonJS 规范的包通过 main 字段指定入口文件
- 后来出现了 ES6 模块化方案(效率更高),为了和 CommonJS 规范进行区分,就新增了 module 字段指定入口文件
- 现在一般会优先使用 module 字段作为入口,没有 module 字段时才使用 main 字段作为入口
files
作用:定义了 被项目包含的文件名数组(包含文件夹中的文件,除非被其他配置忽略)
举个栗子:比如 .npmignore文件,它如果硬要忽略某个文件,那么 files 里写了这个文件名也没用,最终这个文件会被忽略;也就是说 .npmignore文件配置的优先级 高于 files
repository
作用:定义了 项目仓库地址(源代码所在的 url )及其使用的版本控制系统的类型(Git、SVN 等)
举个栗子:
"repository" : {
"type" : "git",
"url" : "http://github.com/isaacs/npm.git"
}
bugs
作用:定义了 bug 提交地址
举个栗子:
"bugs": {
"url" : "http://github.com/owner/project/issues" ,
"email" : "project@hostname.com"
}
gitHooks
作用:定义了 Git 提交之前,要做的代码质量检查
举个栗子:
"gitHooks": {
"pre-commit": "lint-staged"
}
lint-staged
作用:定义了 要做的代码检查
举个栗子:
"lint-staged": {
"*.{js,ts,vue}": "eslint --fix",
"*.{scss}": "prettier --write"
}
engines
作用:规定了 项目所需要的 Node.js / yarn / npm 版本
举个栗子:
"engines": {
"node": ">=8.9.1",
"npm": ">=5.5.1",
"yarn": ">=1.3.2"
}
browserslist
作用:规定了 项目所支持的浏览器
举个栗子:
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
homepage
作用:规定了 项目的官网地址(URL)
3. package.json 内依赖的版本号
3.1 版本号的含义
npm 模块 完整的版本号为【主版本 . 次要版本 . 补丁版本】
如果模块有变动,通常按照以下规则,更新版本号
- 修复 bug,需要更新补丁版本
- 新增功能,但是向下兼容,需要更新次要版本
- 大变动,向下不兼容,需要更新主版本
3.2 版本范围
指定版本
比如 1.2.2,安装时只安装指定版本(遵循 “主版本.次要版本.补丁版本” 的格式规定)
波浪号(tilde)+ 指定版本
比如 ~1.2.2,表示安装 1.2.x 的最新版本(不低于1.2.2),但是不安装 1.3.x,也就是说,安装时 不改变 大版本号 和 次要版本号
插入号(caret)+ 指定版本
比如 ˆ1.2.2,表示安装 1.x.x 的最新版本(不低于1.2.2),但是不安装 2.x.x,也就是说,安装时不改变大版本号
latest
安装最新版本
注意:如果大版本号为 0,则插入号的行为与波浪号相同(只更新补丁,不更新次要版本),这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容
3.3 修改版本号的正确姿势
项目开发过程中,最好使用 npm 的命令 npm install
,npm uninstall
和 npm update
来管理依赖项,这样可以使你的 package.json 和 node_modules/ 文件夹保持同步