Node.js 是一個開源、跨平台的 JavaScript 執行環境。在過去幾年中,由於其快速的輸入/輸出 (I/O) 效能和無與倫比的 JavaScript 語法。此外,它的自適應特性允許快速自訂,使這項伺服器技術在競爭對手中脫穎而出。
Node.js 套件管理器 — 概述
Node.js Package Manager 或 npm 是 JavaScript 的預設套件管理器。Npm 常用於安裝專案腳本並在 Node.js 專案中操作外部模組。此外,它會使用 package.json 檔案來追蹤專案中安裝的模組,該檔案位於專案的目錄中。Npm 會儲存並記錄以下資訊:
- 專案所需的模組及其已安裝的版本(若有)。
- 專案的元資料(Metadata)描述,其中包含作者和授權條款等詳細資訊。
- 用於自動化專案相關或目標導向任務的可執行腳本。
在本教學中,我們將引導您完成搭配使用 npm 與 package.json.
我們開始吧!
先決條件
若要進行本教學,您需要具備以下條件:
- Node.js 必須安裝在您的系統中。
-
最新版本的 已安裝的 Ubuntu 於您的系統中。
步驟 1:建立 package.json 檔案
讓我們以一個使用 Node.js locator 模組的虛擬專案為例,開始我們的教學。該專案旨在收集使用者的 IP 位址,並輸出使用者所在的國家。由於我們的重點是理解 Node.js 模組與 npm 的搭配使用,因此不需要手動編寫模組。相反地,我們將在專案中使用預先安裝且可自訂的套件。
JSON 或 JavaScript Object Notation(JavaScript 物件表示法)是用於分享和傳輸資料的標準格式。首先,我們將建立一個 JSON 檔案,用於儲存和管理軟體相依性。然而,手動建立 package.json 是非常費力且耗時的。為了簡化流程,我們將使用 init 指令來建立 package.json 檔案,而不是花費精力從頭編寫額外的程式碼區塊來建立我們的 JSON 。
-
init 指令
首先,讓我們使用 mkdir 指令建立一個新資料夾,並將其命名為 locator:
|
1 |
mkdir locator |
接下來,使用 cd 指令移動到新建立的資料夾:
|
1 |
cd locator |
然後, 輸入 npm 以初始化互動式提示字元:
|
1 |
npm init |
之後,您將會看到輸出:

1. name
您將被引導至新專案的 name;即目前的資料夾。您會看到括號中的預設值 ()。為了保持本教學簡單易懂,我們將採用預設選項。按下 ENTER 以接受並繼續。
2. version
下一個值是 version 名稱,如果您在 npm 套件存放庫中分享您的專案,這是一個關鍵要求。
|
注意: Node.js 套件遵循 語意化版本控制 (semver) 指南。 第一個數字:MAJOR 版本,僅在 API 變更時才會變動。 第二個數字:MINOR 版本,在新增功能時會變動。 最後一個數字:PATCH 版本,在解決錯誤或 Bug 時會變動。 |
3. description
該 description 是一個提供說明資訊的字串,用於描述 Node.js 模組的工作流程。在我們的示範中, locator 專案將獲取使用者的 IP 位址並傳回來源國家。
|
注意: 大多數情況下,模組會有一個 index.js 檔案作為進入點。這也是 main 屬性,即 package.json(npm 模組的進入點)。然而,如果找不到 package.json, Node.js 將會自動載入 index.js 。 |
4. test command
這是一個用於執行專案測試的可執行腳本或指令。由於測試超出了本教學的範圍,讓我們跳過它並按下 ENTER.
5. init command
該 init 指令會要求輸入專案的 GitHub Repository。同樣地,讓我們跳過此部分並繼續。
6. keywords
Keywords 是用於搜尋存放庫的字串陣列。建議保持關鍵字準確並與您的專案相關,以便無縫追蹤。
將這些 關鍵字 列為字串並用逗號分隔。在我們的專案中,請輸入 ip, country, latitude,以及 longitude 於提示字元,您將會看到它們作為關鍵字包含在 package.json.
7. author
將 author 欄位視為意見回饋以及與使用者互動的方式。例如,如果使用者在您的模組中發現錯誤,他們可以使用此欄位通知您並使錯誤得到解決。
-
格式: "姓名 \<電子郵件\> (網站)".
-
示範: "Paul\<paul@your_domain\> (https://your_domain)"
-
新增電子郵件和網站資料是選填的。不過,您可以指定有效的作者,並將您的聯絡資訊新增為 author。確認詳細資訊並按下 ENTER.
8. license
The license 欄位說明了使用者在使用您的模組時必須瞭解的法律條款與條件。由於 Node.js 模組是開源的,npm 會自動將其設定為 ISC-license 。
導覽至開源授權條款頁面,並選擇 Open Source Initiative。如果您不需要存放庫的授權條款,請在提示字元輸入 UNLICENSED。在我們的教學課程中,我們將使用預設的 ISC 授權條款。按下 ENTER 以完成此程序。
The init 指令將會建立 package.json 檔案並顯示結果:

