博客

用 Pake CLI 打包本地 HTML 或静态站点

打包应用 · · 约 6 分钟

先照常跑一遍生产构建,再让 Pake CLI 指向输出目录,也就是 pake ./dist --name my-tool。这个目录的最上层必须有 index.html,文件会被一起打进应用,所以打开时不需要服务器。Pake 桌面版的地址栏只收网站,本地文件只能交给 CLI。

Pake 对你的文件做了什么

输入是路径而不是网址时,Pake 会把文件复制进已安装 CLI 包里自己的 dist 目录,把应用入口设为 index.html,并把窗口标成本地页面。Tauri 会把这个目录嵌进它构建出的二进制里,所以做好的应用自带你的文件。目录打包或加了 --use-local-file 的打包完成后,Pake 会把原来的 dist 还原,下一个应用不会带上你的文件,这部分逻辑在 CLI 的 bin/helpers/merge.ts 里的 handleLocalFile。

后面的大部分规则都能由此解释。入口文件必须放在最上层,因为窗口打开的就是它。目录是整个复制的,目录里有什么就会打包什么。页面运行时从网络加载的东西不会被打包,因为只复制了磁盘上的文件。

Pake 接受三种输入,写在命令行参数里。

输入示例打包的内容
最上层有 index.html 的目录pake ./dist --name my-tool整个目录树
单个 HTML 文件pake ./page.html --name my-page只有这个文件
单个 HTML 文件加 --use-local-filepake ./my-app/index.html --name my-tool --use-local-file文件所在的文件夹及其全部子文件

目录打包需要 CLI 3.15.0 或更高,单文件打包需要 3.0.0 或更高(见进阶用法),用 pake --version 看一下自己装的版本。

打包一个构建产物

  1. 跑项目的生产构建,通常是 npm run build 或 pnpm build。用输出目录,比如 dist,不要用还需要开发服务器的源码目录。
  2. 打开输出目录,确认 index.html 在最上层,页面用到的 JavaScript、CSS、字体和图片都在旁边。
  3. 按快速上手装好 CLI 和各平台的编译工具,需要 Node.js 20.9 或更高、Rust 1.85 或更高,macOS 上是 Xcode 命令行工具,Windows 上是 Visual Studio Build Tools。
  4. 在包含 dist 的目录里运行 Pake。
pnpm install -g pake-cli
pake ./dist --name MyTool

安装包会生成在当前目录,macOS 是 .dmg,Windows 是 .msi,Debian 和 Ubuntu 上是 .deb 加 AppImage。第一次构建要下载并编译依赖,会花好几分钟。

如果 Pake 报告目录的最上层没有 index.html,说明指向的层级不对,它会停下来并提示去用构建输出目录。如果提示输入里包含了 Pake CLI 本身的安装目录,就把路径指向你的构建输出目录,别指向包含 pake-cli 的文件夹。

带着周边文件的单个页面

一个 HTML 文件自己加载 style.css、app.js 和图片时,单文件形式默认只复制这个文件,要加 --use-local-file。

pake ./my-app/index.html --name my-tool --use-local-file

加了这个参数,Pake 会复制文件所在的文件夹以及它下面的所有内容,所以这个文件夹里只放应用需要的东西。页面旁边的任何文件,包括忘了清掉的笔记或凭据,都会被复制进应用。拿不准的时候,把应用单独放一个文件夹,或者改用目录形式去打包干净的构建输出。

路由和资源路径

本地打包默认支持 hash 路由,像 index.html#/settings 这样的地址没问题。服务器把所有路径都改写到 index.html 的 history 模式单页应用路由目前还不支持(见命令行参数),你的前端路由有 hash 模式的话,打包版本就用它来构建。

第二件要检查的是资源路径。很多构建工具默认写出 /assets/app.js 这样的绝对路径,以 Vite 为例,它有 base 选项,设成 ./ 以后生成的地址会相对于各自的文件(见 Vite 构建指南)。打包后的应用打开是空白窗口时,先用相对路径的 base 试一次,再去怀疑别的原因。绝对路径在打包后的应用里如何解析,需要在目标平台验证。

能不能离线用

打包的页面打开时不需要服务器,但并不会自动变成离线应用。页面如果从 CDN 加载字体、调用接口或者引用远程脚本,这些部分仍然要联网。验证的办法是构建好应用,断开网络,把你在意的每个界面都打开看一遍,出问题时可以加 --debug 打开开发者工具和详细日志(见命令行参数)。

本地应用还有一个小差别,网站应用重新打开时会回到上次停留的页面,本地 HTML 应用则不会保存和恢复地址。

开发服务器是另一回事

pake http://localhost:3000 --name Dev 做出来的应用指向那个地址,既不会把服务器打包进去,也不会替你启动它。要交给别人用的工具,应该构建静态文件再打包;服务需要后端的话,后端得在应用能连到的地方运行,用应用的人也得知道这一点。

本机跑不了的 Mac 或 Windows 构建,表单式的 GitHub Actions 流程只接受网站网址,适合公开网站,不适合本地文件。

本地页面的原生能力

Pake 通过 window.__TAURI__.core.invoke 给打包的本地页面和与配置完全一致的网站源提供原生桥接(见进阶用法)。静态工具需要和应用容器通信时就走这条路,不需要的页面也不必管它。

常见问题

能直接打包 React 或 Vue 项目吗

打包它的构建产物。源码目录需要开发服务器和构建步骤,先跑生产构建,再打包它写出来的目录。

桌面版接受本地文件吗

不接受,它的地址栏只收 http 或 https 地址(见创建应用),本地文件用 CLI。

页面改了以后,怎么更新打包好的应用

重新构建再重新打包。文件是在构建应用时嵌进去的,旧应用看不到你后来的修改。

各系统分别得到什么

macOS 是 .dmg,Windows 是 .msi,Debian 和 Ubuntu 是 .deb 加 AppImage,其他目标见参数参考。想在桌面版和 CLI 之间选,可以读哪种办法更合适。