news 2026/9/27 3:11:17

如何让一整个网站变成一个可执行文件?kage 自包含离线阅读器打包教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何让一整个网站变成一个可执行文件?kage 自包含离线阅读器打包教程

如何让一整个网站变成一个可执行文件?kage 自包含离线阅读器打包教程

【免费下载链接】kageShadow any website for offline viewing, with the JavaScript stripped out项目地址: https://gitcode.com/gh_mirrors/kage6/kage

kage 是一个用 Go 编写的离线网站阅读器与镜像打包工具:它能克隆整站并剥离 JavaScript,再通过kage pack --format binary把整个网站打包成一个自包含的可执行文件——发给任何人,双击运行即可离线阅读,无需安装任何依赖。

这篇文章带你走完整条路径:安装 → 克隆整站 → 打包成单个可执行文件,并顺带学会跨平台生成、原生窗口版和常见问题。跟着做大约 5 分钟,你就能得到"一个文件 = 一个网站"的离线阅读器。

一、为什么"另存为"救不了你,而 kage 可以?

用浏览器"另存网页"保存的内容,往往只存下一个空壳:页面依赖的 JavaScript 没保存下来,图片样式可能丢失,半年后打开就是一片空白。

kage 走的是一条完全不同的路线:

  • 用真实的无头 Chrome 打开页面,等渲染完成;
  • 对"人类看到的样子"做一次快照,然后删掉全部 JavaScript;
  • 把 CSS、图片、字体全部下载并改写成本地路径。

最终落盘的是能直接打开的纯.html文件——看起来和真实网站一模一样,却不运行任何代码。克隆完成后,再执行一条pack命令,整个文件夹就能被压进一个可执行文件里。

二、一键安装 kage(三种方式任选)

kage 是单文件 Go 程序,安装极其简单。任选其一:

# 方式 1:go install(需要 Go 环境) go install github.com/tamnd/kage/cmd/kage@latest # 方式 2:Homebrew(macOS) brew install --cask tamnd/tap/kage # 方式 3:Scoop(Windows) scoop install kage

💡 kage 会驱动真实浏览器渲染页面,所以系统里需要装有 Chrome 或 Chromium(会自动找到系统安装)。如果你只装了 Docker,也可以直接跑容器镜像:docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com。

三、核心流程:3 条命令,从网站到可执行文件

整个过程只有三步,以经典的 essays 网站 paulgraham.com 为例。

第 1 步:克隆整站到本地

kage clone paulgraham.com

镜像会落在$HOME/data/kage/paulgraham.com/。这一步是个"礼貌的广度优先爬取":它会读取robots.txt、从sitemap.xml自动发现页面,并且按文件路径去重——同一篇文章不管从 http 还是 https 访问都只抓一次。中途按 Ctrl-C 也会保存进度,下次再跑自动续抓。

常用参数速查:

参数作用
--max-pages 50最多渲染 50 页,快速试水
--max-depth 2链接最多跟 2 层
--scope-prefix /doc只抓某个子目录
--scroll自动滚动页面,触发懒加载图片
--refresh增量刷新,抓到新内容

第 2 步:打包成一个可执行文件

kage pack paulgraham.com --format binary -o paulgraham

执行完你会得到一个名为paulgraham的文件,终端输出类似:

packed paulgraham size 21.9 MiB run ./paulgraham to view the site offline

原理很简单:kage 先把镜像写成一个 ZIM 档案(文本 zstd 压缩、媒体原样存放),再把它追加到一份 kage 自身副本的末尾,并在尾部写上一个KAGEPCK1标记记录档案长度。于是这个可执行文件运行起来就是"自带网站数据的服务端":它会在本地随机端口启动,自动打开你的浏览器,整站离线可读。这个拼接逻辑就实现在 pack/binary.go 里。

第 3 步:运行,开始离线阅读

./paulgraham
serving offline site at http://127.0.0.1:52431 (Ctrl-C to stop)

就这样——一个文件,就是一个网站。把它拷进 U 盘、发到邮箱、丢进网盘,接收方不需要安装 kage、不需要 ZIM 阅读器、甚至不需要联网。

四、进阶技巧:跨平台生成"目标系统"的阅读器

追加到末尾的 ZIM 档案是平台无关的,只有基座可执行文件携带架构信息。所以在 Mac 上也能打包出 Windows 版阅读器:只要把--base指向一个 Windows 版 kage 即可,kage 会读取基座的可执行文件头自动识别目标系统,输出自动带上.exe后缀:

