Node package.json项目概述和实例讲解
1 概述
每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。pm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
命令提示符执行npm install,则会根据package.json下载所有需要的包,npm install --production只下载dependencies节点的包
一个完整的package.json文件实例如下:
{ "name": "hello world", "version": "0.0.1", "author": "张三", "description": "第一个node.js程序", "keywords": ["node.js", "javascript"], "repository": { "type": "git", "url": "https://path/to/url" }, "license": "mit", "engines": { "node": "0.10.x" }, "bugs": { "url": "https://path/to/bug", "email": "bug@example.com" }, "contributors": [{ "name": "李四", "email": "lisi@example.com" }], "scripts": { "start": "node index.js" }, "dependencies": { "express": "latest", "mongoose": "~3.8.3", "handlebars-runtime": "~1.0.12", "express3-handlebars": "~0.5.0", "md5": "~1.2.0" }, "devdependencies": { "bower": "~1.2.8", "grunt": "~0.4.1", "grunt-contrib-concat": "~0.3.0", "grunt-contrib-jshint": "~0.7.2", "grunt-contrib-uglify": "~0.2.7", "grunt-contrib-clean": "~0.5.0", "browserify": "2.36.1", "grunt-browserify": "~1.3.0", } }
在package.json中可以使用通配符:
"lint": "jshint *.js" "lint": "jshint **/*.js"
*表示任意文件名,**表示任意一层子目录
2 name字段
name字段不能含有.和_,可以使用-,不能含有非url安全的字符
3 scripts字段
scripts字段指定了运行脚本命令时的npm命令缩写,比如start指定了运行npm run start时要执行的命令喎? f/ware/vc/"="" target="_blank" class="keylink">vcd4ncjxwptei0uk1xmrhtbhuy9dqdgvzdkgic3rhcnshonjlc3rhcns6zxn0b3dd/mhuyrg/ydluyqhc1hj1bjwvcd4ncjxwpm5wbb3fsb7w0ndo0qrwtndqtuc49sjozvhksaosyoe5+8rhsqlq0na00ncjrmq508mmyw1wo7f7uswjujwvcd4ncjxwcmugy2xhc3m9"brush:sql;"> $ npm run script1.js & npm run script2.js
如果是继发执行,使用&&符号:
$ npm run script1.js && npm run script2.js
更多的细节参考阮一峰的文章。
4 dependencies字段和devdependencies字段
4.1 使用
dependencies字段指定了项目运行所依赖的模块,devdependencies指定项目开发所需要的模块。
它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。
{ "devdependencies": { "browserify": "~13.0.0", "karma-browserify": "~5.0.1" } }
在单独安装某个模块时:
使用--save表示将该模块写入dependencies属性。缩写为-s 使用--save-dve表示将该模块写入devdependencies属性。缩写为-d
4.2 版本号
版本号 major.minor.patch :其中:
patch:修复bug,兼容老版本, minor:新增功能,兼容老版本 major:新的架构调整,不兼容老版本
常用的主要有以下几种:
指定版本:比如1.2.2 波浪号(~):表示安装1.2.x的最新版本 插入号(^):表示安装1.x.x的最新版本,注意如果大版本号是0,则与波浪号使用相同,例如^0.2.3只会安装0.2.x的版本,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。 latest:安装最新版本
推荐的做法:不锁版本,用 ^ 引入。
在package.json中确定版本号,只能锁定本身依赖的包,但是包自身所依赖的包没有办法锁定,解决方法就是npm shrinkwrap或者npm 5.0版本以后增加的lock功能:
如果你使用 lock 机制,则应该将 package-lock.json 提交到 repo 中。比如 vue 采取了该策略。 如果你不使用 lock 机制,则应该加入 .npmrc 文件,内容为package-lock=false ,并提交到 repo 中。比如 eslint 采取了该策略。
4.3 区别
在做项目的时候,两者可以认为没有实质的区别,但是在发布npm包的时候二者区别很大:dependencies下的模块会作为依赖,一起被下载;devdependencies下面的模块就不会自动下载了
一般来说,开发时依赖的东西需要安装在devdependencies字段中,比如转义用的babel,打包用的webpack等,如果发布后还需要使用的则要安装在dependencies,比如vue、vue-router等
5 main字段
main字段指定了加载的入口文件,require('modulename')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js
6 cinfig字段
用于添加命令行的环境变量,例如:
{ "name" : "foo", "config" : { "port" : "8080" }, "scripts" : { "start" : "node server.js" } }
然后,在server.js脚本就可以引用config字段的值。
http .createserver(...) .listen(process.env.npm_package_config_port)
用户可以改变这个值。
$ npm config set foo:port 80
7 keywords和description字段
description是字符串,keywords是字符串数组,简单地说,这两个东东是npm搜索中的搜索条件,所以。如果你试图发布的是一个开源插件,那么这两个字段你应该重视
8 license 字段
指定的项目的许可证,它告诉他人他们是否有权利使用你的包,以及,在使用你的包的时候他们应该受到怎样的限制
9 author字段
可以是一个字符串,也可以是一个对象。如果传入对象,要包含三个属性:
name属性(必填) email属性(选填) url属性(选填)
10 engines字段
指明了该模块运行的平台,比如node的某个版本或者浏览器
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
也可以指定适用的npm版本。
{ "engines" : { "npm" : "~1.0.20" } }喎?>