接下來,按下 ENTER 以繼續並建立 package.json 檔案。我們的 JSON 檔案將會記錄我們在專案中安裝的所有模組和套件。
在下一步中,我們將安裝相依性項目和 Node.js 模組。
步驟 2:安裝相依性項目和模組
建立自訂的外部程式庫非常耗時且需要付出艱辛的努力。或者,最有效的方法是安裝預先定義的相依性項目和外部程式庫。在我們的教學課程中,我們將使用 HTTP 程式庫,以允許我們的示範定位器模組發送外部 API 請求來收集地理數據。
在本指南中,我們將使用 axios 程式庫來發送 HTTP 請求。首先,讓我們 安裝 axios:
|
1 |
npm install axios --save |
首先安裝 npm 套件,然後以空格分隔列出它們。此外,請包含 --save 標記,以確保該專案被儲存為專案相依性項目。
您將會看到以下輸出:

開啟 package.json ,使用 nano 或您選擇的任何文字編輯器:
|
1 |
nano package.json |
請注意程式碼區塊底部醒目提示的新增屬性:

-
下載開發相依性項目
開發相依性項目是專案開發中使用的套件,在專案的生產或維護中沒有用處。雖然這些相依性項目在生產環境中可能聽起來沒有作用,但它們在編寫和重寫程式碼中扮演著重要角色。
就像程式碼 Linter 一樣,開發相依性項目在軟體開發中扮演著至關重要的角色。大多數情況下,開發人員會使用 code linters 來在專案開發期間保持樣式的一致性,否則這在生產環境中是徒勞無功的。
讓我們安裝一個 Linter 作為您專案的開發相依性項目。此外,請使用 --save-dev 旗標來將 eslint 儲存為開發所需的相依性項目:
|
1 |
npm i eslint@6.0.0 --save-dev |
我們將 @6.0.0 新增到我們的相依性項目中,以便在我們更新模組時,它們會被標記版本。符號 @ 將會通知 npm 搜尋您想要安裝的特定標記。現在,重新開啟 package.json 檔案:
|
1 |
nano package.json |
您將會看到以下輸出:

- 自動產生的檔案: node_modules 以及 package-lock.json
一開始,在將套件安裝到 Node.js 專案時, package.json 和 package-lock.json 檔案會自動建立。在工作目錄中確認這些檔案:
![]()
由於大多數安裝的相依性項目都儲存在 node_modules 資料夾,建議不要將此資料夾提交到您的版本控制存放庫中。隨著安裝的相依性數量增加, node_modules 的大小也會增加。
相反地, package-lock.json 檔案會記錄安裝的確切版本,因此不需要明確包含 node_modules。與 node_modules 資料夾不同,您可以將此檔案提交到您的版本控制存放庫中,因為它詳細呈現了您所有的相依性及其版本。
- 安裝使用 package.json
The package.json 和 package-lock.json 檔案允許您在啟動專案開發之前設定相同的專案相依性。導覽至您的目錄樹,並在與 locator 相同的目錄層級中建立一個新資料夾。將新資料夾命名為 cloned_locator:
|
1 2 |
cd .. mkdir cloned_locator |
接下來,移至 cloned_locator:
|
1 |
cd cloned_locator |
匯入 package.json 和 package-lock.json 檔案,從 locator 到 cloned_locator:
|
1 |
cp ../locator/package.json ../locator/package-lock.json . |
The . 代表目前資料夾。使用以下指令安裝所需的模組:
|
1 |
npm i |
起初,npm 將會檢查 package-lock.json 檔案以安裝模組。如果 lock 檔案無法使用,它會讀取 package.json 檔案來決定安裝內容。
一般來說,從 package-lock.json 安裝很簡單,因為 lock 檔案包含模組及其相依性的確切版本。這意味著當您使用 package.json, npm 將節省尋找相容且穩定版本所需的額外時間。
透過新增 --production 標籤來忽略開發相依性:
|
1 |
npm i --production |
之後,回到 locator:
|
1 |
cd ../locator |
- 全域安裝
到目前為止,我們已經在本地安裝了 npm 模組。然而,您也可以選擇在全域安裝套件,並透過 shell 指令或 CLI 使用它們。例如,您可以使用 Hexo 程式庫來導覽目前的 locator 專案並管理您的靜態網站。使用以下指令搭配 -g 標籤來全域安裝 Hexo CLI:
|
1 |
npm i hexo-cli -g |
|
注意: 如果您在全域安裝套件時遇到錯誤,請嘗試此指令 sudo npm i hexo-cli -g (使用 root 憑證)。 |
使用以下指令驗證套件是否已成功安裝:
|
1 |
hexo --version |
您將會看到以下輸出:

