参考链接:阮一峰
1. 概述
每个项目的根目录下面,一般都会有一个package.json文件,它定义了这个项目所需要的各种模块,以及项目的配置信息,(比如名称,版本,许可证等元数据).
npm install 这个命令会根据这个文件的配置,自动下载所需要的模块,也就是配置项目所需的运行和开发环境.
下面是一个简单的package.json文件,只定义了两项元数据: 项目名称和项目版本
{
"name": "cc",
"version": "1.0.0",
}
上面的代码说明,package.json文件内部就是一个JSON对象,该对象的每一个成员就是当前项目的一项配置.比如name就是项目名称,version就是项目版本(遵循"大版本"."次要版本"."小版本"的格式)
下面是一个更完整的package.json文件
{
"name": "cc",
"version": "1.0.0",
"author":"Kuroky",
"description": "祈粼",
"keywords": ["node.js","javascript"],
"repository": {
"type": "git",
"url": "https://xxxxxxx"
},
"engines": {"node":"0.10.x"},
"bugs": {"url": "xxxxx","email": "xxxx@xx.com"},
"contributors": [{"name": "祈粼","email": "cc@cc.com"}],
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"license": "ISC",
"dependencies": {
"express":"latest",
"mongoose":"~3.8.3"
},
"devDependencies": {
"bower":"~1.2.8"
}
}
下面详细解释下package.json中各个字段
2. scripts字段
scripts 指定了运行脚本的命令行缩写,比如start指定了运行npm run start时,所要执行的命令.
下面的设置指定了npm run preinstall, npm run start , npm run test时,所要执行的命令.
"scripts": {
"perinstall":"echo here it comes!",
"postinstall":"echo there it goes",
"start": "node index.js",
"test":"tap test/*.js"
}
3. dependencies字段,devDependencies字段
dependencies 字段指定了项目运行所依赖的模块,devDependencies字段 指定了项目开发所需要的模块
"dependencies": {
"express":"latest",
"mongoose":"~3.8.3"
},
"devDependencies": {
"bower":"^1.2.8"
}
它们都指向一个对象.该对象的各个成员,分别由模块名和对应版本要求来组成,表示依赖的模块及其版本范围
指定版本: 比如1.2.3, 遵循"大版本"."次要版本"."小版本"的格式,安装时只安装指定版本
波浪号: (tilde) + 指定版本: 比如 ~1.2.3, 表示安装1.2.x的最新版本(不低于1.2.3), 但是不安装1.3.x, 也就是说安装时不改变大版本号和次要版本号.
插入号: (caret) + 指定版本: 比如^1.2.3, 表示安装1.x.x的最新版本 (不低于1.2.3), 但是不安装2.x.x, 也就是说安装时改变大版本号.需要注意的是,如果大版本号为0, 则插入号和波浪号的行为相同, 这是因为此时处于开发阶段, 即使是次要版本号变动, 也可能带来程序的不兼容.
latest: 安装最新版本
package,json可以手工编写,也可以使用npm init 命令自动生成
npm init
这个命令采用互动方式, 要求用户回答一些问题, 然后在当前目录生成一个基本的package.json文件.所有的问题中, 只有项目名称(name)和项目版本(version)是必须填的, 其他的都是选填的.
有了package.json, 直接使用命令 npm install, 就会在当前目录中安装所需要的模块.
npm install
如果一个模块不在package.json中, 可以单独安装这个模块
npm install module_name --save
npm install module_name --save-dev
需要了解下 npm i -D -S -g 这些是什么
npm install module_name -S 即 npm install module_name --save 写入dependencies
npm install module_name -D 即 npm install module_name --save-dev 写入devDependencies
npm install module_name -g 全局安装(命令行使用)
npm install module_name 本地安装(将安装包放在 ./node_modules 下)
4. 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字段, 就是用来提供插件指定其所需要的主工具版本
例如 ant-design
"peerDependencies": {
"react": ">=16.0.0",
"react-dom": ">=16.0.0"
}
这个表明使用ant-design 中的react建议大于等于16.0.0版本
注意, 从npm3.0版开始, peerDependencies 不会再默认安装了
5. bin字段
bin用来指定各个内部命令对应的可执行文件位置
"bin": {
"someTool": "./bin/someTool.js"
}
上面的代码指定, someTool 命令对应的可执行文件为bin子目录下的someTool.js.
npm会寻找这个文件, 在node_modules/.bin/目录下建立符号链接.
在上面的例子中就是someTool.js会建立符号链接 node_modules/.bin/someTool.
由于node_modules/.bin/目录会在运行的时候加入系统的PATH变量, 因此运行npm时就可以不带路径,直接通过命令来调用这些脚本.
因此,像下面这样的写法可以采用简写.
scripts: {
start: './node_modules/bin/someTool.js build'
}
// 简写为
scripts: {
start: 'someTool build'
}
所有node_modules/.bin/目录下的命令,都可以用npm run [命令]的格式运行。在命令行下,键入npm run,然后按tab键,就会显示所有可以使用的命令。
6. main字段
main字段指定了加载的入口文件,require('moduleName')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js。
7. config字段
config字段用于添加命令行的环境变量。
下面是一个package.json文件。
{
"name" : "foo",
"config" : { "port" : "8080" },
"scripts" : { "start" : "node server.js" }
}
然后,在server.js脚本就可以引用config字段的值。
http
.createServer(...)
.listen(process.env.npm_package_config_port)
用户执行npm run start命令时,这个脚本就可以得到值。
$ npm run start
用户可以改变这个值。
$ npm config set foo:port 80
其他
browser字段
browser指定该模板供浏览器使用的版本。Browserify这样的浏览器打包工具,通过它就知道该打包那个文件。
"browser": {
"tipso": "./node_modules/tipso/src/tipso.js"
},
engines 字段
engines字段指明了该模块运行的平台,比如 Node 的某个版本或者浏览器。
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
该字段也可以指定适用的npm版本。
{ "engines" : { "npm" : "~1.0.20" } }
man字段
man用来指定当前模块的man文档的位置。
"man" :[ "./doc/calc.1" ]
preferGlobal字段
preferGlobal的值是布尔值,表示当用户不将该模块安装为全局模块时(即不用–global参数),要不要显示警告,表示该模块的本意就是安装为全局模块。
style字段
style指定供浏览器使用时,样式文件所在的位置。样式文件打包工具parcelify,通过它知道样式文件的打包位置。
"style": [
"./node_modules/tipso/src/tipso.css"
]
网友评论