【npm】夥計,給我來一杯package.json!不加糖

 

前言:夜深了,我熬了一鍋熱氣騰騰的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

 

【吐槽】:怎麼感受好像沒什麼大用哪,不過官方文檔上這樣寫我也只好這樣翻譯過來了。詳細資料左轉: https://github.com/npm/node-semver
 
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)" }
更多license字段的語法規則請右轉: SPDX license表達式的語法規則 2.0版本 https://www.npmjs.com/package/spdx
 

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中是很重要的!
 
參考資料:npm官方文檔packagejson配置篇  https://docs.npmjs.com/files/package.json
 
相關文章
相關標籤/搜索