你是否遇到過這些問題?

收藏了一篇好文章,幾個月後再打開——空白頁、無限載入的 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.comdocs.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

注意事項

  1. robots.txt:kage 預設遵守 robots.txt 的規則。如果需要在開發/測試環境忽略它,加上 --no-robots
  2. Chrome 依賴:除 Docker 外需要主機安裝 Chrome/Chromium。
  3. 磁碟空間:大型網站複製後可能佔用數 GB 空間。
  4. 合法性:請尊重網站版權和 robots.txt,不要用商業用途或侵犯版權的內容。

總結

kage 是目前最優雅的網站離線複製工具。它用 headless Chrome 真實渲染頁面,移除所有 JavaScript,將動態網頁變成真正的「屬於你」的靜態 HTML。ZIM 打包和自包含可執行檔讓它成為長期封存和分發的完美方案。

如果你經常需要在無網路環境下閱讀文件,或者想永久儲存某些網站的內容,kage 絕對值得加入你的工具箱。