前言:夜深了,我熬了一鍋熱氣騰騰的package.json,給你們端上來,但願你們喜歡node
json和JS對象的區別
package.json,顧名思義,它是一個json文件,而不能寫入JS對象。
因此咱們首先要搞懂的是JSON和JS對象的區別:
(圖源:找到的都是被爬蟲爬的文章,實在找不到原做者。。若是有人知道原做者找我加個原做者名呀~)
【注意】 在JSON中屬性名必定要加上雙引號
name字段
name字段的限制
1.name字段必須小於214字符(這個沒什麼好記的~)
2.name字段不能包含有「.」符號和下劃線(這個要記一下哦~)
3.name字段不能包含有大寫字母(這個要記一下哦~)
4.name字段不能含有非URL安全的字符,由於它將當發佈的時候,它將做爲你的包的相關信息被寫入URL中
那麼,有哪些算是非URL安全的字符呢?我們看錶說話:
(圖源:《URL中的保留和不安全字符》——tianya23)
【注意】:
1.我惟一以爲須要特別注意的是,name字段不能含有大寫字母和下劃線,由於對寫JS的人來講,由於駝峯命名法的習慣每每試圖加個大寫字母進去;而對於寫node的人來講,又可能忍不住想在單詞與單詞間連個下劃線,這都是錯誤的來源,要謹記。
2.package.json的name字段彷佛格外地喜歡「-」這個符號呢,因此咱們在寫name字段時能夠用它作鏈接符號哦,例如:像「react-router」這個字段同樣
version字段
npm對version定義的規則要求
對於"version":"x.y.z"
1.修復bug,小改動,增長z
2.增長了新特性,但仍能向後兼容,增長y
3.有很大的改動,沒法向後兼容,增長x
例如:我本來的項目是1.0.0版本的話
如果1中狀況,變爲1.0.1
如果2中狀況,變爲1.1.0
如果3中狀況,變爲2.0.0
npm有本身的檢驗version的模塊——node-semver
npm有本身的一套檢驗version正確性的模塊,它叫作 node-semver,是一開始就跟隨着npm一塊兒被打包安裝的。固然了,你也能夠經過本身安裝去在本身的項目中使用它。
使用的例子像這樣:
先npm install --save semver
而後:
const semver = require('semver')
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
name字段和version字段能夠說是package.json最重要也是最基本的兩個字段了。它們共同構成了你的包的惟一標識
keywords和description字段
字段要求:
description:字符串
keywords:字符串數組
簡單地說,這兩個東東是npm搜索系統中的搜索條件,因此。若是你試圖發佈的是一個開源插件,那麼這兩個字段你應該重視
license字段
這是你指定的項目的許可證,它告訴他人他們是否有權利使用你的包,以及,在使用你的包的時候他們應該受到怎樣的限制
我們仍是上一張圖吧:
圖源:《如何選擇開源許可證?》——阮一峯
字段要求:
單個license:直接寫入名稱
{ "license" : "BSD-3-Clause" }
多個license:在一對圓括號內寫入license名稱,且在多個license內用AND等鏈接
{ "license" : "(ISC AND GPL-3.0)" }
author字段
要求:一個字符串或是一個對象。
若是是一個對象,該對象包含三個屬性:
name屬性(必填)
email屬性(選填)
URL屬性(選填)
{ "name" : "Barney Rubble"
, "email" : "b@rubble.com"
, "url" : "http://barnyrubble.tumblr.com/"
}
main字段
這個是你項目的入口文件。簡而言之,當別人安裝了你發佈的模塊時,require你的模塊的時候取得的就是你main字段規定的入口文件的輸出。
例如你寫入了 { "main":"XXX.js"},而他人經過npm install '你的模塊名稱' . 安裝了你的模塊後,他經過 var X = require('你的模塊名稱')取得的就是你在XXX.js的輸出
script字段
寫進scripts的命令(command),能夠經過npm run <command>或者npm <command> 運行對應的shell指令,例如:{"scripts": { "start": "node main.js"} } 可讓你在終端輸入npm start的時候,等同於運行了node main.js
何時要加「run」,何時能夠不用加「run」呢?
一個讓咱們可能有些困擾的問題是,經過script字段內的npm命令運行腳本時,有時候要加「run」,有時候又不要加"run",即有時候是能夠直接用npm <command>;而有時候又要用npm run <command> 才能運行腳本,這該如何區分呢?
首先要提一下的是,run的原名是run-script,是一段腳本,而run是它的一個別名(alias)
1.當run[-script]被 test, start, restart, and stop這四個自帶的命令所使用時,它能夠被省略(或者說不須要加「run」就能夠直接調用),因此咱們平時最常輸入的npm start實際上至關於npm run start,只不過是爲了方便省略了run而已
原文:run[-script] is used by the test, start, restart, and stop commands, but can be called directly
2.當你在package.json的script字段中定義的是除了1中的4個命令外的命令的時候,你就不能省略「run」了
例如你定義
"scripts": {
"build": "XXX.js"
}
的時候,你運行XXX.js就只能經過npm run build去運行了react
npm爲script字段中的腳本路徑都加上了node_moudles/.bin前綴
npm爲script字段中的腳本路徑都加上了node_moudles/.bin前綴,這意味着:你在試圖運行本地安裝的依賴在 node_modules/.bin 中的腳本的時候,能夠省略node_modules/.bin這個前綴。例如:
我剛npm install webpack了,而在個人項目下的node_modules目錄的.bin子目錄下:
就多了一個叫作webpack的腳本webpack
原本運行這個腳本的命令應該是:node_modules/.bin webpack
但因爲npm已經自動幫咱們加了node_modules/.bin前綴了,因此咱們能夠直接寫成:
"scripts": {"start": "webpack"}
而不用寫成:
"scripts": {"start": "node_modules/.bin webpack"}
原文:npm run adds node_modules/.bin to the PATH provided to scripts. Any binaries provided by locally-installed dependencies can be used without the node_modules/.bin prefix
npm start是有默認值的,默認爲:node server.js
better-npm-run的安裝與betterScript字段的使用
這個是package.json文檔介紹裏所沒有的,但這裏我想特別講一下:
先經過npm install better-npm-run安裝好包,而後你就能夠在你的package.json裏面使用一個新的字段—— "betterScripts"字段
故名思意,它和"scripts"字段很像,那麼二者間有什麼聯繫呢?咱仍是用代碼說話吧,它能夠把
"scripts": {
"test": "NODE_ENV=production karma start"
}
變成:
"scripts": {
"test": "better-npm-run test"
},
"betterScripts": {
"test": {
"command": "karma start",
"env": {
"NODE_ENV": "test"
}
}
}
簡單地說,就是當運行"scripts"字段中的命令的時候,它會進一步去運行 "betterScripts"中對應的命令,並經過"env"對象控制運行時的環境變量,如NODE_ENV。
好處是讓你的代碼的可讀性更強一些
另外提一下NODE_ENV的做用:
用來設置環境變量(默認值爲development)。
經過檢查這個值能夠分別對開發環境和生產環境下作不一樣的處理
例如在服務端代碼中經過檢查是不是開發環境(development)決定是否啓動代碼熱重載功能
(熱重載只是爲了在開發環境【developmen】提升生產效率用,在生產環境【production】沒毛用)
if (process.env.NODE_ENV === 'development') {
// 省略諸多內容
app.use(require('webpack-hot-middleware')(compiler, {
path: '/__webpack_hmr'
}))
}
dependencies字段和devDependencies字段
dependencies字段和devDependencies字段分別表明生產環境依賴和開發環境依賴
與兩個字段相關的npm install的命令
npm install 模塊 --save 安裝好後寫入package.json的dependencies中(生產環境依賴)
npm install 模塊 --save-dev 安裝好後寫入package.json的devDepencies中(開發環境依賴)
怎麼區分到底安裝包的時候放在dependencies中仍是devDepencies中呢?
很簡單
1.通常你去github或者npm社區裏面相關包的介紹後面都會帶有--save 或者--save-dev 的參數的,這時候把命令直接複製過來運行就OK了,不用管那麼多
2.若是沒有1中的介紹,那麼請思考,這個包究竟是純粹爲了開發方便使用呢?仍是要放到上線後APP的代碼中呢?前者則爲devDepencies,後者則爲dependencies
【注意】:在團隊協做中,一個常見的情景是他人從github上clone你的項目,而後經過npm install安裝必要的依賴,(剛從github上clone下來是沒有node_modules的,須要安裝)那麼根據什麼信息安裝依賴呢?就是你的package.json中的dependencies和devDepencies。因此,在本地安裝的同時,將依賴包的信息(要求的名稱和版本)寫入package.json中是很重要的!