Node.js 除了能在伺服器端執行 JavaScript,更帶來了 npm(Node Package Manager)生態系,讓開發者能以數十萬個開源套件加速開發。而 npx 則讓我們能在不全局安裝的前提下執行 npm 套件中的命令。三者組合起來,構成現代 JavaScript 開發的基石。
本文整理 Node.js、npm、npx 的核心概念與 60 個常用指令,從環境安裝到套件管理、專案初始化到布署,一次學會。
Node.js 基礎概念
Node.js 是一個基於 V8 引擎的 JavaScript 伺服器執行環境。它使用事件驅動、非阻塞 I/O 模型,輕量且高效,非常適合 I/O 密集型應用。
版本管理
| 指令 | 說明 |
|---|---|
node -v |
顯示目前 Node.js 版本 |
npm -v |
顯示目前 npm 版本 |
node -p "process.version" |
透過 process 物件顯示版本 |
nvm ls |
列出 nvm 管理的所有 Node.js 版本 |
nvm use <version> |
切換到指定 Node.js 版本 |
nvm install <version> |
下載並安裝指定 Node.js 版本 |
nvm alias default <version> |
設定預設 Node.js 版本 |
💡 nvm(Node Version Manager) 讓你在同一台電腦上管理多個 Node.js 版本,避免不同專案對版本的依賴衝突。
執行 JavaScript 檔案
| 指令 | 說明 |
|---|---|
node app.js |
執行指定 JS 檔案 |
node -e "console.log('hello')" |
直接執行一行 JavaScript |
node --inspect app.js |
啟用偵錯模式啟動 |
node --inspect-brk app.js |
啟用偵錯並暫停在第一行 |
Node.js 模組系統
Node.js 支援 CommonJS(require)與 ES Modules(import)兩種模組語法。
| 語法 | 說明 |
|---|---|
require('fs') |
CommonJS 匯入核心模組 |
module.exports |
CommonJS 匯出 |
import fs from 'fs' |
ESM 匯入(需 package.json 設定 type: "module") |
export default |
ESM 匯出 |
npm 核心概念
npm 由三部分組成:CLI(命令列界面)、Registry(全球最大的 JavaScript 套件倉庫)、Website(套件資訊查詢)。npm 會在專案中建立 node_modules 資料夾存放所有依賴。
npm init — 初始化專案
在專案根目錄執行 npm init 會引導式建立 package.json 檔案。
# 互動式建立 package.json(問答題)
npm init
# 跳過問答,使用預設值
npm init -y
# 使用指定初始化器(等同 npm exec create-foo)
npm init vue@latest
| 指令 | 說明 |
|---|---|
npm init |
互動式建立 package.json |
npm init -y |
使用預設值快速建立 package.json |
npm init <initializer> |
使用指定初始化器建立專案(如 vue、next) |
npm pkg set <key>=<value> |
直接設定 package.json 的欄位值 |
npm install — 安裝套件
npm install 是最常用的指令,用於安裝專案依賴。
# 安裝 package.json 中的所有依賴
npm install
# 安裝指定套件到 dependencies
npm install lodash
# 安裝指定套件到 devDependencies
npm install --save-dev jest
npm i -D jest
# 安裝套件的指定版本
npm install react@18
# 安裝特定 tag版本 (beta / latest / next)
npm install react@beta
# 全域安裝(不推薦,尤其是工具)
npm install -g typescript
# 安裝 .tgz 檔案
npm install ./package.tgz
# 從 GitHub 安裝
npm install username/repo
npm install github:user/repo#v1.0.0
| 指令 | 說明 |
|---|---|
npm install |
安裝 package.json 中所有依賴 |
npm install <pkg> |
安裝指定套件到 dependencies |
npm i <pkg> |
install 的縮寫 |
npm i -D <pkg> |
安裝到 devDependencies |
npm i -g <pkg> |
全域安裝 |
npm ci |
基於 package-lock.json 的乾淨安裝(CI 用) |
⚠️ npm ci 與 npm install 的差別:npm ci會刪除原有的node_modules並根據package-lock.json進行完整安裝,速度快且確保環境一致性,非常適合 CI/CD 流程。
npm uninstall / update / outdated — 管理套件版本
| 指令 | 說明 |
|---|---|
npm uninstall <pkg> |
移除指定套件 |
npm uninstall <pkg> -g |
移除全域套件 |
npm update <pkg> |
更新套件到符合 package.json 的版本 |
npm update -g <pkg> |
更新全域套件 |
npm outdated |
檢查本地套件是否有新版本 |
npm outdated -g --depth=0 |
檢查全域已過時的套件 |
npm ls — 查看依賴樹
| 指令 | 說明 |
|---|---|
npm ls |
列出目前專案的所有依賴 |
npm ls --depth=0 |
只顯示頂層依賴(不遞入) |
npm ls -g |
列出全局安裝的套件 |
npm ls -g --depth=0 |
顯示全局頂層套件 |
npm ls <pkg> |
檢查特定套件是否安裝 |
npm run — 執行腳本
npm 可以在 package.json 的 scripts 區塊定義指令腳本,並透過 npm run 執行。
// package.json
{
"scripts": {
"dev": "vite",
"build": "vite build",
"test": "jest",
"lint": "eslint ."
}
}
# 執行腳本
npm run dev
npm run build
npm test # 等同 npm run test
# 列出所有可用的腳本
npm run
# 執行前顯示指令(不執行)
npm run dev --dry-run
npm test — 執行測試
| 指令 | 說明 |
|---|---|
npm test |
執行 package.json 中定義的 test 腳本 |
npm test -- <args> |
傳遞參數給 test 腳本 |
npm run test:unit |
執行命名為 test:unit 的腳本 |
npm publish — 發布套件
⚠️ 發布前請三思: npm publish 一旦完成就無法撤回,發布前記得檢查版本號和是否已發布過。
| 指令 | 說明 |
|---|---|
npm publish |
發布套件到 npm registry |
npm publish --access public |
發布 scoped 套件為公開 |
npm publish --tag beta |
發布到指定 tag |
npm version <update> |
更新版本號(patch/minor/major) |
npm whoami |
查看目前登入的 npm 用戶 |
npm login |
登入 npm 帳號 |
# 發布流程範例
npm login
npm version patch
npm publish
npm cache / npm config / npm doctor
| 指令 | 說明 |
|---|---|
npm cache clean --force |
清除 npm 快取 |
npm cache verify |
驗證快取完整性 |
npm config list |
顯示所有 npm 設定 |
npm config set <key> <value> |
設定 npm 配置 |
npm config get <key> |
讀取 npm 配置值 |
npm doctor |
檢查 npm 環境是否正常 |
npm info <pkg> |
查詢套件的詳細資訊 |
npx 完整攻略
npx 是 npm 5.2.0 版本 bundled 的一個工具。它的存在解決了一個問題:在執行 npm 套件中的命令時不需要全局安裝,只需透過 npx 下載到快取並執行。
npx 的三種主要用途
1. 執行已發布的 npm 套件命令
💡 最佳實踐: 當你不確定專案會不會長期使用某個工具時,盡量用 npx 執行,而非全局安裝。
# 執行 create-react-app,不需全局安裝
npx create-react-app my-app
# 指定版本
npx create-react-app@5 my-app
# 加上 --yes 自動確認安裝
npx create-react-app my-app --yes
# 使用 --package 指定套件來源
npx --package=vue-cli vue --version
2. 執行本地已安裝的套件命令
如果套件已在本地 node_modules/.bin 中,npx 會直接執行,無需重新下載。
# 在本地安裝 jest 後執行
npx jest
# 執行本地 vite(不需全局安裝)
npx vite build
3. 執行 GitHub 上或本地的包
# 從 GitHub 執行
npx github:owner/repo
# 從本地檔案執行
npx ./package.tgz
| 指令 | 說明 |
|---|---|
npx <cmd> |
執行 npm 套件中的命令 |
npx -p <pkg> <cmd> |
指定套件來源後執行命令 |
npx --yes <cmd> |
自動確認安裝提示 |
npx --no <cmd> |
自動拒絕安裝提示 |
npx -c 'cmd1 && cmd2' |
執行串連命令 |
npm exec <cmd> |
npm exec 為 npx 的官方別名 |
🎯 npx vs npm exec: npx 和 npm exec 在本質上是相同的,npm exec 只是將 npx 整合到 npm 工作流程中。兩者可以互換使用,npx 保留是為了向後兼容。
npx 常見使用場景
# 初始化專案(React)
npx create-react-app my-app
# 初始化專案(Vue)
npx @vue/cli create my-vue-app
# 升級 TypeScript 編譯器
npx tsc --version
# 使用 ESLint 檢查
npx eslint .
# 運行 Storybook
npx storybook dev -p 6006
# 執行 Prisma 資料庫遷移
npx prisma migrate dev
# 初始化 Vite
npx vite
package.json 結構
{
"name": "my-app",
"version": "1.0.0",
"description": "我的專案描述",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest"
},
"keywords": ["node", "express"],
"author": "Your Name <you@example.com>",
"license": "MIT",
"dependencies": {
"express": "^4.18.0"
},
"devDependencies": {
"jest": "^29.0.0"
}
}
版本號語義
npm 使用 語義化版本 (SemVer):major.minor.patch,例如 1.2.3。
| 語法 | 說明 |
|---|---|
1.2.3 |
固定版本 |
^1.2.3 |
相容更新(預設):>=1.2.3 < 2.0.0 |
~1.2.3 |
近似更新:>=1.2.3 < 1.3.0 |
>=1.2.3 |
大於或等於指定版本 |
<2.0.0 |
小於指定版本 |
* |
任意版本 |
開發工作流程總結
一個典型的 Node.js 專案開發流程如下:
# 1. 初始化專案
npm init -y
# 2. 安裝依賴
npm install express
npm i -D nodemon jest
# 3. 新增腳本
npm pkg set scripts.dev="nodemon app.js"
npm pkg set scripts.test="jest"
# 4. 開發 & 測試
npm run dev
npm test
# 5. 檢查過時套件
npm outdated
npm update
# 6. 發布 (若為函式庫)
npm version patch
npm publish
常見問題與技巧
npm 報錯:ERESOLVE 依賴衝突
當遇到依賴衝突(兩個套件需要不同版本的同一套件):
# 嘗試使用 --legacy-peer-deps 繞過
npm install --legacy-peer-deps
npm 報錯:npm ERR! 無法移除 node_modules
# 手動刪除 node_modules 和 lock 檔案
rm -rf node_modules package-lock.json
npm install
npm 速度慢?切換 registry
# 使用 npmmirror (npm 中國鏡像)
npm config set registry https://registry.npmmirror.com
# 恢復官方 registry
npm config set registry https://registry.npmjs.org
# 或使用 nrm 管理 registry
npm i -g nrm
nrm use npmmirror
🎯 快速回顧: npm 用於管理依賴(packages),npx/npx exec 用於臨時執行套件命令;npm ci 適合部署時使用;npm run 管理專案腳本;npm publish 發布函式庫。養成使用 nvm 管理版本的習慣,能大幅減少環境問題。