你是否遇到過這些問題?
收藏了一篇好文章,幾個月後再打開——空白頁、無限載入的 spinner,或是一個已經不存在的 analytics 伺服器請求導致整個頁面卡死。這個頁面從來就不屬於你,它只是別人 JavaScript 的一個瘦客戶端。
另一個場景:你需要在無網路環境下閱讀某個文件站(飛機上、野外作業、或是某個機房),或者你想永久儲存某個網站的內容以防它某天突然下線。
今天介紹的 kage(日語「影」,讀作 /ka-ge/),就是為了解決這些問題而生的。
kage 是什麼?
kage 是一個用 Go 編寫的開源命令列工具,它透過 headless Chrome 真實渲染頁面,等待頁面載入完成後截取 DOM 快照,然後自動刪除所有 JavaScript,並將 CSS、圖片、字型等靜態資源下載到本機。最終你得到的是一個可以在磁碟上直接開啟的 .html 檔案集合,完全不依賴網路,不執行任何腳本。
- ⭐ GitHub Stars: 2600+(2026 年 6 月建立,成長迅猛)
- 🏷️ 語言: Go
- 📜 授權條款: MIT
- 🧑💻 作者: tamnd
kage vs 傳統「另存新檔」
| 特性 | 瀏覽器「另存新檔」 | wget / curl | kage |
|---|---|---|---|
| JavaScript 渲染 | ❌ | ❌ | ✅ headless Chrome 完整渲染 |
| 自動移除 JS | ❌ | ❌ | ✅ 徹底刪除所有腳本 |
| SPA/動態內容支援 | ❌ | ❌ | ✅ 支援 Vue/React/Angular 頁面 |
| 整站複製 | ❌ | ⚠️ 有限 | ✅ 自動追蹤連結,廣度優先爬取 |
| 打包為單一檔案 | ❌ | ❌ | ✅ ZIM / 自包含可執行檔 |
| 離線可用 | ⚠️ 經常失敗 | ⚠️ 經常失敗 | ✅ 完美離線 |
核心工作原理
存取 URL → headless Chrome 渲染 → 等待頁面穩定 → 截取最終 DOM → 刪除所有 <script> → 下載 CSS/圖片/字型 → 儲存到本機 → 繼續追蹤連結
kage 不是簡單下載 HTML 原始碼,而是像一個真正的瀏覽器那樣渲染頁面,確保最終儲存的就是使用者肉眼看到的完整頁面。
安裝 kage
kage 提供了多種安裝方式,涵蓋 Linux、macOS、Windows 三大平台。
方式一:透過 Go 安裝
如果你已經安裝了 Go(推薦 Go 1.21+):
go install github.com/tamnd/kage/cmd/kage@latest
方式二:透過 Homebrew(macOS)
brew install --cask tamnd/tap/kage
方式三:透過 Scoop(Windows)
scoop bucket add tamnd https://github.com/tamnd/scoop-bucket
scoop install kage
方式四:透過 apt(Ubuntu/Debian)
# 新增儲存庫金鑰和來源
curl -fsSL https://tamnd.github.io/linux-repo/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/tamnd.gpg
echo "deb [signed-by=/usr/share/keyrings/tamnd.gpg] https://tamnd.github.io/linux-repo/apt stable main" | sudo tee /etc/apt/sources.list.d/tamnd.list
sudo apt update && sudo apt install kage
方式五:透過 dnf(Fedora/RHEL)
sudo dnf config-manager --add-repo https://tamnd.github.io/linux-repo/dnf/tamnd.repo
sudo dnf install kage
方式六:透過 Docker(無需安裝 Chrome)
Docker 映像檔自帶 Chromium,開箱即用:
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
安裝後驗證
kage --version
kage completion bash # 或 zsh / fish,開啟 tab 自動補齊
注意:kage 需要 Chrome 或 Chromium。除了 Docker 方式外,你需要在主機上安裝一個 Chrome/Chromium。kage 會自動尋找系統安裝路徑;也可以透過
--chrome參數或KAGE_CHROME環境變數來指定。
快速上手:3 分鐘複製一個網站
以 Paul Graham 的部落格為例,讓我們把它完整複製到本機:
# 1. 複製整個網站到 $HOME/data/kage/paulgraham.com/
kage clone paulgraham.com
# 2. 本機預覽
kage serve $HOME/data/kage/paulgraham.com
# 瀏覽器開啟 http://127.0.0.1:8800
這樣就完成了! 所有文章、所有圖片、所有樣式檔案都凍結在你的磁碟上,零網路依賴即可執行。
限制複製範圍
如果你只需要快速體驗,可以限制複製深度:
# 只複製前 50 頁,最多追蹤 2 層連結
kage clone paulgraham.com --max-pages 50 --max-depth 2
# 只複製網站的某個子目錄
kage clone go.dev --scope-prefix /doc
# 跳過某些路徑(排除廣告或無關頁面)
kage clone example.com --exclude /ads --exclude /track
實用參數速查
| 參數 | 預設值 | 說明 |
|---|---|---|
-o, --out |
$HOME/data/kage |
輸出根目錄 |
-p, --max-pages |
0(無限制) |
最多複製 N 頁 |
-d, --max-depth |
0(無限制) |
連結追蹤深度 |
--scope-prefix |
無 | 只複製以該前綴開頭的路徑 |
--subdomains |
false |
包含子網域 |
--scroll |
false |
自動捲動頁面(觸發懶載入) |
--workers |
4 |
並行渲染頁數 |
--no-robots |
false |
忽略 robots.txt |
--refresh |
false |
增量更新已有複製 |
進階功能
1. 自動捲動觸發懶載入
很多現代網站使用圖片懶載入(lazy loading),頁面不捲動時圖片不會載入。kage 支援自動捲動:
kage clone example.com --scroll
這會讓 kage 自動捲動每個頁面到底部,確保所有懶載入的圖片、iframe 等內容都被完整渲染和儲存。
2. 增量更新(--refresh)
一個月前複製的部落格更新了新文章?不需要重新從頭複製:
kage clone paulgraham.com --refresh
--refresh 會重新渲染已有頁面,並抓取新增內容。kage 的複製是冪等的:同一頁面無論透過 http 還是 https 存取,都只儲存一次。
3. 優雅中斷與斷點續傳
複製過程中按 Ctrl+C?沒問題,kage 會自動儲存目前進度:
# 按 Ctrl+C 中斷,下次執行自動從斷點繼續
kage clone paulgraham.com
4. 包含子網域
kage clone example.com --subdomains
這會同時複製 blog.example.com、docs.example.com 等子網域。
打包:從資料夾到單一檔案
複製後的鏡像是一個資料夾,包含數千個小檔案。直接拷來拷去很慢。kage 支援將整個鏡像壓縮為單一檔案。
方案一:打包為 ZIM 檔案
ZIM 是 Kiwix 專案使用的開放離線格式,專為長期封存設計:
# 打包
kage pack paulgraham.com # 產生 paulgraham.com.zim
# 讀取
kage open paulgraham.com.zim # 本機預覽
# 也可以用 Kiwix 開啟
kiwix-serve paulgraham.com.zim # HTTP 服務
為什麼選 ZIM? ZIM 是一個公開的開放標準。你今天用 kage 建立的
.zim檔案,十年後依然可以用 Kiwix 的任何閱讀器開啟。它支援 zstd 壓縮,文字高度壓縮、圖片/媒體按原樣儲存。
方案二:打包為獨立可執行檔
這是 kage 最酷的功能——一個可執行檔 = 整個網站:
# 打包為自包含的二進制檔案
kage pack paulgraham.com --format binary -o paulgraham
# 直接執行,零依賴
./paulgraham
# 自動啟動 HTTP 服務,瀏覽器存取即可
收到這個檔案的人不需要安裝任何東西:不需要 kage、不需要瀏覽器、不需要 ZIM 閱讀器。直接執行就得到整個網站的離線版本。
二進制檔案大約 13 MiB(kage 本體)+ 網站內容大小。
跨平台打包
你可以在 macOS 上為 Windows 打包:
# 在 Mac 上產生 Windows 可執行檔
kage pack paulgraham.com --format binary \
--base kage-windows-amd64.exe
# 輸出 paulgraham.exe
只需從 releases 頁面下載目標平台的 kage 二進制檔案作為 --base 即可。
方案三:雙擊即用的桌面應用程式
加上 --app 參數,kage 會產生帶圖示的桌面應用程式:
# macOS → .app 套件
kage pack paulgraham.com --app
open paulgraham.app
# Linux → AppImage
kage pack paulgraham.com --app --base kage-linux-amd64
# 輸出 paulgraham.AppDir / paulgraham.AppImage
雙擊開啟,沒有終端機視窗,直接進入網站。
實戰場景
場景一:儲存技術部落格作為離線知識庫
# 複製 Paul Graham 全部文章
kage clone paulgraham.com --scroll -o ~/docs/paulgraham
# 打包為 ZIM,放進 Kindle/手機隨時讀
kage pack paulgraham.com
# 或者打包為單一檔案,發給朋友
kage pack paulgraham.com --format binary -o ~/share/paulgraham-essays
場景二:文件站離線版
# 複製 Go 官方文件
kage clone go.dev --scope-prefix /doc --max-depth 3
# 出差飛機上沒網路?本機 serve 即可
kage serve ~/data/kage/go.dev
場景三:長期歸檔
某些網站可能會關閉或遷移。用 kage 可以定期存檔:
# 加入 cron,每月自動更新
# 0 2 1 * * kage clone example.com --refresh
注意事項
- robots.txt:kage 預設遵守
robots.txt的規則。如果需要在開發/測試環境忽略它,加上--no-robots。 - Chrome 依賴:除 Docker 外需要主機安裝 Chrome/Chromium。
- 磁碟空間:大型網站複製後可能佔用數 GB 空間。
- 合法性:請尊重網站版權和 robots.txt,不要用商業用途或侵犯版權的內容。
總結
kage 是目前最優雅的網站離線複製工具。它用 headless Chrome 真實渲染頁面,移除所有 JavaScript,將動態網頁變成真正的「屬於你」的靜態 HTML。ZIM 打包和自包含可執行檔讓它成為長期封存和分發的完美方案。
- GitHub: tamnd/kage
- 官網: kage.tamnd.com
- 授權條款: MIT
- 安裝:
go install github.com/tamnd/kage/cmd/kage@latest
如果你經常需要在無網路環境下閱讀文件,或者想永久儲存某些網站的內容,kage 絕對值得加入你的工具箱。