npm 套件發布完整教學:從建立專案到發布自己的 npm Package
前言
在 JavaScript 或 Node.js 的開發中,我們常常會使用許多第三方套件,例如:
npm install axios npm install express npm install lodash
這些套件都來自 npm (Node Package Manager)。
如果自己也開發了一個工具,希望:
- 在不同專案重複使用
- 分享給團隊成員
- 開源給其他開發者使用
就可以將它發布到 npm。
本篇文章將完整介紹如何建立並發布第一個 npm Package。
什麼是 npm?
npm 是 Node.js 官方提供的套件管理平台,提供:
- 套件管理
- 版本控制
- 相依套件管理
- 套件發布
- 套件下載
目前已經擁有數百萬個套件,是 JavaScript 最大的生態系。
安裝 Node.js
確認已安裝 Node.js
node -v
例如
v22.10.0
再確認 npm
npm -v
例如
10.9.0
建立專案
建立一個新的資料夾
mkdir my-first-package cd my-first-package
初始化 npm
npm init
依序輸入:
package name version description entry point author license
也可以直接使用
npm init -y
建立完成後會看到
package.json
內容如下:
{ "name": "my-first-package", "version": "1.0.0", "main": "index.js", "license": "MIT" }
撰寫程式
建立
index.js
內容
function hello(name) { return `Hello ${name}!`; } module.exports = hello;
本機測試
建立
test.js
const hello = require("./index"); console.log(hello("Jeff"));
執行
node test.js
輸出
Hello Jeff!
代表套件運作正常。
建立 npm 帳號
前往
註冊帳號。
登入 npm
終端機輸入
npm login
新版 npm 可能會開啟 Browser Login。
登入成功可確認
npm whoami
若成功會顯示
jeff123
package.json 常用設定
例如:
{ "name": "my-first-package", "version": "1.0.0", "description": "Demo npm package", "main": "index.js", "keywords": [ "demo", "tool" ], "author": "Jeff", "license": "MIT" }
各欄位說明:
| 欄位 | 用途 | 是否必要 | 範例 |
|---|---|---|---|
name |
套件名稱,發布至 npm 時的唯一名稱。 | ✔ 必要 | my-first-package |
version |
套件版本號,遵循 Semantic Versioning(語意化版本)。 | ✔ 必要 | 1.0.0 |
description |
套件簡介,方便使用者了解套件用途。 | 建議 | Demo npm package |
main |
指定套件的入口檔案。 | 建議 | index.js |
keywords |
搜尋關鍵字,提高 npm 搜尋能見度。 | 建議 | ["tool", "utility"] |
author |
套件作者資訊。 | 建議 | Jeff |
license |
套件授權方式。 | 建議 | MIT |
repository |
原始碼儲存庫網址,通常為 GitHub Repository。 | 建議 | https://github.com/jeff/my-first-package |
homepage |
套件首頁或官方文件網址。 | 選填 | https://github.com/jeff/my-first-package |
bugs |
回報 Issue 的網址或 Email。 | 選填 | https://github.com/jeff/my-first-package/issues |
scripts |
定義 npm 指令,例如 test、build、start。 | 建議 | npm run build |
dependencies |
正式環境所需的相依套件。 | 依需求 | axios、lodash |
devDependencies |
開發期間使用的套件,例如 ESLint、Jest。 | 依需求 | typescript、eslint |
files |
指定發佈到 npm 時要包含哪些檔案。 | 建議 | ["dist"] |
發布套件
直接執行
npm publish
第一次可能出現
403 Forbidden
通常原因:
- 名稱已被使用
- 未登入
- 沒有權限
修改 package 名稱即可。
例如
jeff-super-tool
再次發布
npm publish
看到
+ jeff-super-tool@1.0.0
表示成功。
安裝自己發布的套件
任何人都可以安裝
npm install jeff-super-tool
使用方式
const hello = require("jeff-super-tool"); console.log(hello("Jeff"));
更新版本
修改程式後,需要更新版本。
例如
1.0.0
改成
1.0.1
或使用
npm version patch
會自動變成
1.0.1
更新後再次發布
npm publish
Semantic Version(語意化版本)
npm 使用:
Major.Minor.Patch
例如
2.3.5
代表:
Major = 2 Minor = 3 Patch = 5
Patch
修正 Bug
1.0.0 ↓ 1.0.1
Minor
新增功能
1.0.0 ↓ 1.1.0
Major
重大修改(Breaking Change)
1.0.0 ↓ 2.0.0
package-lock.json 要不要發布?
通常:
✔ 發布 Git 專案
保留
package-lock.json
✔ npm Package
通常不用特別處理,npm 發布時主要依據 package.json。
README.md
建議撰寫 README。
例如:
# my-first-package Demo npm package ## Installation ```bash npm install my-first-package ``` ## Usage ```javascript const hello = require("my-first-package"); console.log(hello("Jeff")); ```
README 將會顯示在 npm 網站上。
常見錯誤
403 Forbidden
代表:
- 名稱重複
- 沒登入
- 沒權限
You cannot publish over the previously published versions
代表:
同一個版本不能重複發布。
例如:
1.0.0
已發布。
再次發布
1.0.0
會失敗。
需要更新版本。
例如
1.0.1
npm ERR! code E404
通常代表:
- package 名稱錯誤
- package 尚未發布
發布 Scope Package
若希望使用自己的命名空間,可以建立 Scoped Package。
例如:
@jeff/utils
package.json
{ "name": "@jeff/utils" }
發布時需加入:
npm publish --access public
否則 Scoped Package 預設為 Private。
最佳實務
建議在發布 npm 套件時遵循以下原則:
- 使用有意義的套件名稱,避免與現有套件衝突。
-
維持清楚的
README.md,包含安裝、使用方式與範例。 - 採用 Semantic Versioning 管理版本。
- 在發布前先於本機完整測試功能。
-
使用
.npmignore或files欄位避免將測試資料、設定檔或大型檔案一併發布。 - 定期更新相依套件,修補安全性漏洞。
-
若為開源專案,加入
LICENSE與CHANGELOG.md,方便使用者了解授權方式與版本更新內容。
結語
npm 不只是 JavaScript 的套件管理工具,更是分享與重複利用程式碼的重要平台。無論是將常用工具封裝成套件、建立團隊共用函式庫,或是開源自己的專案,只要掌握建立、測試、版本管理與發布流程,就能輕鬆將程式碼分享給全世界的開發者。
希望透過這篇教學,能幫助你完成第一個 npm Package 的發布,並逐步建立屬於自己的套件生態系。未來也可以進一步學習 TypeScript 支援、自動化 CI/CD 發布流程,以及 GitHub Actions 自動部署,打造更完整的套件開發與維護流程。
留言
張貼留言