---
title: "Pake 网页转桌面应用：体积、PWA 对比与登录限制"
canonical: https://wavect.io/zh/blog/pake-website-to-desktop-app/
language: zh
description: "Pake 网页打包桌面应用指南：核对真实安装包大小，比较 PWA、Tauri 和 Electron，解释 Google 登录失败、内存占用、本地离线构建与 GitHub Actions 自动化。"
image: "https://wavect.io/img/blog/headers/header_pake-website-to-desktop-app.png"
---

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 分钟 阅读 · 2026年9月22日 最近审核 2026年9月22日

[**下一篇**](/zh/blog/will-ai-kill-cross-platform-frameworks/)

# Pake 网页转桌面应用：体积、PWA 对比与登录限制

要点速览

Pake 使用 Tauri、Rust 和平台 WebView，把网站或本地 Web 构建产物封装为桌面应用。它不会重写界面，也不会把云服务变成本地服务。Pake 3.17.0 的 ChatGPT 下载文件从 3.54 MB 的 Windows MSI 到 76 MB 的 Linux AppImage 不等，因此“小于 10 MB”不是通用保证，更不是内存测试结果。只需个人独立窗口时可先尝试浏览器安装；需要可配置安装包时再考虑 Pake，并验证登录、运行时依赖、签名和核心用户流程。