步驟 3:管理與更新模組
套件管理員的功能不僅僅是安裝 Node.js 模組。它還提供了許多自訂選項,您可以根據需要列出、更新、解除安裝,甚至加入安全性層。
在本節中,我們將學習如何:
-
列出模組
-
更新模組
-
解除安裝模組
-
稽核模組
讓我們詳細討論每一個部分:
-
列出模組
顧名思義,列出模組將為您提供專案中安裝的所有模組的詳細資訊。您不必閱讀 package.json 檔案,而是可以使用 ls 或 list 指令來詳細了解您的專案模組:
|
1 |
npm ls |
您將會看到以下輸出:

預設情況下, ls 指令會列出整個相依性樹狀結構,其中包含專案相依性及其所依賴的模組。然而,您也可以獲得鳥瞰視圖,並明確針對特定模組。使用以下指令來檢查您已安裝但未包含其相依性的模組:
|
1 |
npm ls --depth 0 |
您將會看到以下輸出:

-
更新模組
建議始終保持您的 npm 模組處於最新狀態,以免遇到任何軟體當機或衝突。使用以下指令檢查是否需要更新:
|
1 |
npm outdated |
您將會看到以下輸出:

讓我們詳細了解每個術語:
- 套件 (Package): 它列出目前在您專案中安裝的 Package 。
- 目前 (Current): 這顯示套件的 Current 版本。
- 期望 (Wanted): 顯示 npm 最符合版本要求的版本,位於 package.json.
- 最新: 它顯示了最新的 npm 發佈版本,如果需要,您必須進行更新。
- 位置: 該套件 位置 在相依性樹狀結構中。
如上所述,我們可以將我們的 npm 更新至穩定版本。使用以下指令來更新您目前的套件:
|
1 |
npm up eslint |
您將會看到以下輸出:

除了逐一更新之外,您也可以使用 up 指令一次更新所有模組:
|
1 |
npm up |
-
解除安裝模組
很多時候,相依性可能無法顯示預期的輸出,而您需要建立自訂的相依性。在這種情況下,您可以選擇從您的 package.json 和 package-lock.json 檔案中解除安裝相依性。假設您將 axios 作為相依性,但它無法提供令人滿意的結果。您無疑會從專案中移除此儲存庫。使用 uninstall 或 un 指令來移除 axios:
|
1 |
npm un axios |
您將會看到以下輸出:

雖然 uninstall 指令移除了該相依性,但我們沒有收到任何移除通知。讓我們列出相依性,看看現在有多少個相依性:
|
1 |
npm ls --depth 0 |
您將會看到輸出,列表中沒有出現 axios 相依性:

-
稽核模組
如果專案中安裝的相依性容易受到任何潛在的安全威脅,您可以偵測它們。首先,您需要安裝舊版本的 request 模組,以查看稽核模組是如何運作的:
|
1 |
npm i request@2.60.0 |
您將會看到提示修復威脅或漏洞的輸出:

若要展開漏洞和威脅的詳細資訊,請使用 audit 指令:
|
1 |
npm audit |
您將會看到詳細的安全報告:

若要解決這些漏洞,請使用 fix 指令:
|
1 |
npm audit fix |
您將會看到以下輸出:

您可能已經注意到,九個漏洞中有兩個已修復。然而,其餘七個漏洞仍然存在於您的相依性中,因為 audit fix 並不能解決所有問題。為了解決這個問題,您可能需要使用不同的 API 將相依性更新到更高的版本。更新時請務必小心,因為有可能會破壞相依性樹狀結構中較上層的程式碼。使用以下指令確認漏洞已消失:
|
1 |
npm audit fix --force |
使用不同的 API 來解決漏洞威脅時請務必留意,因為如果您不確定,可能會導致程式碼功能損壞。
結論
總結來說,我們示範了如何將 Node.js 模組與 npm 以及 package.json 搭配使用。此外,我們還介紹了列出、更新、管理、稽核和解除安裝套件相依性的方法。作為下一個挑戰,我們鼓勵您使用本指南中討論的概念,並親自嘗試安裝和測試套件。您也可以嘗試 建置 Node.js 應用程式 並 設定相依性 以提升您的學習成效。
此外,還有許多關於 Node.js 和 JavaScript 主題的其他學習教材,您可以在 我們的部落格上找到:
- 在 CentOS 8 上安裝 Node.js:完整指南
- 將 PostgreSQL 與 Node.js 應用程式連結:教學課程
- 在 React 應用程式中使用 HTTP 用戶端 Axios:教學課程
- 如何使用 Docker 在 Ubuntu 20.04 上部署 Node.js (Express.js) 應用程式
祝您開發愉快!
留言
目前尚無留言。成為第一個留言的人吧。