详谈一下package.json文件的各个字段
在日常的开发过程中,我们会发现项目结构里有一个package.json文件,可能我们比较熟知并且经常要翻看或者确认的就是dependencies、devDependencies这几个字段,但除了这几个我们比较熟知的之外,还有一些比较常用也常见的字段。
name
name字段的限制
1、name字段必须小于214字符
2、name字段不能包含有“.”符号和下划线
3、name字段不能包含有大写字母
4、name字段不能含有非URL安全的字符,因为它将当发布的时候,它将作为你的包的相关信息被写入到URL中。
以下是非URL安全字符
version
version定义的规则要求
version一般写为"x.y.z"
1、修复了bug,小改动,增加z
2、增加了新特性,但仍能向后兼容,增加y
3、有很大的改动,无法向后兼容,增加x
npm有自己的检验version的模块——node-semver
npm有自己的一套检验version正确性的模块,它叫做 node-semver,是一开始就跟随着npm一起被打包安装的。当然了,你也可以通过自己安装去在自己的项目中使用它。
使用的例子像这样:
先npm install --save semver
然后:
const semver = require('semver')
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
name字段和version字段可以说是构成package.json最重要也是最基本的两个字段了,共同构成了包的唯一标识
keywords和description
字段要求
description:字符串
keywords:字符串
这两个字段构是npm搜索系统中的搜索条件,简单来说也就是搜索时会按照这两个字段来进行匹配。同时,描述清楚这两个字段有利于帮助你开源你的包的时候能够解释清楚这个包的作用以及说明之类的。
license
这是你指定的项目的许可证,它告诉他人他们是否有权利使用你的包以及在使用你的包的时候他们应该受到什么样的限制。看下图
字段要求
单个license:直接写入名称
{"license":"BSD-3-Clause"}
多个license:在一对圆括号中写入license名称。且多个license内用AND等连接
{ "license" : "(ISC AND GPL-3.0)" }
author
表明包的作者,要求是一个字符串或者是一个对象
如果是一个对象,该对象必须包含三个属性:
- name属性(必填)
- email属性(选填)
- url属性(选填)
{ "name" : "Barney Rubble",
"email" : "b@rubble.com",
"url" : "http://barnyrubble.tumblr.com/"
}
main
定义项目的入口文件,简而言之就是别人安装了发布的模块之后,引入的就是你main字段定义的入口文件的输出。
main字段的默认值是根路径下的index.js
script
写进scripts的命令(command),可以通过npm run 或者npm 运行对应的shell指令,例如:{“scripts”: { “start”: “node main.js”} } 可以让你在终端输入npm start的时候,等同于运行了node main.js
什么时候要加"run",什么时候不加"run"?
run的原名是run-script,是一段脚本,而run是它的一个别名
- 当run[-script]被 test, start, restart, and stop这四个自带的命令所使用时,它可以被省略(或者说不需要加“run”就可以直接调用),所以我们平时最常输入的npm start实际上相当于npm run start,只不过是为了方便省略了run而已
- 当你在package.json的script字段中定义的是除了1中的4个命令外的命令的时候,你就不能省略“run”了
npm为script字段中的脚本路径都加上了node_moudles/.bin前缀
npm为script字段中的脚本路径都加上了node_moudles/.bin前缀,这意味着:你在试图运行本地安装的依赖在 node_modules/.bin 中的脚本的时候,可以省略node_modules/.bin这个前缀。例如:
我刚npm install webpack了,而在我的项目下的node_modules目录的.bin子目录下:
就多了一个叫做webpack的脚本
本来运行这个脚本的命令应该是:node_modules/.bin webpack
但由于npm已经自动帮我们加了node_modules/.bin前缀了,所以我们可以直接写成:
"scripts": {"start": "webpack"}
而不用写成
"scripts": {"start": "node_modules/.bin webpack"}
npm start是有默认值的,默认为:node server.js
dependencies和devDependencies
dependencies字段和devDependencies字段分别代表生产环境依赖和开发环境依赖
与两个字段相关的npm install的命令
npm install 模块 --save 安装好后写入package.json的dependencies中(生产环境依赖)
npm install 模块 --save-dev 安装好后写入package.json的devDepencies中(开发环境依赖)
怎么区分到底安装包的时候放在dependencies中还是devDepencies中呢?
很简单
1.一般你去github或者npm社区里面相关包的介绍后面都会带有–save 或者–save-dev 的参数的,这时候把命令直接复制过来运行就OK了,不用管那么多2.如果没有1中的介绍,那么请思考,这个包到底是纯粹为了开发方便使用呢?还是要放到上线后APP的代码中呢?前者则为devDepencies,后者则为dependencies