package.json
文件就是一個JSON對象,該對象的每個成員就是當前項目的一項設置。npm install
命令根據這個配置文件,自動下載所需的模塊,也就是配置項目所需的運行和開發環境。javascript
項目名稱html
項目版本號java
項目描述,便於用戶在npm上搜索到咱們的項目。node
是一個字符串數組,便於用戶在npm上搜索到咱們的項目。react
項目url主頁,例如:"homepage": "https://github.com/owner/project#readme"
git
項目問題反饋的Url或報告問題的email地址。例如:{ "url" : "https://github.com/owner/project/issues" , "email" : "project@hostname.com" }
若只設置url,則bugs可用字符串來代替對象。"bugs":"https://github.com/owner/project/issues"
github
項目許可證,讓使用者知道如何使用此項目。web
author是一個person,contributors是person的數組。一個person是一個對象,包含name、url和email。例如:{ "name" : "Barney Rubble" , "email" : "b@rubble.com" , "url" : "http://barnyrubble.tumblr.com/"}
npm
files是一個文件數組,描述了將軟件包做爲依賴項安裝時要包括的條目。若是在數組裏面聲明瞭一個文件夾,那也會包含文件夾中的文件。某些特殊文件和目錄也被包括或排除在外,不管它們是否存在於文件數組中。json
如下文件不管是否設置,老是包含: * `package.json` * `README` * `CHANGES`/`CHANGELOG`/`HISTORY` * `LICENSE`/`LICENCE` * `NOTICE` * The file in the 「main」 field 如下文件老是被忽略: * `.git` * `CVS` * `.svn` * `.hg` * `.lock-wscript` * `.wafpickle-N` * `.*.swp` * `.DS_Store` * `._*` * `npm-debug.log` * `.npmrc` * `node_modules` * `config.gypi` * `*.orig` * `package-lock.json`(use shrinkwrap instead)
主文件。好比默認是index.js,項目名稱叫foo。那麼require("foo")將返回index.js返回的內容。路徑相對軟件包根目錄。
若是要在客戶端使用模塊,則應使用browser字段來代替main字段。
bin用來指定各個內部命令對應的可執行文件的位置。例如:myapp裏面包含
"bin": { "someTool": "./bin/someTool.js" }
上面代碼指定,someTool 命令對應的可執行文件爲 bin 子目錄下的 someTool.js。當本地安裝myapp時,Npm會尋找這個文件,在./node_modules/.bin/
目錄下創建符號連接。在上面的例子中,someTool.js會創建符號連接./node_modules/.bin/someTool
。因爲./node_modules/.bin/
目錄會在運行時加入系統的PATH變量,所以在運行npm時,就能夠不帶路徑,直接經過命令來調用這些腳本。
全部node_modules/.bin/
目錄下的命令,均可以用npm run [命令]
的格式運行。bin中引用的文件需以#!/usr/bin/envnode
開頭
用來指定當前模塊的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這個文件。
CommonJS包規範詳細介紹了幾種使用directories對象來標識包結構的方法。若是您查看npm的package.json,就會看到它有doc、lib和man目錄。
代碼存放地方。例如:
"repository": { "type" : "git", "url" : "https://github.com/npm/cli.git" }
若是包的package.json不在根目錄中,能夠經過directory來聲明他所在的位置。例如:
"repository": { "type": "git", "url": "https://github.com/facebook/create-react-app.git", "directory": "packages/react-scripts" },
scripts
指定了運行腳本命令的npm命令行縮寫,好比start指定了運行npm run start
時,所要執行的命令。
下面的設置指定了npm run preinstall
、npm run postinstall
、npm run start
、npm run test
時,所要執行的命令。
"scripts": { "preinstall": "echo here it comes!", "postinstall": "echo there it goes!", "start": "node index.js", "test": "tap test/*.js" }
用於添加命令行的環境變量。
{ "name" : "foo", "config" : { "port" : "8080" }, "scripts" : { "start" : "node server.js" } }
server.js中使用process.env.npm_package_config_port來獲取port。
用戶能夠經過執行npm config set foo:port 80
來覆蓋該命令
dependencies指定了項目運行所依賴的模塊。devDependencies指定項目開發所須要的模塊。對應的版本能夠加上各類限定,主要有如下幾種:
1.2.2
,遵循「大版本.次要版本.小版本」的格式規定,安裝時只安裝指定版本。~1.2.2
,表示安裝1.2.x的最新版本(不低於1.2.2),可是不安裝1.3.x,也就是說安裝時不改變大版本號和次要版本號。--save
參數表示將該模塊寫入dependencies
屬性,--save-dev
表示將該模塊寫入devDependencies
屬性。
有時,你的項目和所依賴的模塊,都會同時依賴另外一個模塊,可是所依賴的版本不同。好比,你的項目依賴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
字段,就是用來供插件指定其所須要的主工具的版本。
{ "name": "chai-as-promised", "peerDependencies": { "chai": "1.x" } }
上面代碼指定,安裝chai-as-promised
模塊時,主程序chai
必須一塊兒安裝,並且chai
的版本必須是1.x
。若是你的項目指定的依賴是chai
的2.0版本,就會報錯。
注意,從npm 3.0版開始,peerDependencies
再也不會默認安裝了。
定義一個數組,會在發佈時將定義的模塊一塊兒打包。用於需在本地保存npm包或者下載單個文件時可用。例如:
{ "name": "awesome-web-framework", "version": "1.0.0", "bundledDependencies": [ "renderized", "super-streams" ] }
運行npm pack
命令會獲得awesome-web-framework-1.0.0.tgz
。執行npm install awesome-web-framework-1.0.0.tgz
將在新項目中安裝renderized
和super-streams
這兩個依賴項
若但願在包找不到或者安裝失敗時,npm繼續運行,可將該包放在optionalDependencies對象中。須要你在代碼中處理模塊缺失的問題。optionalDependencies會覆蓋dependencies中同名的,因此最好只放在一個地方。
engines
字段指明瞭該模塊運行的平臺,好比 Node 的某個版本或者瀏覽器。該字段也能夠指定適用的npm
版本。
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
指定你的項目將運行在什麼操做系統上。
指定你的項目將運行在什麼cpu架構上。
若是設置爲true, 那麼npm會拒絕發佈它。
一組配置值,發佈時使用。