# 在 Mac 上,为 Windows 用户生成阅读器 kage pack paulgraham.com --format binary --base kage-windows-amd64.exe # -> paulgraham.exe

三个打包形态怎么选?一张表看懂:

形态命令大小适合场景
ZIM 档案kage pack paulgraham.com最小(纯内容)自己阅读、用 Kiwix 生态打开
自包含可执行文件--format binary≈13 MiB + 站点发给"零依赖"的任何人
双击桌面应用--app≈13.5 MiB + 站点macOS 生成.app,双击即开、无终端、自动用站点 favicon 当图标

⚖️ 代价是体积:可执行文件内嵌了完整 kage,所以无论站点多小都在 13 MiB 起步。只关心内容时用 ZIM 更省空间;ZIM 还是开放标准格式(Kiwix 用的就是它),多年后任何 ZIM 阅读器都能打开。

五、终极形态:弹出原生窗口,而不只是浏览器标签页

默认打包出来的阅读器会打开系统浏览器——网站会变成又一个带地址栏的标签页。想让"它就是个 App"的感觉更彻底?用webview编译标签重建 kage,它就会改用操作系统的 WebView(macOS 为 WKWebView、Windows 为 WebView2、Linux 为 WebKitGTK)在独立原生窗口中展示站点:

make build-webview # 或:CGO_ENABLED=1 go build -tags webview ./cmd/kage kage pack paulgraham.com --format binary --base bin/kage -o paulgraham ./paulgraham # 弹出原生窗口,没有浏览器

这正是文章开头那张截图的效果:整站离线、独立的窗口、标题栏直接来自档案的标题。

六、常见问题速查

问题解决方法
镜像太大,打包太慢克隆时加--max-pages/--scope-prefix控制范围
macOS 首次运行被 Gatekeeper 拦截执行xattr -d com.apple.quarantine ./paulgraham解除隔离
Windows 上想双击无黑框用 release 里的 GUI 版基座:--base kage-windows-gui-amd64.exe
重新打包时想省时间kage pack支持--incremental,只压缩发生变化的数据块

七、想看源码?从这里入手

整个"打包成可执行文件"的功能代码量很小,非常适合作为 Go 入门阅读:

  • 打包命令与参数解析:cli/pack.go
  • 二进制拼接(ZIM 追加 + 尾部标记):pack/binary.go
  • ZIM 读写实现(纯 Go):zim/writer.go、zim/reader.go
  • 离线服务处理:pack/serve.go
  • 更多打包细节:docs/content/guides/packing-a-mirror.md

总结:kage clone把网站变成纯静态镜像,kage pack --format binary再把镜像和一个迷你 kage 拼成一个可执行文件。三条命令,一个文件,一个可以随时离线打开的完整网站——这就是把整站塞进一个可执行文件的全部秘密。🚀

【免费下载链接】kageShadow any website for offline viewing, with the JavaScript stripped out项目地址: https://gitcode.com/gh_mirrors/kage6/kage

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 3:08:06

Windows 下 MSYS2 + MinGW64 安装与使用 OpenCV 全指南(含踩坑记录)

本文记录了在 Windows 上使用 MSYS2 的 MinGW64 环境安装、编译、运行 OpenCV 的完整过程,并整理了实际遇到的典型错误与解决方案。适合刚接触 MSYS2 / MinGW / OpenCV 的 C 开发者。一、背景与核心概念 在 Windows 上编译 C OpenCV 程序,常见的工具链组…

作者头像 李华
网站建设 2026/9/27 3:07:22

高通Rel-18 PDF:未来3-5年5G基站与终端设计的风向标

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 3:07:10

tick-stock-panel财务分析指南:利润表资负表现金流与AI解读怎么用

tick-stock-panel财务分析指南:利润表资负表现金流与AI解读怎么用 【免费下载链接】tick-stock-panel TSP自托管、零运维的 A 股「选股 监控 回测」量化工作台 | LLM能力驱使策略定制个股分析复盘 | 自由接入第三方数据源与个性化扩展数据 | 个人开源 项目地址:…

作者头像 李华
网站建设 2026/9/27 3:05:37

四光吊舱深度拆解:硬件结构、图像算法与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 3:04:31

禾赛AT128P激光雷达ROS驱动配置与网络调试实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 3:01:20

VESC刷固件救砖指南:SWD与ST-Link的STM32CubeProgrammer实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华