一. 前言
NPM,是「Newbie Paintball Master」…不對,是「Nobel Prize Magnet」…也不對,好啦!其實是「Node Package Manager」!
雖然本來npm主要是來管理JavaScript的套件(Package),但是越來越多人使用npm,所以在上面可以找到很多其他語言編寫的套件,這也是為什麼npm會被官方惡搞(大家可以點點看官網左上角的小字),因為他已經不是單單為Node.js而生了。
原本是安裝管理Node.js的套件的軟體,本來我們想用別人的code來工作時,需要複製、貼上別人的程式碼到自己的資料夾,但是如果使用npm,我們可以以標準化的方式來安裝、移除或更新這些程式碼。
二. 安裝npm
當你安裝Node.js到電腦上時,npm也會同時被安裝,如果你是使用Mac,可以使用brew install node
來安裝,如果你是使用Windows,請直接到Node.js官網下載安裝檔。
補充:LTS = Long Term Support,代表長期支援的版本
三. 尋找套件
有了npm可以安裝套件後,當然也要有地方找我們想要的套件,除了各個套件自己的網站或Github頁面外,npm自己也有個套件列表,我們可以在此搜尋想要的套件,但有時候有多個套件任君挑選時,我們該如何篩選套件呢?
下面列出一些準則來給各位參考(但非絕對):
- 下載數量:代表了套件的熱門程度
- Release的次數:越多Release代表越常維護
- 最後一次publish的時間:要是套件最後一次更新是兩年前,那麼最好還是再找一下其他套件吧
- Github上issue數:本來是寫越少越好,因為當時單純認為issue數代表問題多寡,但仔細思考後,issue多反而代表該套件十分活躍,所以應該要是越多越好才是(感謝CrazyLion)
- Github上熱門的程度:星號、關注、貢獻,這些當然都是越多越好囉
四. 安裝套件
安裝套件有兩種模式:Local和Global
- Local:代表本地模式,就是安裝在當下的資料夾內,該套件的指令也只有在當下的資料夾才有作用
- Global:代表全域模式,安裝之後不管終端機當下位置在哪都可以執行該套件的指令
Node.js套件使用
基本上請詳細看過套件的README,裡面應該都會詳細說明該如何使用,一般來說是在自己的code前面新增一行:var pkgName = require("pkgName");
,就可以在自己的code內使用該套件的內容了。
指令列表:
- 列出所有npm指令
- npm
- 以本地模式安裝套件
- npm install <package name>
- ex: npm install passport
- 以全域模式安裝套件
- npm install -g <package name>
- ex: npm install -g coffee-script
五. 管理套件
Package.json
要是在本地端安裝套件的話,會看見一個「node_module」出現在資料夾內,裡面放著的就是我們所安裝的套件。
npm如何管理這些套件呢?npm會依照目錄內的「package.json」檔來管理套件,我們不用手動去建立一個json檔,執行npm init
指令就可以了,執行之後會問我們一些問題,回答完畢之後,npm就會依據現有的套件,建立起屬於這個資料夾的package.json檔。
一般來說,假設今天我們寫的一支程式上傳到Github,要是我們把我們所用的套件一起上傳,會十分浪費空間,所以一般我們會在.gitignore內新增一行「node_modules/」,來忽略這個資料夾,但是保留我們的「package.json」,因為只要這個檔案存在,其他下載我們程式的人,可以使用npm install
把紀錄在package.json內的套件安裝回去,而不用在clone的時候就下載一堆套件。
安裝套件並寫入package.json
我們使用npm init
之後,npm會自動根據現有的套件來產生package.json,但是如果我們之後想安裝新的套件並一起被管理呢?
如果只是單純npm install <package name>
,會發現package.json內沒出現新安裝的套件,如果要安裝並同時加入管理的話,要加入—save參數變成npm install --save <package name>
,這樣安裝完畢之後,就會看到package.json內的dependencies多了一行,這正是我們新安裝的套件!
devDependencies是什麼?
我們有些套件是為了方便我們開發程式,但是程式實際上運行時並不會使用到該套件,npm有一個好方法來管理,在安裝的時候加入—save-dev變成npm install --save-dev <package name>
,安裝完畢之後,會發現我們的套件出現在devDependencies內。
至於差別在哪裡呢?我們要是把node module資料夾清空,重新執行npm install
,還是會發現在devDependencies的套件被安裝進去啊!
如果我們要安裝除了devDependencies以外的套件的話,要改成這個指令NODE_ENV=production npm install
,這樣就不會把devDependencies的套件安裝進去了!
指令列表:
- 產生package.json檔
- npm init
- 安裝的同時寫入package.json
- 寫入dependencies
- npm install —save <package name>
- ex: npm install —save passport
- 寫入devDependencies
- npm install —save-dev <package name>
- ex: npm install —save-dev mocha
- 寫入dependencies
- 安裝紀錄在package.json的套件
- 安裝所有套件
- npm install
- 安裝除了dev以外的套件
- NODE_ENV=production npm install
- 安裝所有套件
六. 更新套件
會安裝之後當然也要會更新,但是npm更新的依據又是什麼呢?一樣還是package.json。
Semantic Versioning版號命名法
在討論更新之前,先簡單介紹Semantic Versioning這個版本命名方法,我們時常會看到諸如:Version 2.5.9,那個2.5.9就代表著程式的版本號碼。
- 第一個數字代表主版本號,通常跳一個主版本號都是有重大更新的時候,例如軟體架構大改、取消支援舊瀏覽器等等,容易有和舊版不相容的狀況。
- 第二個數字代表次版本號,通常是有新功能加入,或是某一個功能做了更動,算是比較小的改動,但是很有可能還是會對舊版的使用者造成影響。
- 第三個數字代表修訂版號,基本上就是做一些bug的維修,正常情況下是不會有相容性的問題的。
更新限制
了解了版號命名法後,打開package.json檔,我們會看到例如:"colors": "^1.1.2"
,當然1.1.2就是版本號碼,但是這一行代表什麼意思呢?
- 「^1.1.2」:表示這個套件的更新只會到最新的次版本號
- ex: 1.2->更新、1.5->更新、2.0->不更新
- 「~1.1.2」:表示這個套件的更新只會到最新的修訂版號
- ex: 1.1.3->更新、1.1.5->更新、1.2.0->不更新
為什麼要有這樣的限制?因為我們使用npm,就是不希望手動更新每一個套件,希望npm來自動化更新,但是我們又怕更新了之後,因為相容性的問題造成程式出現錯誤,所以才會用版本號的限制來限制住npm的更新。
檢查是否需要更新
輸入npm outdated
,npm就會列出本地端有哪些套件需要更新。
- Current:代表了現在的版號
- Wanted:代表了我們希望更新的版號(依據package.json)
- Latest:代表了這個套件最新的版號
如果我們想看全域下的npm套件是否需要更新呢?輸入npm -g outdated
就可以囉。
進行更新
檢查更新有分本地和全域,更新一樣也有分。
- 更新全部
- 本地端更新:npm update
- 全域更新:npm update -g
- 更新特定套件
- 本地端更新:npm update <package name>
- 全域更新:npm update -g <package name>
指令列表
- 檢查更新
- 本地端:npm outdated
- 全域:npm -g outdated
- 進行更新
- 更新全部
- 本地端:npm update
- 全域:npm update -g
- 更新特定套件
- 本地端:npm update <package name>
- ex: npm update mocha
- 全域:npm update -g <package name>
- ex: npm update -g coffee-script
- 更新全部
七. 刪除套件
有安裝就會有移除,npm要移除也很簡單,輸入npm uninstall <package name>
就解決了,但是你進入package.json一看,發現被刪除的套件還是在裡面,也就是說,之後只要執行npm install
時還是會被安裝進來。
要連紀錄都移除了話,要加入—save變成npm uninstall --save <package name>
,要刪除devDependencies內的則是npm uninstall --save-dev <package name>
,這樣一來就完整移除套件了!
要移除全域套件的話則是加入-g變成npm uninstall -g <package name>
就可以囉。
指令列表
- 移除本地端套件
- 不移除package.json紀錄
- npm uninstall <package name>
- ex: npm uninstall passport
- 移除package.json紀錄
- 移除dependencies
- npm uninstall —save <package name>
- ex: npm uninstall —save passport
- 移除devDependencies
- npm uninstall —save-dev mocha
- ex: npm uninstall —save-dev mocha
- 移除dependencies
- 不移除package.json紀錄
- 移除全域套件
- npm uninstall -g <package name>
- ex: npm uninstall -g coffee-script
2016-07-09 at 上午 3:12
Github上issue數:基本上越少越好,但也可能是因為很多人測試所造成的現象
=======
我的看法倒是相反,可能是很少人用。 應該是看他issue的動態比較合理。 因為功能需求在github上也是用 issue在管理呢
2016-07-09 at 上午 7:00
的確,重新想思考後的確不太對勁,issue數應該會和活躍度成正比,這個應該要更正一下才對XD
2016-08-15 at 下午 3:04
學習了,很清楚實用的筆記。