**你最常用的网站，可能只需要一个独立窗口，而不是再附带一整套浏览器。**Pake 使用 Tauri 和 Rust，把网址或本地 Web 构建产物打包成桌面应用。它提供轻量外壳、应用图标和桌面控制功能，无需专门维护一个 Electron 项目。截至 2026 年 9 月 22 日， [Pake 的 GitHub 仓库](https://github.com/tw93/Pake) 显示约 6.16 万颗星。

本文评估的是 [于 2026 年 9 月 20 日发布的 Pake 3.17.0](https://github.com/tw93/Pake/releases/tag/V3.17.0) 。重点不是复述“小于 10 MB”的宣传，而是区分安装包体积与内存占用，并说明系统 WebView、Google 登录、本地路由和分发方面的限制。本文依据文档与已发布文件进行分析，没有进行实际运行性能基准测试。

## Pake 是什么？它究竟把什么变成了桌面应用？

Pake 是一个开源网页桌面打包工具。它把现有 Web 界面放进原生桌面窗口，但不会把 HTML 自动翻译成原生控件，也不会重写应用的业务代码。内容和业务逻辑仍由原网站提供。把在线 AI 服务打包成桌面应用，同样不代表模型会在你的电脑上本地运行。

[项目 README](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/README.md) 将其描述为安装包约比 Electron 小 20 倍、应用通常低于 10 MB。这是项目的概括性说法，不是对所有操作系统、安装格式和网站的保证。更准确的表述是：**Pake 可以避免让每个应用都携带一套独立的 Electron 浏览器运行时。**

## Pake 打包后一定小于 10 MB 吗？先看发布文件

即使是同一个 ChatGPT 封装应用，不同格式的下载体积也相差很大。下表记录了 [Pake 3.17.0 官方发布附件](https://github.com/tw93/Pake/releases/expanded_assets/V3.17.0) 中 GitHub 显示的**下载大小**，不是安装后的磁盘占用，也不是 RAM 测量结果。

| 平台 | 发布文件 | 下载大小 |
| --- | --- | --- |
| macOS | `ChatGPT.dmg` | 9.42 MB |
| Windows | `ChatGPT_x64.msi` | 3.54 MB |
| Linux，Debian 包 | `ChatGPT_x86_64.deb` | 4.55 MB |
| Linux，AppImage | `ChatGPT_x86_64.AppImage` | 76 MB |

同一版本的 `DeepSeek.dmg` 还有 10.8 MB。因此，“所有 Pake 应用都小于 10 MB”显然不够准确，打包格式会直接影响结果。项目提供 ChatGPT、Gemini 和 YouTube 等预构建应用，但**Pake 发布的网页封装，并不自动等于服务提供方发布的官方客户端**。

评估时应分开记录四个指标：下载大小、安装后的应用体积、额外运行时依赖，以及运行中的内存使用。小安装包只能证明第一项。本文没有构建对应的 Electron 版本作对照，因此不会把“20 倍”写成我们自己的测试结论。

## Pake 与 Electron 的区别：浏览器引擎并没有消失

[Electron 官方文档](https://www.electronjs.org/docs/latest/) 说明其会嵌入 Chromium 和 Node.js，从而让开发者在不同桌面平台上控制浏览器环境。Pake 则通过 Tauri 使用操作系统的 WebView 集成。它减少了每个应用重复携带的运行时，但也更依赖目标设备的实际环境。

[Tauri 的 WebView 版本说明](https://v2.tauri.app/reference/webview-versions/) 列出了不同平台的引擎：

| 平台 | WebView | 需要验证的内容 |
| --- | --- | --- |
| macOS | WKWebView / WebKit | 对计划支持的 macOS 版本是否兼容。 |
| Windows | Microsoft Edge WebView2 | 运行时是否存在，以及如何部署和管理。 |
| Linux | WebKitGTK | 发行版依赖库、显示环境和软件包格式。 |

Windows 的 WebView2 本身基于 Chromium，所以把 Pake 说成“完全不使用 Chromium”会产生误导。优势在于应用不必自带完整的 Electron 运行时，而不是网页渲染不再消耗资源。

Windows 的分发策略也会改变体积计算。 [Tauri 的 Windows 安装包文档](https://v2.tauri.app/distribute/windows-installer/) 区分了按需下载 WebView2 与为离线安装直接携带运行时两种方式。后者可能显著增加包体。这些是框架提供的部署选项，不能据此认定所有 Pake MSI 都包含相同的运行时内容。

## 如何用一条命令把网页打包成桌面应用？

下面是针对本文评估版本的最小示例。将 `https://example.com` 替换为你有权使用的网站。命令会下载并执行构建工具，运行前应先确认软件包来源。

```
npx pake-cli@3.17.0 https://example.com --name "MyWorkspace"
```

也可以运行 `npm install -g pake-cli@3.17.0` 全局安装 CLI，然后使用后续示例中的 `pake` 命令。没有指定图标时，Pake 会尝试获取网站的 favicon。如果自动获取失败，可以自行提供合适格式的图标文件。

**一条命令不等于零环境准备。**Pake 推荐 Node.js 22 或更新版本，并要求 Rust 1.85 或更新版本。原生编译还需要各平台工具：macOS 的 Xcode Command Line Tools、Windows 的相应 C++ 工具链，以及 Linux 发行版对应的开发库。先检查 [Tauri 的环境要求](https://v2.tauri.app/start/prerequisites/) ，再判断错误是否真的来自 Pake，而不是缺少编译器。

应使用适合目标平台的构建机器或 CI runner。不要以为在 Mac 上执行一次命令，就能直接生成三个平台均已签名的正式安装包。首次构建可能需要下载依赖，生成的文件通常位于当前工作目录。Windows 默认仍使用 MSVC；3.17.0 也提供 `--windows-toolchain gnu`，适用于已经配置好 MinGW/MSYS2 的 x64 环境。这是另一种编译器方案，而不是完全不需要编译器。

## 不重写 Web 产品，也能调整窗口和桌面操作

完成全局 CLI 安装后，可以从以下配置开始：

```
pake https://example.com --name "MyWorkspace" --width 1280 --height 900 --activation-shortcut "CmdOrControl+Shift+9" --show-system-tray --enable-drag-drop
```

`--hide-title-bar` 用于 macOS。Windows 和 Linux 对应的选项是 `--hide-window-decorations`，但它也会移除原生窗口控制按钮，需要确认用户仍能方便地操作窗口。快捷键和拖放功能也应结合目标网站实际测试，不能只看命令执行是否成功。

Pake 还支持注入本地 CSS 和 JavaScript，具体见 [高级自定义指南](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/advanced-usage.md) 。样式文件可以精简界面，却不能让被身份提供方禁止的登录方式变得受支持。注入代码应像应用代码一样接受审查，尤其是在已经登录的账户页面中。不要直接使用来历不明的脚本；网站更新后，也要重新验证依赖页面选择器的调整。

## Pake 和 PWA 怎么选？什么时候值得单独打包？

如果个人使用的目标只是独立窗口和启动图标，建议先尝试浏览器提供的安装功能。 [MDN 的 Web 应用安装指南](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Installing) 解释了不同浏览器与平台的差异。安装一个网站，与让它离线可用，是两件不同的事。

| 方案 | 适合从这里开始的需求 | 主要取舍 |
| --- | --- | --- |
| 浏览器安装的网站 / PWA | 个人使用为主，主要需要一个独立窗口。 | 安装和系统集成受浏览器功能范围影响。 |
| Pake | 需要有独立名称的桌面安装包，以及可配置的现有网页外壳。 | 需要维护 WebView 兼容性和封装应用的发布版本。 |
| 定制 Tauri 应用 | 产品需要有意设计的原生系统集成。 | 团队负责应用代码、权限和各平台测试。 |
| Electron 应用 | 受控的 Chromium 环境和 Node.js 集成足以抵消运行时成本。 | 需要分发并维护应用携带的运行时。 |

我们的建议是：优先选择能可靠完成目标流程的最简单方案。Pake 的价值尤其体现在浏览器安装与定制桌面产品之间。更广泛的共享代码和原生开发决策，可参考我们的 [跨平台框架战略分析](/zh/blog/will-ai-kill-cross-platform-frameworks/) ，不应由一张安装包大小截图决定。

## Google 登录失败、Cloudflare 循环验证和内存占用

[Pake 故障排查 FAQ](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/faq.md) 明确讨论了嵌入式登录被拒、Cloudflare 循环验证和 WebView 内存较高的问题。这些都是“把任何网页变成应用”需要补充的边界。首页能够打开，不等于完整用户流程可以正常使用。

### Google 登录不只是弹窗配置问题

`--multi-window` 可以帮助某些弹窗流程，`--safe-domain` 则控制哪些可信主机的页面留在应用内部。它们都不能覆盖身份提供方的规则。 [Google 的 OAuth 政策](https://developers.google.com/identity/protocols/oauth2/policies) 限制通过开发者可控制的嵌入式用户代理完成授权。如果服务拒绝该封装，应选择受支持的浏览器授权流程或官方客户端，而不是伪装 WebView。

### Cloudflare 验证循环可能直接阻止上线

Pake FAQ 提醒，部分受保护的网站可能一直停留在验证环节，Linux WebKitGTK 环境尤其需要注意。文档没有承诺可靠的 Pake 侧修复。应尽早把它作为是否采用该方案的验收条件，而不是关闭保护措施，或向用户保证更换 user-agent 就能解决。

### 下载很小，不代表 WebView 进程占用很小

网站脚本、渲染和 WebView 进程仍然需要内存。一个复杂的 AI 聊天界面即使装进小外壳，也可能保持较高资源占用。比较时应在相同工作负载下统计完整进程组，而不是只观察 Rust 启动进程。不能从安装包大小推导出固定比例的 RAM 节省。

## Pake 能打包本地网站吗？能否离线使用？

可以。Pake 接受本地 HTML 文件，也接受静态构建目录。使用目录时，根目录必须包含 `index.html`：

```
pake ./dist --name "LocalDashboard"
```

但这里有一个重要限制：**本文评估版本的本地打包支持 hash 路由，不支持 SPA 的 history 路由模式。** [对应版本的 Pake CLI 文档](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/cli-usage.md) 说明了这个限制和前面使用的参数。本地 React 或 Vue 前端可能需要先修改路由方式，才能正确处理页面内部的深层链接。

打包前端文件不会顺带打包你的后端、云端 API 或身份认证服务。宣称支持离线前，应断开网络并测试每个关键操作。JavaScript 从本地加载、数据却仍依赖远程 API 的控制台，还不能算作离线产品。

## Pake JSON 配置：让团队构建和 AI 自动化更可控

团队使用时，把窗口设置存入可审查的配置文件，比每次重新拼接长命令更合适。将下面的例子保存为 `app.json`，其字段遵循 [Pake 3.17.0 配置 schema](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/schema/pake.schema.json) ：

```
{
  "$schema": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/schema/pake.schema.json",
  "url": "https://example.com",
  "name": "SupportDesk",
  "width": 1280,
  "height": 900,
  "activationShortcut": "CmdOrControl+Shift+9",
  "showSystemTray": true,
  "appVersion": "1.0.0"
}
```

```
pake --config app.json --json
```

[项目的自动化接口约定](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/llms.txt) 规定：stdout 输出一个 JSON 结果，日志写入 stderr。退出码分别表示成功（`0`）、输入无效（`2`）、构建失败（`3`）、环境缺失或初始化失败（`4`），以及非预期错误（`1`）。

**不要把 `ok: true` 当成所有请求的 Linux 包格式都已生成的证明。**多目标构建可能只部分成功。还应检查 `outputs[].format`、`warnings`，并验证列出的实际产物。本地相对路径以进程工作目录为基准。构建成功同样不会自动证明登录、支付和文件处理已经通过测试。

## 用 GitHub Actions 构建 Pake 应用，无需本地编译环境

[Pake 的 GitHub Actions 指南](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/github-actions-usage.md) 给出了云端流程：fork 仓库，启用 Actions，打开 **Build App With Pake CLI**，填写网址和应用设置，然后运行工作流。完成后，从该次运行的 artifacts 区域获取构建文件。

对于企业内部应用，我们建议先审查工作流、固定预期源码版本，并最小化权限。不要把凭据放进网址、仓库配置或构建日志。签名秘密应使用平台的 secrets 机制管理，而不是写进本文示例 JSON。托管 runner 减少的是本地编译器配置工作，不是供应链审查和发布验证责任。

## 签名、维护责任与 Pake 的许可证例外

向同事或客户分发前，应明确谁负责更新、回归测试和安全事件处理，并遵守目标平台的发布要求。例如， [Tauri 的 macOS 签名指南](https://v2.tauri.app/distribute/sign/macos/) 说明了分发涉及的代码签名与公证。不要把关闭操作系统保护作为常规安装步骤。

Pake 使用 GPL-3.0-or-later，并附有专门的 [生成应用例外条款](https://raw.githubusercontent.com/tw93/Pake/V3.17.0/LICENSE-EXCEPTION) 。仅通过标准方式打包，不会单独导致生成的应用必须以 GPL 发布；对 Pake 源码本身进行修改，仍涉及相应 GPL 义务。这也不代表可以违反其他服务的条款，随意分发其商标、内容或功能。应分别评估该例外与实际分发用途。

## 发布网页桌面封装前，建议完成哪些验收？

下表是我们建议的验收项目，不是我们已经对预构建二进制文件完成的测试：

| 范围 | 需要的验证结果 |
| --- | --- |
| 身份与导航 | 登录、多因素认证、退出、切换账户、外部链接和重新打开应用均可正常完成。 |
| 核心功能 | 上传、下载、拖放、键盘访问，以及所需的摄像头和麦克风流程通过测试。 |
| 资源使用 | 分别记录下载体积、安装占用、运行时依赖和完整进程组内存。 |
| 分发与恢复 | 干净的目标机器可以安装、更新和卸载；失败发布具有可执行的回滚路径。 |

如果要交付面向客户的桌面体验，我们的 [定制软件开发服务](/zh/services/software-development/) 可以协助判断网页外壳与完整产品之间的边界。 [Offlinery 案例](/zh/case-studies/offlinery/) 提供的是独立的产品交付背景，不代表该项目使用 Pake。可使用我们的 [软件上线前 QA 检查清单](/zh/software-development-guide/software-qa-checklist-before-launch/) 组织验证，或 [与 Wavect 讨论网页转桌面应用的具体要求](/zh/contact/) 。

*文档和发布元数据核查于 2026 年 9 月 22 日。命令是根据文档编写的示例；运行性能和服务提供方兼容性仍需在实际部署中验证。*

## Pake 常见问题

### Pake 是什么？

Pake 是开源命令行工具，可以把网站或本地静态 Web 构建封装到 Tauri 和 Rust 桌面外壳中。它使用平台 WebView，而不是内嵌 Electron 运行时，但界面仍然是 Web 应用。

### Pake 应用一定小于 10 MB 吗？

不一定。Pake 3.17.0 的 ChatGPT 封装应用在 Windows MSI 格式下为 3.54 MB，Linux AppImage 则为 76 MB。这些是下载大小，不是安装占用或运行内存。

### Pake 一定比 Electron 更省内存吗？

本文没有证明固定比例的内存节省。网页与 WebView 仍会使用 RAM。应在相同负载下统计完整进程组；安装包大小不能替代内存基准测试。

### 为什么 Pake 内的 Google 登录会失败？

身份提供方可能拒绝嵌入式 WebView。弹窗和导航参数不能覆盖其政策。封装被拒绝时，应使用受支持的浏览器授权流程或服务的官方客户端。

### Pake 能把本地 React 或 Vue 应用打包为离线软件吗？

可以打包包含 index.html 的静态目录。本文评估版本支持 hash 路由，不支持 SPA 的 history 路由。要真正离线运行，关键文件、数据和流程还不能依赖不可达的远程服务。

### 什么情况下应该选择 PWA，而不是 Pake？

如果只需要独立窗口和启动图标，先尝试浏览器安装。只有独立桌面安装包及其配置功能带来明确价值时，再考虑 Pake。

### Pake 提供的 ChatGPT 和 Gemini 下载是官方应用吗？

它们是 Pake 项目分发的网页封装。出现在 Pake 的发布列表中，不代表 OpenAI、Google 或其他服务提供方发布或认可这些客户端。

### 用 Pake 生成的应用可以采用专有许可证分发吗？

Pake 的生成应用例外说明，标准打包本身不会单独要求产物使用 GPL。修改 Pake 源码以及使用第三方服务的条款，仍需分别评估。

### 自动化构建除了 ok: true，还要检查什么？

应检查退出码、warnings 和 outputs[].format，并验证实际产物。Linux 多目标构建可能成功但未生成所有请求格式。功能验收仍是独立步骤。

## 最终思考

Pake 提供了一个实用的中间方案：为已经存在的 Web 产品增加可配置桌面外壳。它的价值在于减少不必要的运行时重复分发，而不是让浏览器成本凭空消失。根据实际安装包格式、登录兼容性和验收要求，判断它是否比浏览器安装或定制桌面应用更合适。

## 你可能也喜欢..

[**AI 会取代跨平台框架吗？** 从共享代码、原生客户端和验证成本的角度，理解更广泛的架构决策。](/zh/blog/will-ai-kill-cross-platform-frameworks/)

架构与平台

## 继续浏览此集群

对长期交付产生影响的框架、平台与系统设计选择。

[从核心文章开始**智慧城市软件架构：MQTT、LoRaWAN、Kubernetes 与 Terraform**](/zh/blog/smart-city-architecture-best-practices-2026/)

- [因斯布鲁克机场：软件、数字化与 AI 机会独立分析](/zh/blog/flughafen-innsbruck-software-ai-opportunity-map/)
- [欧盟电池护照软件架构：面向 2027](/zh/blog/eu-battery-passport-software-architecture-2027/)
- [欧盟《数据法》：连接产品 API 清单](/zh/blog/eu-data-act-connected-product-api-2026/)
- [Cursor Origin 与 GitHub 对比：团队该迁移吗？](/zh/blog/cursor-origin-vs-github-code-hosting/)
- [MoneyPrinterTurbo 评测 2026：免费 AI 视频与真实成本](/zh/blog/moneyprinterturbo-review-2026/)

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 分钟 阅读 · 2026年9月22日 最近审核 2026年9月22日

[**下一篇**](/zh/blog/will-ai-kill-cross-platform-frameworks/)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/pake-website-to-desktop-app/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-09-22",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-09-22",
      "url": "https://wavect.io/zh/blog/pake-website-to-desktop-app/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "Pake 使用 Tauri、Rust 和平台 WebView，把网站或本地 Web 构建产物封装为桌面应用。它不会重写界面，也不会把云服务变成本地服务。Pake 3.17.0 的 ChatGPT 下载文件从 3.54 MB 的 Windows MSI 到 76 MB 的 Linux AppImage 不等，因此“小于 10 MB”不是通用保证，更不是内存测试结果。只需个人独立窗口时可先尝试浏览器安装；需要可配置安装包时再考虑 Pake，并验证登录、运行时依赖、签名和核心用户流程。",
  "articleBody": " 博客概览/交付与 QA/架构与平台 Pake 网页转桌面应用：体积、PWA 对比与登录限制 要点速览 Pake 使用 Tauri、Rust 和平台 WebView，把网站或本地 Web 构建产物封装为桌面应用。它不会重写界面，也不会把云服务变成本地服务。Pake 3.17.0 的 ChatGPT 下载文件从 3.54 MB 的 Windows MSI 到 76 MB 的 Linux AppImage 不等，因此“小于 10 MB”不是通用保证，更不是内存测试结果。只需个人独立窗口时可先尝试浏览器安装；需要可配置安装包时再考虑 Pake，并验证登录、运行时依赖、签名和核心用户流程。 你最常用的网站，可能只需要一个独立窗口，而不是再附带一整套浏览器。Pake 使用 Tauri 和 Rust，把网址或本地 Web 构建产物打包成桌面应用。它提供轻量外壳、应用图标和桌面控制功能，无需专门维护一个 Electron 项目。截至 2026 年 9 月 22 日，Pake 的 GitHub 仓库显示约 6.16 万颗星。 本文评估的是于 2026 年 9 月 20 日发布的 Pake 3.17.0。重点不是复述“小于 10 MB”的宣传，而是区分安装包体积与内存占用，并说明系统 WebView、Google 登录、本地路由和分发方面的限制。本文依据文档与已发布文件进行分析，没有进行实际运行性能基准测试。 Pake 是什么？它究竟把什么变成了桌面应用？ Pake 是一个开源网页桌面打包工具。它把现有 Web 界面放进原生桌面窗口，但不会把 HTML 自动翻译成原生控件，也不会重写应用的业务代码。内容和业务逻辑仍由原网站提供。把在线 AI 服务打包成桌面应用，同样不代表模型会在你的电脑上本地运行。 项目 README将其描述为安装包约比 Electron 小 20 倍、应用通常低于 10 MB。这是项目的概括性说法，不是对所有操作系统、安装格式和网站的保证。更准确的表述是：Pake 可以避免让每个应用都携带一套独立的 Electron 浏览器运行时。 Pake 打包后一定小于 10 MB 吗？先看发布文件 即使是同一个 ChatGPT 封装应用，不同格式的下载体积也相差很大。下表记录了Pake 3.17.0 官方发布附件中 GitHub 显示的下载大小，不是安装后的磁盘占用，也不是 RAM 测量结果。 Pake 3.17.0 的 ChatGPT 封装应用下载文件，核查日期：2026 年 9 月 22 日 平台发布文件下载大小 macOSChatGPT.dmg9.42 MB WindowsChatGPT_x64.msi3.54 MB Linux，Debian 包ChatGPT_x86_64.deb4.55 MB Linux，AppImageChatGPT_x86_64.AppImage76 MB 同一版本的 DeepSeek.dmg 还有 10.8 MB。因此，“所有 Pake 应用都小于 10 MB”显然不够准确，打包格式会直接影响结果。项目提供 ChatGPT、Gemini 和 YouTube 等预构建应用，但Pake 发布的网页封装，并不自动等于服务提供方发布的官方客户端。 评估时应分开记录四个指标：下载大小、安装后的应用体积、额外运行时依赖，以及运行中的内存使用。小安装包只能证明第一项。本文没有构建对应的 Electron 版本作对照，因此不会把“20 倍”写成我们自己的测试结论。 Pake 与 Electron 的区别：浏览器引擎并没有消失 Electron 官方文档说明其会嵌入 Chromium 和 Node.js，从而让开发者在不同桌面平台上控制浏览器环境。Pake 则通过 Tauri 使用操作系统的 WebView 集成。它减少了每个应用重复携带的运行时，但也更依赖目标设备的实际环境。 Tauri 的 WebView 版本说明列出了不同平台的引擎： Pake 桌面应用依赖的 WebView 环境 平台WebView需要验证的内容 macOSWKWebView / WebKit对计划支持的 macOS 版本是否兼容。 WindowsMicrosoft Edge WebView2运行时是否存在，以及如何部署和管理。 LinuxWebKitGTK发行版依赖库、显示环境和软件包格式。 Windows 的 WebView2 本身基于 Chromium，所以把 Pake 说成“完全不使用 Chromium”会产生误导。优势在于应用不必自带完整的 Electron 运行时，而不是网页渲染不再消耗资源。 Windows 的分发策略也会改变体积计算。Tauri 的 Windows 安装包文档区分了按需下载 WebView2 与为离线安装直接携带运行时两种方式。后者可能显著增加包体。这些是框架提供的部署选项，不能据此认定所有 Pake MSI 都包含相同的运行时内容。 如何用一条命令把网页打包成桌面应用？ 下面是针对本文评估版本的最小示例。将 https://example.com 替换为你有权使用的网站。命令会下载并执行构建工具，运行前应先确认软件包来源。 npx pake-cli@3.17.0 https://example.com --name \"MyWorkspace\" 也可以运行 npm install -g pake-cli@3.17.0 全局安装 CLI，然后使用后续示例中的 pake 命令。没有指定图标时，Pake 会尝试获取网站的 favicon。如果自动获取失败，可以自行提供合适格式的图标文件。 一条命令不等于零环境准备。Pake 推荐 Node.js 22 或更新版本，并要求 Rust 1.85 或更新版本。原生编译还需要各平台工具：macOS 的 Xcode Command Line Tools、Windows 的相应 C++ 工具链，以及 Linux 发行版对应的开发库。先检查Tauri 的环境要求，再判断错误是否真的来自 Pake，而不是缺少编译器。 应使用适合目标平台的构建机器或 CI runner。不要以为在 Mac 上执行一次命令，就能直接生成三个平台均已签名的正式安装包。首次构建可能需要下载依赖，生成的文件通常位于当前工作目录。Windows 默认仍使用 MSVC；3.17.0 也提供 --windows-toolchain gnu，适用于已经配置好 MinGW/MSYS2 的 x64 环境。这是另一种编译器方案，而不是完全不需要编译器。 不重写 Web 产品，也能调整窗口和桌面操作 完成全局 CLI 安装后，可以从以下配置开始： pake https://example.com --name \"MyWorkspace\" --width 1280 --height 900 --activation-shortcut \"CmdOrControl+Shift+9\" --show-system-tray --enable-drag-drop --hide-title-bar 用于 macOS。Windows 和 Linux 对应的选项是 --hide-window-decorations，但它也会移除原生窗口控制按钮，需要确认用户仍能方便地操作窗口。快捷键和拖放功能也应结合目标网站实际测试，不能只看命令执行是否成功。 Pake 还支持注入本地 CSS 和 JavaScript，具体见高级自定义指南。样式文件可以精简界面，却不能让被身份提供方禁止的登录方式变得受支持。注入代码应像应用代码一样接受审查，尤其是在已经登录的账户页面中。不要直接使用来历不明的脚本；网站更新后，也要重新验证依赖页面选择器的调整。 Pake 和 PWA 怎么选？什么时候值得单独打包？ 如果个人使用的目标只是独立窗口和启动图标，建议先尝试浏览器提供的安装功能。MDN 的 Web 应用安装指南解释了不同浏览器与平台的差异。安装一个网站，与让它离线可用，是两件不同的事。 选择框架，不是对所有应用都适用的性能排行榜 方案适合从这里开始的需求主要取舍 浏览器安装的网站 / PWA个人使用为主，主要需要一个独立窗口。安装和系统集成受浏览器功能范围影响。 Pake需要有独立名称的桌面安装包，以及可配置的现有网页外壳。需要维护 WebView 兼容性和封装应用的发布版本。 定制 Tauri 应用产品需要有意设计的原生系统集成。团队负责应用代码、权限和各平台测试。 Electron 应用受控的 Chromium 环境和 Node.js 集成足以抵消运行时成本。需要分发并维护应用携带的运行时。 我们的建议是：优先选择能可靠完成目标流程的最简单方案。Pake 的价值尤其体现在浏览器安装与定制桌面产品之间。更广泛的共享代码和原生开发决策，可参考我们的跨平台框架战略分析，不应由一张安装包大小截图决定。 Google 登录失败、Cloudflare 循环验证和内存占用 Pake 故障排查 FAQ明确讨论了嵌入式登录被拒、Cloudflare 循环验证和 WebView 内存较高的问题。这些都是“把任何网页变成应用”需要补充的边界。首页能够打开，不等于完整用户流程可以正常使用。 Google 登录不只是弹窗配置问题 --multi-window 可以帮助某些弹窗流程，--safe-domain 则控制哪些可信主机的页面留在应用内部。它们都不能覆盖身份提供方的规则。Google 的 OAuth 政策限制通过开发者可控制的嵌入式用户代理完成授权。如果服务拒绝该封装，应选择受支持的浏览器授权流程或官方客户端，而不是伪装 WebView。 Cloudflare 验证循环可能直接阻止上线 Pake FAQ 提醒，部分受保护的网站可能一直停留在验证环节，Linux WebKitGTK 环境尤其需要注意。文档没有承诺可靠的 Pake 侧修复。应尽早把它作为是否采用该方案的验收条件，而不是关闭保护措施，或向用户保证更换 user-agent 就能解决。 下载很小，不代表 WebView 进程占用很小 网站脚本、渲染和 WebView 进程仍然需要内存。一个复杂的 AI 聊天界面即使装进小外壳，也可能保持较高资源占用。比较时应在相同工作负载下统计完整进程组，而不是只观察 Rust 启动进程。不能从安装包大小推导出固定比例的 RAM 节省。 Pake 能打包本地网站吗？能否离线使用？ 可以。Pake 接受本地 HTML 文件，也接受静态构建目录。使用目录时，根目录必须包含 index.html： pake ./dist --name \"LocalDashboard\" 但这里有一个重要限制：本文评估版本的本地打包支持 hash 路由，不支持 SPA 的 history 路由模式。对应版本的 Pake CLI 文档说明了这个限制和前面使用的参数。本地 React 或 Vue 前端可能需要先修改路由方式，才能正确处理页面内部的深层链接。 打包前端文件不会顺带打包你的后端、云端 API 或身份认证服务。宣称支持离线前，应断开网络并测试每个关键操作。JavaScript 从本地加载、数据却仍依赖远程 API 的控制台，还不能算作离线产品。 Pake JSON 配置：让团队构建和 AI 自动化更可控 团队使用时，把窗口设置存入可审查的配置文件，比每次重新拼接长命令更合适。将下面的例子保存为 app.json，其字段遵循Pake 3.17.0 配置 schema： { \"$schema\": \"https://raw.githubusercontent.com/tw93/Pake/V3.17.0/schema/pake.schema.json\", \"url\": \"https://example.com\", \"name\": \"SupportDesk\", \"width\": 1280, \"height\": 900, \"activationShortcut\":",
  "articleSection": "桌面应用开发",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "citation": [
    {
      "@type": "WebPage",
      "name": "Pake 的 GitHub 仓库",
      "url": "https://github.com/tw93/Pake"
    },
    {
      "@type": "WebPage",
      "name": "于 2026 年 9 月 20 日发布的 Pake 3.17.0",
      "url": "https://github.com/tw93/Pake/releases/tag/V3.17.0"
    },
    {
      "@type": "WebPage",
      "name": "项目 README",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/README.md"
    },
    {
      "@type": "WebPage",
      "name": "Pake 3.17.0 官方发布附件",
      "url": "https://github.com/tw93/Pake/releases/expanded_assets/V3.17.0"
    },
    {
      "@type": "WebPage",
      "name": "Electron 官方文档",
      "url": "https://www.electronjs.org/docs/latest/"
    },
    {
      "@type": "WebPage",
      "name": "Tauri 的 WebView 版本说明",
      "url": "https://v2.tauri.app/reference/webview-versions/"
    },
    {
      "@type": "WebPage",
      "name": "Tauri 的 Windows 安装包文档",
      "url": "https://v2.tauri.app/distribute/windows-installer/"
    },
    {
      "@type": "WebPage",
      "name": "Tauri 的环境要求",
      "url": "https://v2.tauri.app/start/prerequisites/"
    },
    {
      "@type": "WebPage",
      "name": "高级自定义指南",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/advanced-usage.md"
    },
    {
      "@type": "WebPage",
      "name": "MDN 的 Web 应用安装指南",
      "url": "https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Installing"
    },
    {
      "@type": "WebPage",
      "name": "Pake 故障排查 FAQ",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/faq.md"
    },
    {
      "@type": "WebPage",
      "name": "Google 的 OAuth 政策",
      "url": "https://developers.google.com/identity/protocols/oauth2/policies"
    },
    {
      "@type": "WebPage",
      "name": "对应版本的 Pake CLI 文档",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/cli-usage.md"
    },
    {
      "@type": "WebPage",
      "name": "Pake 3.17.0 配置 schema",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/schema/pake.schema.json"
    },
    {
      "@type": "WebPage",
      "name": "项目的自动化接口约定",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/llms.txt"
    },
    {
      "@type": "WebPage",
      "name": "Pake 的 GitHub Actions 指南",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/docs/github-actions-usage.md"
    },
    {
      "@type": "WebPage",
      "name": "Tauri 的 macOS 签名指南",
      "url": "https://v2.tauri.app/distribute/sign/macos/"
    },
    {
      "@type": "WebPage",
      "name": "生成应用例外条款",
      "url": "https://raw.githubusercontent.com/tw93/Pake/V3.17.0/LICENSE-EXCEPTION"
    }
  ],
  "dateModified": "2026-09-22",
  "datePublished": "2026-09-22",
  "description": "Pake 使用 Tauri、Rust 和平台 WebView，把网站或本地 Web 构建产物封装为桌面应用。它不会重写界面，也不会把云服务变成本地服务。Pake 3.17.0 的 ChatGPT 下载文件从 3.54 MB 的 Windows MSI 到 76 MB 的 Linux AppImage 不等，因此“小于 10 MB”不是通用保证，更不是内存测试结果。只需个人独立窗口时可先尝试浏览器安装；需要可配置安装包时再考虑 Pake，并验证登录、运行时依赖、签名和核心用户流程。",
  "headline": "Pake 网页转桌面应用：体积、PWA 对比与登录限制",
  "image": "https://wavect.io/img/blog/headers/header_pake-website-to-desktop-app.svg",
  "inLanguage": "zh",
  "keywords": "Pake, 桌面应用, WebView",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/pake-website-to-desktop-app/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/pake-website-to-desktop-app/",
  "wordCount": 651
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/delivery-qa/",
      "name": "交付与 QA",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/architecture-platforms/",
      "name": "架构与平台",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/pake-website-to-desktop-app/",
      "name": "Pake 网页转桌面应用：体积、PWA 对比与登录限制",
      "position": 5
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Pake 是开源命令行工具，可以把网站或本地静态 Web 构建封装到 Tauri 和 Rust 桌面外壳中。它使用平台 WebView，而不是内嵌 Electron 运行时，但界面仍然是 Web 应用。"
      },
      "name": "Pake 是什么？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不一定。Pake 3.17.0 的 ChatGPT 封装应用在 Windows MSI 格式下为 3.54 MB，Linux AppImage 则为 76 MB。这些是下载大小，不是安装占用或运行内存。"
      },
      "name": "Pake 应用一定小于 10 MB 吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "本文没有证明固定比例的内存节省。网页与 WebView 仍会使用 RAM。应在相同负载下统计完整进程组；安装包大小不能替代内存基准测试。"
      },
      "name": "Pake 一定比 Electron 更省内存吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "身份提供方可能拒绝嵌入式 WebView。弹窗和导航参数不能覆盖其政策。封装被拒绝时，应使用受支持的浏览器授权流程或服务的官方客户端。"
      },
      "name": "为什么 Pake 内的 Google 登录会失败？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "可以打包包含 index.html 的静态目录。本文评估版本支持 hash 路由，不支持 SPA 的 history 路由。要真正离线运行，关键文件、数据和流程还不能依赖不可达的远程服务。"
      },
      "name": "Pake 能把本地 React 或 Vue 应用打包为离线软件吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "如果只需要独立窗口和启动图标，先尝试浏览器安装。只有独立桌面安装包及其配置功能带来明确价值时，再考虑 Pake。"
      },
      "name": "什么情况下应该选择 PWA，而不是 Pake？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "它们是 Pake 项目分发的网页封装。出现在 Pake 的发布列表中，不代表 OpenAI、Google 或其他服务提供方发布或认可这些客户端。"
      },
      "name": "Pake 提供的 ChatGPT 和 Gemini 下载是官方应用吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Pake 的生成应用例外说明，标准打包本身不会单独要求产物使用 GPL。修改 Pake 源码以及使用第三方服务的条款，仍需分别评估。"
      },
      "name": "用 Pake 生成的应用可以采用专有许可证分发吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "应检查退出码、warnings 和 outputs[].format，并验证实际产物。Linux 多目标构建可能成功但未生成所有请求格式。功能验收仍是独立步骤。"
      },
      "name": "自动化构建除了 ok: true，还要检查什么？"
    }
  ]
}
```
