Tauri 如何将 Web 设计转化为紧凑的原生应用

更新于 2026-01-22

David Eastman 2022-07-30

“开源、小巧、安全,何必把世界烧成灰烬?”——在一期 Changelog 播客中,一位 Tauri 核心开发者如此描述他的动机,这让我开始思考:开发者究竟如何选择构建小型原生应用的技术?Tauri 专为“注重安全、尊重隐私、关注环境”(即体积小、功耗低)的软件工程社区而打造。这种理念又如何映射到普通开发者的日常决策中呢?

选择一种能写出可维护应用的最佳技术,往往是在你当前所处环境、已有知识储备以及可用工具之间取得平衡的结果。

如果你在企业防火墙后开发,可能不得不接受受限现实所提供的有限选项。小型应用通常是工具类程序,其中一些需要访问系统底层信息,而基于 Web 的工具通常不被信任执行这类操作。但仅从效率角度出发,使用目标机器的原生 UI 和窗口系统也是合乎逻辑的选择。

那么,Tauri 在这其中扮演什么角色?

Tauri 是一个使用任意前端框架配合 Rust 核心来构建桌面应用程序的框架。每个 Tauri 应用由两部分组成:

  • 一个 Rust 二进制程序,负责创建窗口并向这些窗口暴露原生功能;
  • 一个你自选的 Web 前端,用于在窗口内部呈现用户界面。

乍一听,Tauri 的宣传语似乎略显矛盾——用 Web 技术构建原生应用。显然,展示 HTML、JS 和 CSS 的最佳场所是浏览器——但这并非故事的全部。如今,这些技术已成为在屏幕上呈现信息的事实标准,因此无论目标平台为何,使用它们构建 UI 已经变得理所当然。这一理念已经不断演进;我此刻正在使用的 Notion 应用就是 Electron 封装的产物,它与 Tauri 共享最初的核心思想。(话虽如此,Notion 应用的体积竟高达 668MB!)

Tauri 的核心是用 Rust 编写的,Rust 对我而言是一门新语言,但我并不打算深入钻研它。简单来说,Rust 核心负责控制原生窗口和消息传递,从而为 Web 式组件模拟出一个浏览器环境。虽然这种模块化分工可能会让整体架构图显得复杂,但在局部层面却带来了更清晰有序的结构——UI 关注点与操作系统关注点得到了良好分离。

💡 Tauri 是一个使用任意前端框架配合 Rust 核心来构建桌面应用程序的框架。

我或许更希望少写些 JavaScript,但我是个务实主义者。毕竟,当今世界大多数 UI 都是为 Web 而写的。因此,在这次试用中,我按照官方入门指南,使用了提供的 Vite 示例。Tauri 将自己定位为一种“胶水式”技术,专注于工具链本身,这意味着对新手开发者来说,体验可能略显粗糙,因为你需要接触大量不同的组件。就像在自助餐厅吃饭后不舒服时,很难判断到底是哪道菜惹的祸。但另一方面,它也非常适合经验丰富的前端开发者发挥已有技能。

接下来,我将在我的 Mac 上按照指南一步步操作。我知道 Rust 是必要前提,同时也意识到自己的 Node.js 环境可能早已过时。

首先,我在终端中确认是否安装了关键的 Xcode 命令行工具:

xcode-select --install

我已安装了 Node 版本管理器(nvm),但决定安装一个更新且稳定的 Node 版本:

nvm install v16.16.0

随之也获得了一个兼容版本的 npm。

接着安装 Rust 本身:

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

重新加载 Shell 后,我看到 “cargo” 这个词已经可用——没错,Cargo 正是 Rust 的构建系统和包管理器。

在解决了一个奇怪的注册表配置 bug 后,我终于可以按照指南建议使用 npm。在初始化过程中,我根据提示选择了一个简洁的基础模板:

npm create tauri-app

现在,工作目录中包含了常规的 Node 开发要素:一些简单的 HTML、CSS、用于实现计数器功能的一点 JavaScript、一个 package.json 文件、node_modules 文件夹,以及你能看到的 logo 图片。而在名为 src-tauri 的子目录中,则进入了 Rust 的世界,并包含一个 tauri.conf.json 文件。该文件保存了我为应用窗口标题和文件名所指定的名称。

现在,启动开发模式:

npm run tauri dev

我得到了如下非常漂亮的默认应用界面。它包含一个带有简单逻辑的计数按钮(点击后数值递增),点击两个图标中的任意一个都会在外部浏览器中打开对应的网页。除此之外,它就是一个简洁的原生窗口。

image

我们还可以构建一个发布版本,生成一个完全可安装的应用程序:

npm run tauri build

生成的 .dmg 文件允许我通过拖拽到“应用程序”文件夹的方式完成标准 Mac 安装,Launchpad 搜索结果也证实了这一点。
这个应用在我的“应用程序”文件夹中仅占 9MB,足够小巧。虽然我只做了一个非常简单的应用,但整个工具链清晰易懂,在我这台老旧的机器上构建速度也相当快。

临走前,让我们看看能否进一步缩小应用体积。我注意到 tauri.conf.json 中有一个 “allowlist”(白名单)配置项,用于指定哪些模块会被编译进最终应用。当前这个应用唯一需要的特殊功能是能够在外部浏览器中打开网页,因此参考文档,我尝试了以下快速调整:

...
"tauri": {
    "allowlist": {
        "all": false,
        "fs": {
            "all": true
        },
        "shell": {
            "open": true
        },
        "http": {
            "request": true
        }
    }
},
...

结果,构建出的应用体积降至 8MB,且功能依然完整。

从 9MB 减到 8MB 虽然只是小幅优化,但更重要的是,这凸显了 Tauri 在控制应用体积方面的便捷性。

若想更深入探索,就需要对 Rust 有更多了解。而 Rust 目前正处在流行风口,学习它很可能会带来丰厚回报。正如我之前提到的,Tauri 更像是一种方法论加配套工具,而非一个大而全的平台式解决方案。对于希望将 Web 设计快速转化为轻量级原生应用的工程团队来说,它无疑是一个强有力的选择。