用 Pake CLI 打包本地 HTML 或静态站点
先照常跑一遍生产构建,再让 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-file | pake ./my-app/index.html --name my-tool --use-local-file | 文件所在的文件夹及其全部子文件 |
目录打包需要 CLI 3.15.0 或更高,单文件打包需要 3.0.0 或更高(见进阶用法),用 pake --version 看一下自己装的版本。
打包一个构建产物
- 跑项目的生产构建,通常是
npm run build或pnpm build。用输出目录,比如dist,不要用还需要开发服务器的源码目录。 - 打开输出目录,确认
index.html在最上层,页面用到的 JavaScript、CSS、字体和图片都在旁边。 - 按快速上手装好 CLI 和各平台的编译工具,需要 Node.js 20.9 或更高、Rust 1.85 或更高,macOS 上是 Xcode 命令行工具,Windows 上是 Visual Studio Build Tools。
- 在包含
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 之间选,可以读哪种办法更合适。
