Bun Shell 腳本實戰教學:取代 Node.js 開發工作流的完整指南
什麼是 Bun Shell?
Bun 1.0.24 版本加入的 Bun Shell(即 Bun.$ API)正在改變開發者寫自動化腳本的方式。Bun Shell 是一個跨平台的 shell scripting 解決方案,讓你用 TypeScript/JavaScript 寫出同時能在 macOS、Linux 和 Windows 上跑的腳本,不需要擔心 bash 和 PowerShell 的語法差異。它直接整合在 Bun runtime 裡,不需要額外安裝任何依賴。
為什麼取代 bash 和 Node.js 腳本?
bash 腳本對 JavaScript 開發者來說有很多摩擦點:跨平台相容性問題(Windows 上的 Git Bash 和 WSL 行為不一致)、複雜的字串處理語法、缺乏型別安全、難以測試。用 Node.js 寫腳本也有自己的麻煩:需要 child_process 來執行系統命令,語法冗長;需要手動安裝 shelljs、execa 等套件;啟動時間比 bash 慢。Bun Shell 的優勢:TypeScript 原生支援(不需要 ts-node 或預編譯)、極速啟動(比 Node.js 快 4 倍以上)、跨平台(同一份腳本在 mac、Linux、Windows 都能跑)、內建工具(不需要 npm 安裝 shelljs)、現代 JavaScript 語法全部可用。
安裝與設定
在 macOS 或 Linux 上安裝 Bun:curl -fsSL https://bun.sh/install | bash。Windows 則用 PowerShell 執行 irm bun.sh/install.ps1 | iex。安裝完成後用 bun --version 確認版本是 1.x.x 以上。建立你的第一個 Bun Shell 腳本,在專案根目錄建立 scripts/build.ts,在檔案開頭加上 shebang 並且 import { $ } from bun,就可以開始使用 Bun Shell 了。執行方式:bun run scripts/build.ts,或加上執行權限後直接執行。
Bun.$ 語法基礎
Bun.$ 使用 Tagged Template Literals 語法,跟 shell 命令非常接近。await $ 執行命令;.text() 捕捉文字輸出;.json() 直接解析 JSON 輸出;用 pipe 串接命令。在 template literal 中插入 JS 變數時,Bun Shell 會自動做 shell escaping,避免 shell injection 安全問題。錯誤處理:用 try/catch 捕捉失敗的命令,或用 .nothrow() 讓命令失敗不拋出例外,改為讀取 result.exitCode 判斷成功。
檔案系統操作
Bun 提供了比 Node.js 更簡潔的檔案操作 API:Bun.file(path).text() 讀取文字檔;Bun.write(path, content) 寫入檔案;new Bun.Glob 做 glob 搜尋;Bun.file(path).exists() 檢查檔案是否存在。Bun 的檔案 I/O 比 Node.js 的 fs 模組快很多,對追求建置效率的專案特別有價值,可以搭配 Turbopack 效能指南 中的優化思路,打造出極速的開發工作流。
HTTP 請求與 API 呼叫
Bun 內建 fetch API,跟瀏覽器完全相容,不需要安裝 axios 或 node-fetch。基本 GET 請求:const response = await fetch(url),然後 response.json() 或 response.text() 取得結果。POST 請求傳入 method: POST、headers 和 JSON.stringify(body)。實用場景:在 CI/CD 腳本的尾端,用 fetch 呼叫 Slack Webhook 發送部署通知;或者呼叫 GitHub API 自動建立 Release tag,只需要幾行程式碼,不需要安裝任何套件。
實戰範例
建置腳本:清理 dist 目錄、執行 TypeScript 類型檢查(bun tsc --noEmit)、執行測試(bun test)、打包程式碼(bun build src/index.ts --outdir dist --minify)、複製靜態資源。所有步驟都是 async/await,清晰易讀,比傳統的 npm scripts 更容易維護。資料庫遷移腳本:讀取 migrations 目錄下所有 .sql 檔案,按照檔名排序後依序執行,搭配 Bun.file().text() 讀取 SQL 內容,再傳給 psql 命令執行,整個腳本不需要任何 npm 依賴,啟動速度極快,適合放在 CI pipeline 的 pre-deploy 步驟中。程式碼生成腳本:讀取 OpenAPI spec,解析成物件,自動生成 TypeScript client 程式碼,搭配 Zustand 狀態管理 中的模式,在 Bun 腳本中也可以使用輕量的狀態機來管理多步驟任務的進度追蹤。
何時用 Bun Shell vs bash vs Node.js
選擇 Bun Shell 的情況:需要跨平台支援的腳本(開發環境有 Windows 用戶)、需要型別安全的複雜邏輯、需要處理 JSON 或複雜資料結構、Node.js 腳本但想要更快的啟動速度。繼續用 bash 的情況:目標環境只有 Linux/macOS、腳本極度簡單(幾行命令)、需要和現有 bash 腳本深度整合。繼續用 Node.js 的情況:團隊對 Bun 不熟悉、需要某些只有 Node.js 生態有的套件。Bun Shell 在 Next.js PPR 效能優化 這類強調建置效率的場景中特別有價值——快速的建置腳本可以讓 CI/CD pipeline 縮短幾分鐘,積累下來是顯著的時間節省。Bun Shell 不是要取代所有腳本工具,而是在「需要 TypeScript 語法的跨平台腳本」這個場景提供了一個比以往更好的解決方案。試試看用 Bun Shell 重寫你現有的 build 或 deploy 腳本,你會發現程式碼更清晰、執行更快,維護起來也更方便。
繼續閱讀
Next.js Partial Prerendering (PPR) 完整教學:靜態殼加動態串流大幅提升 LCP
Next.js 15 的 Partial Prerendering(PPR)是近年來前端效能優化最令人興奮的突破之一。它讓你在同一個頁面中,同時擁有靜態內容的極速首屏和動態內容的即時更新。本文深入解析 PPR 的運作原理,並帶你實作靜態殼加動態串流的頁面架構,讓你的 Core Web Vitals 分數大幅提升。
相關文章
Next.js Partial Prerendering (PPR) 完整教學:靜態殼加動態串流大幅提升 LCP
Next.js 15 的 Partial Prerendering(PPR)是近年來前端效能優化最令人興奮的突破之一。它讓你在同一個頁面中,同時擁有靜態內容的極速首屏和動態內容的即時更新。本文深入解析 PPR 的運作原理,並帶你實作靜態殼加動態串流的頁面架構,讓你的 Core Web Vitals 分數大幅提升。
Rspack 2.0 完整指南:Rust 打包工具與 Webpack 遷移實戰 2026
Rspack 2.0 是以 Rust 開發的高效能 webpack 相容打包工具,建構速度比 webpack 快 5-10 倍。
你可能也喜歡
探索其他領域的精選好文