package.json文件配置及其含义,这个是vue-cli自动生成的文件,先贴一张代码及其含义:javascript
{ "name": "secondproject",//模块名称 "version": "1.0.0",//模块版本 "description": "A Vue.js project",//对模块的描述 "author": "datura",//做者是谁 "private": true,//若是值为true,npm将拒绝发布它 "scripts": {//值是一个对象,里面指定了项目的生命周期各个环节须要执行的命令 "dev": "node build/dev-server.js",//这个就是在命令行执行npm run dev,实际上是运行dev-server.js文件 "build": "node build/build.js",//build命令(有一个钩子的概念:好比这个build有prebuild和postbuild "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",//babel是一个编译器,能够把ES6编译成ES5.,这句先是设置编译环境为test环境下;karma是一个运行时,它产生一个web服务环境来运行项目代码,并执行测试。.. "e2e": "node test/e2e/runner.js",//e2e模拟用户行为的测试,端到端测试 "test": "npm run unit && npm run e2e"//执行单元测试和e2e测试 },//关于npm钩子:一般程序只能处理来自内部的消息,若是但愿对外部发来的消息也能拦截处理,就须要用到Hook技术。好比想在run build以前自动执行点任务,能够将其写在run prebuild标签里;postbuild在build以后自动执行 "dependencies": {//配置模块依赖的模块列表,key是模块名称,value是版本范围,版本范围是一个字符,可被一个或多个空格分割。 "router": "^1.3.0",//路由版本 "vue": "^2.2.1",//vue版本 "vue-resource": "^1.2.1",//一个插件,经过xmlHttpRequest或jsonp发起请求并处理响应。 "vue-router": "^2.3.0"// }, "devDependencies": {//这里写的依赖是用于开发环境的,不发布到生产环境。 "autoprefixer": "^6.7.2", "babel-core": "^6.22.1", "babel-loader": "^6.2.10", "babel-plugin-transform-runtime": "^6.22.0", "babel-preset-latest": "^6.22.0", "babel-preset-stage-2": "^6.22.0", "babel-register": "^6.22.0", "chalk": "^1.1.3", "connect-history-api-fallback": "^1.3.0", "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.26.1", "eventsource-polyfill": "^0.9.6", "express": "^4.14.1", "extract-text-webpack-plugin": "^2.0.0", "file-loader": "^0.10.0", "friendly-errors-webpack-plugin": "^1.1.3", "function-bind": "^1.1.0", "html-webpack-plugin": "^2.28.0", "http-proxy-middleware": "^0.17.3", "webpack-bundle-analyzer": "^2.2.1", "cross-env": "^3.1.4", "karma": "^1.4.1", "karma-coverage": "^1.1.1", "karma-mocha": "^1.3.0", "karma-phantomjs-launcher": "^1.0.2", "karma-sinon-chai": "^1.2.4", "karma-sourcemap-loader": "^0.3.7", "karma-spec-reporter": "0.0.26", "karma-webpack": "^2.0.2", "lolex": "^1.5.2", "mocha": "^3.2.0", "chai": "^3.5.0", "sinon": "^1.17.7", "sinon-chai": "^2.8.0", "inject-loader": "^2.0.1", "babel-plugin-istanbul": "^3.1.2", "phantomjs-prebuilt": "^2.1.14", "chromedriver": "^2.27.2", "cross-spawn": "^5.0.1", "nightwatch": "^0.9.12", "selenium-server": "^3.0.1", "semver": "^5.3.0", "opn": "^4.0.2", "optimize-css-assets-webpack-plugin": "^1.3.0", "ora": "^1.1.0", "rimraf": "^2.6.0", "url-loader": "^0.5.7", "vue-loader": "^11.0.0", "vue-style-loader": "^2.0.0", "vue-template-compiler": "^2.2.1", "webpack": "^2.2.1", "webpack-dev-middleware": "^1.10.0", "webpack-hot-middleware": "^2.16.1", "webpack-merge": "^2.6.1" }, "engines": {//指定项目运行的node或者npm版本范围,有点像安卓的指定开发level哦 "node": ">= 4.0.0", "npm": ">= 3.0.0" }, "browserlist": [//在不一样的前端工具之间共享目标浏览器的库,肯定哪些支持哪些版本的浏览器 "> 1%",//全球有超1%的人使用的浏览器 "last 2 versions",//根据CanIUse.com追踪的最后两个版本的全部浏览器 "not ie <= 8"//排除先前查询选择的浏览器 天啦噜 英语很差是硬伤 不知怎么翻译好理解 ] }
这块想插播一篇文章,关于package.json文件讲的很详细很好理解,能够做为参考手册收藏啦。css
附上原文连接:http://www.javashuo.com/article/p-ecnxakli-cp.htmlhtml
本文档是本身看官方文档的理解+翻译,内容是package.json配置里边的属性含义。package.json必须是一个严格的json文件,而不只仅是js里边的一个对象。其中不少属性能够经过npm-config来生成。前端
package.json中最重要的属性是name和version两个属性,这两个属性是必需要有的,不然模块就没法被安装,这两个属性一块儿造成了一个npm模块的惟一标识符。模块中内容变动的同时,模块版本也应该一块儿变化。
name属性就是你的模块名称,下面是一些命名规则:vue
name属性能够有一些前缀如 e.g. @myorg/mypackage.在npm-scope(7)的文档中能够看到详细说明java
version必须能够被npm依赖的一个node-semver模块解析。具体规则见下面的dependencies模块node
一个描述,方便别人了解你的模块做用,搜索的时候也有用。linux
一个字符串数组,方便别人搜索到本模块webpack
项目主页url
注意: 这个项目主页url和url属性不一样,若是你填写了url属性,npm注册工具会认为你把项目发布到其余地方了,获取模块的时候不会从npm官方仓库获取,而是会重定向到url属性配置的地址。
(原文档中用了 spit(吐)这个单词,做者表示他不是在开玩笑:)git
填写一个bug提交地址或者一个邮箱,被你的模块坑到的人能够经过这里吐槽,例如:
{ "url" : "https://github.com/owner/project/issues"
, "email" : "project@hostname.com"
}
url和email能够任意填或不填,若是只填一个,能够直接写成一个字符串而不是对象。若是填写了url,npm bugs命令会使用这个url。
你应该为你的模块制定一个协议,让用户知道他们有何权限来使用你的模块,以及使用该模块有哪些限制。最简单的,例如你用BSD-3-Clause 或 MIT之类的协议,以下:
{ "license" : "BSD-3-Clause" }
你能够在https://spdx.org/licenses/这个地址查阅协议列表 。
"author"是一个码农, "contributors"是一个码农数组。 "person"是一个有一些描述属性的对象,以下 like this:
{ "name" : "Barney Rubble"
, "email" : "b@rubble.com"
, "url" : "http://barnyrubble.tumblr.com/"
}
也能够按以下格式缩写,npm会帮着转换:
"Barney Rubble b@rubble.com (http://barnyrubble.tumblr.com/)"
email和url属性实际上都是能够省略的。描述用户信息的还有一个"maintainers"(维护者)属性。
"files"属性的值是一个数组,内容是模块下文件名或者文件夹名,若是是文件夹名,则文件夹下全部的文件也会被包含进来(除非文件被另外一些配置排除了)
你也能够在模块根目录下建立一个".npmignore"文件(windows下没法直接建立以"."开头的文件,使用linux命令行工具建立如git bash),写在这个文件里边的文件即使被写在files属性里边也会被排除在外,这个文件的写法".gitignore"相似。
main属性指定了程序的主入口文件。意思是,若是你的模块被命名为foo,用户安装了这个模块并经过require("foo")来使用这个模块,那么require返回的内容就是main属性指定的文件中 module.exports指向的对象。
它应该指向模块根目录下的一个文件。对大对数模块而言,这个属性更多的是让模块有一个主入口文件,然而不少模块并不写这个属性。
不少模块有一个或多个须要配置到PATH路径下的可执行模块,npm让这个工做变得十分简单(实际上npm自己也是经过bin属性安装为一个可执行命令的)
若是要用npm的这个功能,在package.json里边配置一个bin属性。bin属性是一个已命令名称为key,本地文件名称为value的map以下:
{ "bin" : { "myapp" : "./cli.js" } }
模块安装的时候,如果全局安装,则npm会为bin中配置的文件在bin目录下建立一个软链接(对于windows系统,默认会在C:\Users\username\AppData\Roaming\npm目录下),如果局部安装,则会在项目内的./node_modules/.bin/目录下建立一个软连接。
所以,按上面的例子,当你安装myapp的时候,npm就会为cli.js在/usr/local/bin/myapp路径建立一个软连接。
若是你的模块只有一个可执行文件,而且它的命令名称和模块名称同样,你能够只写一个字符串来代替上面那种配置,例如:
{ "name": "my-program"
, "version": "1.2.5"
, "bin": "./path/to/program" }
做用和以下写法相同:
{ "name": "my-program"
, "version": "1.2.5"
, "bin" : { "my-program" : "./path/to/program" } }
制定一个或经过数组制定一些文件来让linux下的man命令查找文档地址。
若是只有一个文件被指定的话,安装后直接使用man+模块名称,而无论man指定的文件的实际名称。例如:
{ "name" : "foo"
, "version" : "1.2.3"
, "description" : "A packaged foo fooer for fooing foos"
, "main" : "foo.js"
, "man" : "./man/doc.1"
}
经过man foo命令会获得 ./man/doc.1 文件的内容。
若是man文件名称不是以模块名称开头的,安装的时候会给加上模块名称前缀。所以,下面这段配置:
{ "name" : "foo"
, "version" : "1.2.3"
, "description" : "A packaged foo fooer for fooing foos"
, "main" : "foo.js"
, "man" : [ "./man/foo.1", "./man/bar.1" ]
}
会建立一些文件来做为man foo和man foo-bar命令的结果。
man文件必须以数字结尾,或者若是被压缩了,以.gz结尾。数字表示文件将被安装到man的哪一个部分。
{ "name" : "foo"
, "version" : "1.2.3"
, "description" : "A packaged foo fooer for fooing foos"
, "main" : "foo.js"
, "man" : [ "./man/foo.1", "./man/foo.2" ]
}
会建立 man foo 和 man 2 foo 两条命令。
CommonJs经过directories来制定一些方法来描述模块的结构,看看npm的package.json文件https://registry.npmjs.org/npm/latest ,能够发现里边有这个字段的内容。
目前这个配置没有任何做用,未来可能会整出一些花样来。
告诉用户模块中lib目录在哪,这个配置目前没有任何做用,可是对使用模块的人来讲是一个颇有用的信息。
若是你在这里指定了bin目录,这个配置下面的文件会被加入到bin路径下,若是你已经在package.json中配置了bin目录,那么这里的配置将不起任何做用。
指定一个目录,目录里边都是man文件,这是一种配置man文件的语法糖。
在这个目录里边放一些markdown文件,可能最终有一天它们会被友好的展示出来(应该是在npm的网站上)
放一些示例脚本,或许某一天会有用 - -!
指定一个代码存放地址,对想要为你的项目贡献代码的人有帮助。像这样:
"repository" :
{ "type" : "git"
, "url" : "https://github.com/npm/npm.git"
}
"repository" :
{ "type" : "svn"
, "url" : "https://v8.googlecode.com/svn/trunk/"
}
若你的模块放在GitHub, GitHub gist, Bitbucket, or GitLab的仓库里,npm install的时候可使用缩写标记来完成:
"repository": "npm/npm"
"repository": "gist:11081aaa281"
"repository": "bitbucket:example/repo"
"repository": "gitlab:another/repo"
scripts属性是一个对象,里边指定了项目的生命周期个各个环节须要执行的命令。key是生命周期中的事件,value是要执行的命令。
具体的内容有 install start stop 等,详见https://docs.npmjs.com/misc/scripts
用来设置一些项目不怎么变化的项目配置,例如port等。
用户用的时候可使用以下用法:
http.createServer(...).listen(process.env.npm_package_config_port)
能够经过npm config set foo:port 80来修改config。详见https://docs.npmjs.com/misc/config
{ "name" : "foo"
, "config" : { "port" : "8080" } }
dependencies属性是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围,版本范围是一个字符,能够被一个或多个空格分割。
dependencies也能够被指定为一个git地址或者一个压缩包地址。
不要把测试工具或transpilers写到dependencies中。 下面是一些写法,详见https://docs.npmjs.com/misc/semver
{ "dependencies" :
{ "foo" : "1.0.0 - 2.9999.9999"
, "bar" : ">=1.0.2 <2.1.2"
, "baz" : ">1.0.2 <=2.3.4"
, "boo" : "2.0.1"
, "qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0"
, "asd" : "http://asdf.com/asdf.tar.gz"
, "til" : "~1.2"
, "elf" : "~1.2.3"
, "two" : "2.x"
, "thr" : "3.3.x"
, "lat" : "latest"
, "dyl" : "file:../dyl"
}
}
在版本范围的地方能够写一个url指向一个压缩包,模块安装的时候会把这个压缩包下载下来安装到模块本地。
Git url能够像下面同样:
git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+ssh://user@hostname/project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish
commit-ish 能够是任意标签,哈希值,或者能够检出的分支,默认是master分支。
支持github的 username/modulename 的写法,#后边能够加后缀写明分支hash或标签:
{
"name": "foo",
"version": "0.0.0",
"dependencies": {
"express": "visionmedia/express",
"mocha": "visionmedia/mocha#4727d357ea"
}
}
npm2.0.0版本以上能够提供一个本地路径来安装一个本地的模块,经过npm install xxx --save 来安装,格式以下:
../foo/bar
~/foo/bar
./foo/bar
/foo/bar
package.json 生成的相对路径以下:
{
"name": "baz",
"dependencies": {
"bar": "file:../foo/bar"
}
}
这种属性在离线开发或者测试须要用npm install的状况,又不想本身搞一个npm server的时候有用,可是发布模块到公共仓库时不该该使用这种属性。
若是有人想要下载并使用你的模块,也许他们并不但愿或须要下载一些你在开发过程当中使用的额外的测试或者文档框架。
在这种状况下,最好的方法是把这些依赖添加到devDependencies属性的对象中。
这些模块会在npm link或者npm install的时候被安装,也能够像其余npm配置同样被管理,详见npm的config文档。
对于一些跨平台的构建任务,例如把CoffeeScript编译成JavaScript,就能够经过在package.json的script属性里边配置prepublish脚原本完成这个任务,而后须要依赖的coffee-script模块就写在devDependencies属性种。
例如:
{ "name": "ethopia-waza",
"description": "a delightfully fruity coffee varietal",
"version": "1.2.3",
"devDependencies": {
"coffee-script": "~1.6.3"
},
"scripts": {
"prepublish": "coffee -o lib/ -c src/waza.coffee"
},
"main": "lib/waza.js"
}
prepublish脚本会在发布以前运行,所以用户在使用以前就不用再本身去完成编译的过程了。在开发模式下,运行npm install也会执行这个脚本(见npm script文档),所以能够很方便的调试。
有时候作一些插件开发,好比grunt等工具的插件,它们每每是在grunt的某个版本的基础上开发的,而在他们的代码中并不会出现require("grunt")这样的依赖,dependencies配置里边也不会写上grunt的依赖,为了说明此模块只能做为插件跑在宿主的某个版本范围下,能够配置peerDependencies:
{
"name": "tea-latte",
"version": "1.3.5",
"peerDependencies": {
"tea": "2.x"
}
}
上面这个配置确保再npm install的时候tea-latte会和2.x版本的tea一块儿安装,并且它们两个的依赖关系是同级的:
├── tea-latte@1.3.5
└── tea@2.2.0
这个配置的目的是让npm知道,若是要使用此插件模块,请确保安装了兼容版本的宿主模块。
上面的单词少个d,写成bundleDependencies也能够。
指定发布的时候会被一块儿打包的模块。
若是一个依赖模块能够被使用, 同时你也但愿在该模块找不到或没法获取时npm继续运行,你能够把这个模块依赖放到optionalDependencies配置中。这个配置的写法和dependencies的写法同样,不一样的是这里边写的模块安装失败不会致使npm install失败。
固然,这种模块就须要你本身在代码中处理模块确实的状况了,例如:
try {
var foo = require('foo')
var fooVersion = require('foo/package.json').version
} catch (er) {
foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
foo = null
}
// .. then later in your program ..
if (foo) {
foo.doFooThings()
}
optionalDependencies 中的配置会覆盖dependencies中的配置,最好只在一个地方写。
你能够指定项目运行的node版本范围,以下:
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
和dependencies同样,若是你不指定版本范围或者指定为*,任何版本的node均可以。
也能够指定一些npm版本能够正确的安装你的模块,例如:
{ "engines" : { "npm" : "~1.0.20" } }
要注意的是,除非你设置了engine-strict属性,engines属性是仅供参考的。
注意:这个属性已经弃用,将在npm 3.0.0 版本干掉。
能够指定你的模块只能在哪一个操做系统上跑:
"os" : [ "darwin", "linux" ]
也能够指定黑名单而不是白名单:
"os" : [ "!win32" ]
服务的操做系统是由process.platform来判断的,这个属性容许黑白名单同时存在,虽然没啥必要这样搞...
限制模块只能在某某cpu架构下运行
"cpu" : [ "x64", "ia32" ]
一样能够设置黑名单:
"cpu" : [ "!arm", "!mips" ]
cpu架构经过 process.arch 判断
若是您的软件包主要用于安装到全局的命令行应用程序,那么该值设置为true ,若是它被安装在本地,则提供一个警告。实际上该配置并无阻止用户把模块安装到本地,只是防止该模块被错误的使用引发一些问题。
若是这个属性被设置为true,npm将拒绝发布它,这是为了防止一个私有模块被无心间发布出去。若是你只想让模块被发布到一个特定的npm仓库,如一个内部的仓库,可与在下面的publishConfig中配置仓库参数。
这个配置是会在模块发布时用到的一些值的集合。若是你不想模块被默认被标记为最新的,或者默认发布到公共仓库,能够在这里配置tag或仓库地址。
npm设置了一些默认参数,如:
"scripts": {"start": "node server.js"}
若是模块根目录下有一个server.js文件,那么npm start会默认运行这个文件。
"scripts":{"preinstall": "node-gyp rebuild"}
若是模块根目录下有binding.gyp, npm将默认用node-gyp来编译preinstall的脚本
"contributors": [...]
若模块根目录下有AUTHORS 文件,则npm会按Name (url)格式解析每一行的数据添加到contributors中,能够用#添加行注释
semver(7)npm-init(1)npm-version(1)npm-config(1)npm-config(7)npm-help(1)npm-faq(7)npm-install(1)npm-publish(1)npm-rm(1)