你真的了解package.json吗?来看看吧,这可能是最全的package解析
企业常说需要有项目经验的人,那经验仅仅只是代码和功能模块开发的经验吗,深入理解package.json文件也能让别人对你刮目相看哟,以下将一一分析每个字段的真实含义。
在我们搭建的每一个项目的根目录下一般默认都会有一个package.json文件,它定义了当前项目所需要的各种模块以及依赖文件同时也包含了项目的配置信息例如名称、版本、许可证等等。
当我们拿到一个项目运行命令npm install的时候,会根据package.json文件中的配置自动下载所需的模块,生成node_modules(用来存放用包管理工具下载安装的包的文件夹)
一、package.json是什么?
package.json文件是一个JSON对象,从后缀名.json就可以看出,该对象的每一个成员就是当前项目的一项设置,比如name就是项目名称,version是项目版本号。
{
"name": "vue-project",
"version": "0.1.0",
}
以上代码就是定义了项目名称以及版本号
Package.json就是一个对象,对象中包含了多项属性,在企业项目中我们关注较多的devDependencies 和 dependencies字段也就是项目运行运行和开发环境所依赖的模块
那其它的字段又表示什么?有什么重要的意义?
二、配置字段详细剖析
1、name
package.json文件中最重要的就是name和version字段,这两项是必填的。名称和版本一起构成一个标识符,该标识符被认为是完全唯一的。对包的更改应该与对版本的更改一起进行。
name必须是字符串,不能以.或_开头,不能有大写字母,因为名称最终成为URL的一部分因此不能包含任何非URL安全字符。 npm官方建议我们不要使用与核心节点模块相同的名称。不要在名称中加js或node。如果需要可以使用engines来指定运行环境。
该名称会作为参数传递给require,因此它应该是简短的,但也需要具有合理的描述性。
2、version
Version项目版本号, x.x.x的格式, 符合语义化版本规则(遵循“大版本.次要版本.小版本”的格式规定),在项目每次发布时需提交新的且唯一版本号
3、description
项目描述信息,description是字符串,便于用户在npm上搜索到我们的项目。
"description": "vue-elementui",
4、keywords
keywords是一个字符串组成的数组,便于用户在npm上搜索到我们的项目
"keywords":["node.js","vue", "element"],
5、homepage
homepage项目的主页地址。
"homepage": "https://github.com/owner"
6、bugs
项目问题反馈的Url或报告问题的邮箱地址。
"bugs":{"url":"https://github.com/owner","email":"xufang_2016@163.com"},
若只设置url,则bugs可用字符串来代替对象。
"bugs":"https://github.com/owner",
7、license
项目许可证,让使用者知道如何使用此项目,有何权限来使用我们的模块,以及使用该模块有限制等
"license" : "BSD-3-Clause"
8、author,contributors
Author表示一个person对象
Contributors表示person的数组,相当于一群person
包含了作者及贡献者(我们的模块开发者以及众多贡献者)
一个对象中包含name、url和email
"author": {
"name": "fangfang",
"email": "xufang_2016@163.com",
"url": " http://www.itiedu.cn"
}
"contributors":[{"name":" fangfang","email":" xufang_2016@163.com ","url": " http://www.itiedu.cn }]
9、files
files是一个文件数组,描述了将软件包作为依赖项安装时要包括的条目。如果在数组里面声明了一个文件夹,那也会包含文件夹中的文件。某些特殊文件和目录也被包括或排除在外,无论它们是否存在于文件数组中。
简而言之,下载依赖包所包含的文件
10、main
主文件,也是项目的入口文件,默认值是项目根目录下的index.js。
"main": "./index.js",
11、browser
如果要在客户端使用模块,则应使用browser字段来代替main字段。
12、bin
bin用来指定各个内部命令对应的可执行文件的位置。
"bin": {
"mybuild": "./bin/mybuild.js"
}
上面代码指定,mybuild命令对应的可执行文件为 bin 子目录下的 mybuild.js。当本地安装myapp时,Npm会寻找这个文件,在./node_modules/.bin/
目录下建立符号链接(快捷方式)。在上面的例子中,mybuild.js会建立符号链接./node_modules/.bin/mybuild。
./node_modules/.bin/`目录会在运行时加入系统的PATH变量,因此在运行npm时,就可以不带路径,直接通过命令来调用这些脚本。
npx mybuild
所有node_modules/.bin/
目录下的命令,都可以用npm run [命令]
或npx [命令]
的格式运行。bin中引用的文件需以#!/usr/bin/envnode
开头
13、man
用来指定当前模块的man文档的位置
"man" :[ "./doc/doc.1" ]
14、directories
用来标识模块结构的方法,类似于commonjs包规范的介绍,想查看npm中的package.json,就可以看到doc、lib、man目录及位置
15、repository
代码存放的地址
"repository": {
"type" : "git",
"url" : "https://github.com/npm/XXX.git"
}
16、scripts
scripts指定了运行脚本命令的npm命令行缩写
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
比如serve指定了项目运行命令npm run serve
npm run build表示项目打包
17、config
用于添加命令行的环境变量
"config":{
"name" : "fang",
"config" : { "port" : "8080" },
"scripts" : { "serve": "vue-cli-service serve"}
},
可以通过输入命令npm config set来修改值
npm config set fang:port 8088
18、devDependencies 和 dependencies
dependencies,依赖的意思,这些安装包都是程序所依赖的包,需要发布到生产环境的.
dev即develop,开发的意思,也就是开发环境下的依赖。
--save参数表示将该模块写入dependencies属性,--save-dev表示将该模块写入devDependencies属性
例如安装axios
安装到开发环境 npm axios --save-dev
安装到生产环境 npm axios --save
区别:
devDependencies中的插件只用于开发环境,不用于生产环境,而dependencies是要发布到生产环境
的。比如babel有关的转化es6到es5的依赖只是开发环境下转化用,生产过程中是用不到,所以只用写
在devDependencies中,而像vue或element-ui这种实际运行会调用,得写在dependencies中。
版本前可以加上各种限制,主要有以下几种:
指定版本:比如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,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为0,则插入号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。
latest:安装最新版本。
举例说明下:
>1.0.2 大于当前版本
>=1.0.2 大于等于当前版本
<1.0.2 小于当前版本
<=1.0.2小于等于当前版本
~1.0.2 不低于1.0.2,但不改变大版本号和次要版本号
^1.0.2 不低于1.0,2, 但不改变大版本号
1.2.x 表示1.2.3 ,1.2.4版本都支持
19、peerDependencies
当我们开发一个模块的时候,如果当前模块与所依赖的模块同时依赖一个第三方模块,并且依赖的是两个不兼容的版本时就会出现问题。
比如,你的项目依赖A模块和B模块的1.0版,而A模块本身又依赖B模块的2.0版。
大多数情况下,这不构成问题,B模块的两个版本可以并存,同时运行。但是,有一种情况,会出现问题,就是这种依赖关系将暴露给用户。
最典型的场景就是插件,比如A模块是B模块的插件。用户安装的B模块是1.0版本,但是A插件只能和2.0版本的B模块一起使用。这时,用户要是将1.0版本的B的实例传给A,就会出现问题。因此,需要一种机制,在模板安装的时候提醒用户,如果A和B一起安装,那么B必须是2.0模块。
peerDependencies字段,就是用来供插件指定其所需要的主工具的版本
从npm 3.0版开始,peerDependencies不再会默认安装了
20、bundledDependencies
bundledDependencies是一个数组,指定发布时将定义的模块一起打包
{
"name": "vue-project",
"version": "1.0.0",
"bundledDependencies": [
"elementui", "echarts"
]
}
21、optionaldependencies
如果出现包找不到或者安装失败时,但又不影响npm继续运行,可将该包放在optionalDependencies对象中。
"optionalDependencies": {
"echarts": "^4.9.0"
}
表示的是定义的模块如果安装失败,不会在输入npm install时失败
22、engines
engines
字段指明了该模块运行的平台,比如Node``的某个版本,
或者npm
的某个版本或者浏览器。
"engines": {"node" : ">=8.9.0 <12.x", "npm" : "~6.14.12" }
23、os
指定你的项目将运行在什么操作系统上
"os" : [ "win32", "darwin", "linux" ],
24、cup
指定你的项目将运行在什么cpu架构上
"cpu" : [ "x64", "ia32" ]
25、private
决定我们的项目是否会发布,如果设置为true,那么npm会拒绝发布
"private": true
26、publishConfig
模块发布时生效,设置一些值的集合
通常publishConfig
会配合private
来使用,如果你只想让模块被发布到一个特定的npm
仓库,如一个内部的仓库
"private": true,
"publishConfig": {
"tag": "1.0.0",
"registry": "https://registry.npmjs.org/",
"access": "public"
}
27、preferGlobal
表示在不安装为全局时给予显示警告
此文献给有需要的人,写的匆忙&个人能力有限,有错之处望见谅!共同进步