npm 介紹
什麼是 npm? npm 是 Node Package Manager 的縮寫,是 Node.js 預設的 node 套件管理平台,npm 本機端的相關工具在安裝 node.js 時也會一起安裝,另一套 Package Manager 本機端工具則是 Facebook 推出的 Yarn。
套件做到的事就是別人已經研究過的東西我們可以不需要再研究一次,就像增加魅力的日常穿搭或是實用小物來說,我們其實就可以透過閱讀一些日雜來學習和應用。
小編甚至發現一些日雜還會附贈一些 C/P 值高也實用好看的小物,透過別人整理好的套件,雖然沒辦法個人和客製化,但也能夠在各方面快速達到一個水平,這就是套件的好處。
套件管理工具就像是那些雜誌或是懶人包的型錄,能快速幫我們在方方面面進入狀況,要把到妹跟專案能不能上線似乎有點類似,最重要的就是快速在各方面都能達到某些限制條件的水平。
當撰寫網頁應用程式時,會使用到其他撰寫好的套件或模組,在未使用任何 build tool 時,通常
- 透過 CDN 將樣式或是腳本放在 HTML 中
- 寫在 JavaScript 中動態加入
<script src="">
的 tag
當套件或模組越來越多時,版本或相容管理複雜度就會增加,此時透過 Package Manager 指令能更方便進行套件的管理動作 (安裝、升級或刪除),接下來這篇文章將提到:
- Package json 是什麼
- npm 安裝 node_module 的語法
- node_module 版本號碼
- npm 維護 node_module 的語法
- 用 nvm 管理 node.js 版本
Package.json
NPM 是一個 package manager,當專案什麼都沒有的時候,在安裝 Node.js 後會需要在專案根目錄輸入 npm init
來把專案初始化。
填入相關資訊後,未來所有關於套件的相關配置檔都會存在 package.json
中,安裝第一個套件後同時也會多出一個 package-lock.json 檔來保存安裝的紀錄。
- dependencies: 執行環境會需要
- devDependencies: 開發或測試環境需要
- optionalDependencies: 不一定在每個環境都能夠裝起來
package-lock.json
會在更動 node_modules 或 package.json 的時候自動產生相關紀錄,package-lock.json 會非常詳細記錄相關套件的版本號。
目前總共有 v1 v2 v3 三個版本,v3 版後 lockfile 會藏在 node_modules/.package-lock.json
v1: 相容 npm v5 v6
v2: 相容 npm v7+ 且會向下相容 v1.
v3: 相容 npm v7+ 無法向下相容,因為會藏起來在 node_modules/.package-lock.json
npm install 安裝 node_module 的語法
用最常用的 lodash 舉例,列出幾種指令與結果說明
指令 | node_modules | package.json 說明 |
---|---|---|
npm install lodash; | 專案環境 | 僅安裝最新版本 |
npm install lodash -g; | 全域環境 | 僅安裝最新版本 |
npm install lodash@4.17.4 | 專案環境 | 僅安裝指定版本 |
npm install lodash --save; | 專案環境 | 安裝並加入 dependencies |
npm install lodash --save-dev; | 專案環境 | 安裝並加入 devDependencies |
npm install lodash -O; | 專案環境 | 安裝並加入 optionalDependencies |
透過以下指令可以針對 package.json
做安裝 ,熟悉這些指令在未來我們需要控制 Docker Image 的大小、縮短 CI/CD 的時間上會有很大的幫助。
指令 | 說明 |
---|---|
npm install | 安裝 package.json 中的套件列表 |
npm install --no-optional; | 不安裝 optionalDependencies |
npm install --production | 執行環境,不安裝 devDependencies |
npm install 失敗
- 更新 lockfile
npm i --package-lock-only
- npm install -g npm@X.X.X 退版到適合版本
- 當 Nodejs 從 v14 升級到 v16 以上 lock 檔版本衝突,可選擇 npm 降版或
npm i --force
- 相依性出現問題,可使用
npm install --legacy-peer-deps
npm 套件版本衝突
可以執行 npm ls
+ 套件名稱,舉例來說最常遇到的會是 eslint 的問題,就可以輸入 npm ls eslint
,來看是在什麼地方出現衝突。
npm ci
npm ci
的 ci 是 Clean install 的意思,因為 npm install
有時候會因為套件的升級等等導致安裝失敗,npm ci
會針對 package-lock.json
來還原套件,較適合是用在 CI 環境。
node_module 版本號碼
node_module 版號通常會有三位數字 1.2.3
對應到 主版號.次版號.修訂號
,版號遞增規則如下:
- 主版號:當你做了不相容的 API 修改
- 次版號:當你做了向下相容的功能性新增
- 修訂號:當你做了向下相容的問題修正
- 先行版號及版本編譯資訊: 加到「主版號.次版號.修訂號」的後面,作為延伸
安裝特定版號的方法,可以去 npm 官方提供的計算機試用看看
- 主版號: * or x
- 次版號: 1 or 1.x or ^1.0.4
- 修訂號: 1.0 or 1.0.x or ~1.0.4
- 先行版號: 1.0.0-beta7
npm 維護 node_module 的語法
指令 | 說明 |
---|---|
npm audit | 查看是否 node_modules 有相關資安漏洞 |
npm audit fix | 自動修正相關漏洞 |
npm update | 更新可更新的 node_modules |
npm prune | 清理 node_modules 中不需要的檔案 |
用 nvm 管理 node.js 版本
nvm 是一套管理 node.js 版本的工具,尤其在同時須開發不同版本 node.js 專案時很好用,windows 也有提供開源的版本可以使用。
舉例來說用了這套工具升級就只要兩步驟很簡單
nvm install --lts
nvm use --lts
。
注意事項:
- nvm-windows
- 解除安裝已安裝的 node
- 清空相關資料夾
C:\Program Files\nodejs
- 解除安裝已安裝的 npm
- 清空相關資料夾
C:\Users\<user>\AppData\Roaming\npm
- mac
- 不要用 brew 安裝
指令 | 說明 |
---|---|
nvm install 8.17.0 | 安裝特定版本 |
nvm use 8.17.0 | 使用特定版本 |
.nvmrc
如果專案大多使用不同 Node 版本,也可以在專案中加入 .nvmrc
方便使用。
在專案中新增一個 .nvmrc
然後填入版本即可執行 nvm use
。
1 | 12.16.1 |
.node-version
.node-version
是一個能被多種工具讀取的配置檔,開發者也透過其他跨平台管理工具來管理 Node 的版本。
- fnm: https://github.com/Schniz/fnm
- nvs: https://github.com/jasongin/nvs
- nodenv: https://github.com/nodenv/nodenv
線上發佈服務
- Cloudflare Pages: https://developers.cloudflare.com/pages/platform/build-configuration#language-support-and-tools
- netlify: https://docs.netlify.com/configure-builds/manage-dependencies/#node-js-and-javascript
喜歡這篇文章,請幫忙拍拍手喔 🤣