package.json必須是純JSON的,而不僅僅是一個(gè)JavaScript對(duì)象字面量猜拾。
name和version
name和version字段是package.json文件中最重要的字段府适。這是必須的字段羔飞,如果你的npm包沒有指定這兩個(gè)字段,將無法被安裝檐春。name和version字段被假定組合成一個(gè)唯一的 標(biāo)識(shí)符逻淌。包內(nèi)容的更改和包版本的更改是同步的。
description
npm包的描述疟暖,description是一個(gè)字符串卡儒。它可以幫助人們?cè)谑褂胣pm search時(shí)找到這個(gè)包。
keywords
npm包的關(guān)鍵字俐巴,keywords是一個(gè)字符串的數(shù)組骨望。它可以幫助人們?cè)谑褂胣pm search時(shí)找到這個(gè)包。
homepage
項(xiàng)目主頁的url
bugs
改項(xiàng)目的issue跟蹤頁面或這報(bào)告issue的email地址窜骄。這對(duì)使用這個(gè)包遇到問題的用戶會(huì)有幫助锦募。
license
證書許可。SPDX表達(dá)式:
{ "license": "ISC" }
{ "license": "(MIT OR Apache-2.0)" }
通常我們不希望授權(quán)別人以任何形式使用的私有包或未發(fā)布包邻遏,可以這樣寫:
{ "license": "UNLICENSED"}
或者設(shè)置"private": true
author, contributors
關(guān)于人的字段
files
files字段是一個(gè)被項(xiàng)目包含的文件名數(shù)組糠亩,如果你在里面放一個(gè)文件夾名虐骑,那么這個(gè)文件夾中的所有文件都會(huì)被包含進(jìn)項(xiàng)目中(除非是那些在其他規(guī)則中被忽略的文件)。
main
main字段指定了模塊的入口程序文件赎线。就是說廷没,如果你的模塊名叫"foo",用戶安裝了它垂寥,并且調(diào)用了 require("foo")颠黎,則這個(gè)main字段指定的模塊的導(dǎo)出對(duì)象會(huì)被返回。
例如node_modules中引入的模塊指定主入口文件
bin
許多包有一個(gè)或多個(gè)可執(zhí)行文件希望被安裝到系統(tǒng)路徑滞项。提供一個(gè)bin字段狭归,它是一個(gè)命令名和本地文件名的映射。在安裝時(shí)文判,如果是全局安裝过椎,npm將會(huì)使用符號(hào)鏈接把這些文件鏈接到prefix/bin,如果是本地安裝戏仓,會(huì)鏈接到./node_modules/.bin/疚宇。
比如,要使用myapp作為命令時(shí)可以這么做:
{ "bin" : { "myapp" : "./cli.js" } }
當(dāng)安裝完畢myapp赏殃,npm會(huì)從cli.js文件創(chuàng)建一個(gè)到/usr/local/bin/myapp的符號(hào)鏈接(這使你可以直接在命令行執(zhí)行myapp)敷待。
man
指定一個(gè)單一的文件名或一個(gè)文件名數(shù)組來讓man程序使用。如果只給man字段提供一個(gè)文件仁热,則安裝完畢后榜揖,它就是man <pkgname>的結(jié)果,這和此文件名無關(guān)
directories
CommonJS Packages規(guī)范說明了幾種你可以用directories對(duì)象來標(biāo)示你的包結(jié)構(gòu)的方法(lib股耽、bin根盒、man钳幅、doc物蝙、example)
repository
指明你的代碼被托管在何處,這對(duì)那些想要參與到這個(gè)項(xiàng)目中的人來說很有幫助敢艰。如果git倉庫在github上诬乞,用npm docs命令將會(huì)找到你。
scripts
scripts字段是一個(gè)由腳本命令組成的字典钠导,這些命令運(yùn)行在包的各個(gè)生命周期中震嫉。這里的鍵是生命周期事件名,值是要運(yùn)行的命令牡属。
config
config字段是一個(gè)對(duì)象票堵,可以用來配置包腳本中的跨版本參數(shù)。
dependencies
dependencies字段是一個(gè)對(duì)象逮栅,它指定了依賴的包名和其版本范圍的映射悴势。版本范圍是個(gè)有一個(gè)或多個(gè)空白分隔描述符的字符串窗宇。dependencies字段還可以用tarball或者git URL。
(請(qǐng)不要將測試或過渡性的依賴放到dependencies中)
devDependencies
如果有人計(jì)劃在他們的項(xiàng)目中下載和使用你的模塊特纤,但他們可能并不想或并不需要你開發(fā)所使用的外部測試和文檔框架军俊。
在這種情況下,最好將這些附加的項(xiàng)放在devDependencies中捧存。即開發(fā)模式下的依賴粪躬。
peerDependencies
在某些情況下,當(dāng)一個(gè)主機(jī)無法require依賴包時(shí)昔穴,你會(huì)想要告訴它還有哪些工具或庫與這個(gè)依賴包兼容镰官。這通常被成為一個(gè)插件。尤其是在host文檔中聲明的模塊會(huì)暴露一個(gè)特定的接口吗货。
bundledDependencies
在發(fā)布包時(shí)朋魔,包名的數(shù)組會(huì)被打包進(jìn)去。
optionalDependencies
如果一個(gè)依賴項(xiàng)可用卿操,但希望在這個(gè)依賴項(xiàng)無法被找到或者安裝時(shí)失敗npm還能繼續(xù)處理(不中斷)警检,那么你可以把它放在optionalDependencies中。和dependencies一樣害淤,optionalDependencies是一個(gè)包名和版本號(hào)或url的映射扇雕。區(qū)別在于optionalDependencies中的依賴構(gòu)建失敗時(shí)不會(huì)導(dǎo)致npm整體安裝失敗。
但是你的程序依然有責(zé)任處理這種缺失的依賴項(xiàng)窥摄,例如
try{
var foo=require('foo')
var fooVersion=require('foo/package.json').version
}catch(er){
foo=null
}if(notGoodFooVersion(fooVersion)){
foo=null
}//..thenlaterinyourprogram..if(foo){
foo.doFooThings()
}
optionalDependencies中的項(xiàng)會(huì)覆蓋dependencies中的同名項(xiàng)镶奉,所以一個(gè)特定名字的項(xiàng)最好只出現(xiàn)在一個(gè)地方。
engines
你可以指定node的工作版本:
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
os
可以指定模塊運(yùn)行的操作系統(tǒng):"os" : [ "darwin", "linux" ]
也可以使用操作系統(tǒng)黑名單來替代白名單崭放,只要在前面加個(gè)'!':
"os" : [ "!win32" ]
cpu
指明只能運(yùn)行在特定的cpu架構(gòu)上
preferGlobal
如果你的包是一個(gè)需要進(jìn)行全局安裝的命令行應(yīng)用哨苛,需要設(shè)置preferGlobal為true,如果這個(gè)包被本地安裝會(huì)報(bào)出一個(gè)警告币砂。
這個(gè)選項(xiàng)并不會(huì)阻止用戶本地安裝這個(gè)包建峭,但這么做確實(shí)能在包未按照預(yù)期被安裝造成諸多麻煩時(shí)提供一些提示。
private
如果你在包的package.json中設(shè)置"private": true决摧,則npm會(huì)拒絕發(fā)布它亿蒸。這是防止私有包被以外發(fā)布的一種方法。
publishConfig
這是一個(gè)在publish-time時(shí)會(huì)用到的配置集合掌桩。當(dāng)你想設(shè)置tag边锁、registry或access時(shí)特別有用,所以你可以確保一個(gè)給定的包無法在沒有被打上"latest"標(biāo)記時(shí)就被發(fā)布到全局公共的registry波岛。
任何配置都可以被覆蓋茅坛,當(dāng)然可能只有"tag", "registry"和"access"和發(fā)布意圖有關(guān)。
總結(jié)心得
npm init基本能完成一個(gè)項(xiàng)目基礎(chǔ)的構(gòu)建则拷。日常開發(fā)private:true然后管理好依賴贡蓖,寫好scripts基本就可以了祟剔。
但是如果要開發(fā)一個(gè)開源項(xiàng)目。peerDependencies摩梧、license、repository以及一些額外的bugs仅父、homepage之類細(xì)化的東西都要熟悉了解叛薯。