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


 

前言:夜深了,我熬了一鍋熱氣騰騰的package.json,給大家端上來,希望大家喜歡

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去運行了

 

 npm為script字段中的腳本路徑都加上了node_moudles/.bin前綴

 
npm為script字段中的腳本路徑都加上了node_moudles/.bin前綴,這意味着:你在試圖運行本地安裝的依賴在 node_modules/.bin 中的腳本的時候,可以省略node_modules/.bin這個前綴。例如:
我剛npm install webpack了,而在我的項目下的node_modules目錄的.bin子目錄下:

就多了一個叫做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
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM