跳到内容
Tauri

Tauri 2.0 稳定版本发布

我们非常自豪地宣布 Tauri 新主要版本的稳定版本发布。欢迎来到 Tauri 2.0!

什么是 Tauri?

在 Tauri 应用程序中,前端是用您最喜欢的 Web 前端堆栈编写的。这在操作系统 WebView 中运行,并与主要用 Rust 编写的应用程序核心通信。

a graph showing the IPC bridge between the Application Core and the System's WebView

我应该何时使用 Tauri?

如果您选中以下任何复选框,则应使用 Tauri

  • 您是否想要一个适用于所有平台的单一 UI 代码库?
  • 您是否希望尽可能多地在他们的平台上(例如 Windows、MacOS、Linux、Android、iOS)接触用户?
  • 您是前端 Web 开发人员,想要编写原生应用程序吗?
  • 您是 Rust 开发人员,希望编写具有美观 UI 的应用程序,并可以选择用 Rust 编写吗?
  • 您是否有一个现有的 Web 开发人员团队,并希望以较低的前期投资扩展到原生应用程序市场?
  • 您是否有一个现有的 Rustacean 团队,并希望一切都用 Rust 编写?

a graph showing the progression of Tauri GitHub stars over the years, starting with 0 at 2019 and continuing to grow past 80.000 in 2024

在 GitHub 上,Tauri 存储库有 约 4,878 个拉取请求约 3,570 个已关闭的问题,以及大约 1000 个讨论,在撰写本文时。要获得更详细的了解,请查看 Tauri 存储库的 OSSinsight 分析

我们的 Discord 服务器 目前有约 17,700 名成员。我们看到了很多个人用户支持、关于 Tauri 本身的问题、直接向工作组提出的问题,或者只是 Tauri 应用程序开发人员之间的讨论。

我们对积极和支持性的社区感到非常高兴,并感谢所有在 Discord 或 GitHub 中回答或帮助他人的社区成员。

我们在 awesome-tauri 上维护了一个精选的 Tauri 相关项目、应用程序、插件、指南等列表。如果您想获得灵感,看看其他人在构建什么,并理想地创建一个 PR 来添加您的项目,请查看此列表。

当然,这只是一个有代表性的样本集,我们不确切知道还有谁在 Tauri 上构建。

我们是如何达到 2.0 的?

2022 年 6 月,我们发布了 Tauri 1.0,对桌面操作系统市场以及跨平台应用程序的构建方式产生了巨大影响。

在 2022 年底,我们发布了 2.0 的初始 alpha 版本,以获得初步反馈并测试应如何定义移动交互。

在最初的 alpha 版本之后,我们花了将近两年时间公开改进和更改 Tauri 的架构。在我们自己看到更清晰的全局图景后,我们在今年 2 月发布了 beta 版本。与此同时,我们与外部安全审核员合作,检查我们的决策、架构更改等等。

今年 8 月,我们发布了 2.0 的候选版本,以消除主要错误并从生产性使用中获得更多反馈。与此同时,外部审计也已完成并公开。

候选版本的时间框架相当短,主要包括高影响的错误修复和文档改进。我们在候选版本阶段不得不做出的一些重大更改被捆绑到最后,现在包含在稳定版本中。如果您的主要关注点是从以前的版本升级,请查看迁移部分

总共,我们花费了两年多的时间来改进、添加新功能、修复错误、编写文档、重写代码以及进行大量讨论。

所有这些都发生在我们发布了 8 个 Tauri 1.x 分支的次要版本,并在多个补丁版本中反向移植了安全修复和其他重要错误修复的同时。

是谁使此版本成为可能?

此版本和 Tauri 本身之所以成为可能,仅仅是因为 Lucas 的大量贡献,多年来他提供了源源不断的代码更改 ❤️。

Lucas' contribution graph, with 2744 commits, over 896.000 additions and 688.000 deletions.

显然,Lucas 不是唯一为 Tauri 工作和贡献的人,但我们认为他非常值得特别提及,因为他多年来一直承担、启动和支持该项目及其社区。

我们在 2.0 中收到了来自 AmrFabian-LarsTonyChipJasonYuWeiicbSimonOliver Lemasle 和更多贡献者(来源数据)的重大贡献。

我们收到了越来越多的临时贡献者(一个或极少的 PR)。我们感谢这些,但如果列出所有人,这里将是一个非常长的列表。

我们的组织中有很多(!)存储库,这些存储库支持 Tauri 的成功,如果没有社区和工作组的贡献,Tauri 就不会有今天的成就。非常感谢所有参与者!

另一个特别的致敬和感谢,感谢他们不断参与社区的是 Fabian-LarsSimon。如果您参与了 Tauri 的 Discord 或 Github 讨论,您可能知道他们的名字或头像。

如果您曾经在 Google 或 YouTube 上搜索过 Tauri,您可能看过 Jacob 的直播 之一。如果不是这种情况,请务必查看并订阅,因为他的课程不仅仅是教育性的。

我们心中另一个特殊的位置是 Tauri 董事会,重点是 Daniel Yvetot-Thompson,感谢他为使 Tauri 闻名且可持续发展付出的无数时间、汗水、鲜血和奉献精神。

我们不应忘记的一件重要事情是,我们获得了这个开源项目稳定合作伙伴的支持。

CrabNebula Logo

CrabNebula 授予了上面提到和此处未提及的多个人员特权,不仅在他们的私人时间,而且在工作时间内也致力于 Tauri 生态系统。您可以在我们的博客上找到 合作伙伴关系公告,并且我们对过去一年的这种合作感到非常高兴。

仅在 2024 年,他们就在这个项目上花费了超过 2,870 个工时,这极大地推动了进展,并使我们今天能够宣布稳定的 2.0 版本发布。

如果您还不了解 CrabNebula,请务必查看他们的 产品和服务,如果您不仅有兴趣改进您的工作流程,而且还有兴趣支持 Tauri 生态系统,请考虑与 Tauri 的共生关系。

是什么让 2.0 如此出色?

在此主要版本中,我们改进和更改了构建、开发和发布 Tauri 应用程序的方式和位置的几个方面。在以下部分中,我们将有更详细的了解。这并不涵盖所有内容,但应该让您对您可以从 Tauri 获得什么有一个大致的印象。

入门体验

当您开始使用新的框架或工具时,您始终会经历的一件事是初始入门或入门过程。

我们重视开发人员体验 (DX),并尝试使此初始过程与构建和分发最终应用程序一样无缝。

为此,我们创建了另一个项目,称为 create-tauri-app 或简称 CTA。此工具允许开发人员从头开始,并在几分钟而不是几小时内获得一个正在运行的 Tauri 应用程序。

sh <(curl https://create.tauri.app/sh)

当然,在开始构建应用程序之前,您需要在开发系统上安装一些先决条件。为此,我们在 官方文档 中提供了包含操作系统特定部分的详尽指南。

整个入门体验得到了改进,现在还引导了 iOS 和 Android 的移动开发模板。

热模块替换

在初始入门之后,您将定期开发和调试您的 Tauri 应用程序。我们考虑了在 Tauri 1.x 中已经可以改进您的开发过程的内容,并将热模块替换 (HMR) 扩展到移动设备和模拟器。

这意味着对应用程序前端的所有更改都不需要重建整个应用程序,您可以实时预览它在您正在开发的设备或操作系统中的外观。

插件

使用 Tauri 2.0,我们构建了一个更高级的插件系统。我们将之前的许多功能转移到我们的官方插件中(参见 plugins-workspace),以便社区更容易进入 Tauri 贡献。我们还希望吸引更多插件维护人员,并加快实现新功能的过程。

迁移到插件还有另一个好处。我们将能够为 Tauri 的核心定义完成定义。我们希望稳定核心功能并提供一个稳定的框架,其中移动部件主要是提供对系统特定功能访问权限的插件。

您不再需要了解所有 Tauri 即可改进或实现特定功能。插件通常不依赖于其他插件,但有一些例外。这意味着要实现新的文件系统访问功能,只需贡献 fs 插件而不是 Tauri 本身。

由于此版本也针对移动平台,因此插件系统也支持移动插件。您可以在 iOS 上用 Swift 和 Android 上用 Kotlin 编写或重用原生代码,并使用 Annotations(Android 上的 @Command)直接将函数公开给 Tauri 前端,在 iOS 上实现 SubclassYourPluginClass: Plugin),或者通过从基于 Rust 的 Tauri 命令调用 Swift 或 Kotlin 代码。查看关于如何编写自己的插件的文档

由于我们将 Tauri 作为 2.0 发布,官方插件将遵循 Tauri 的主要版本,以便一目了然地了解与 Tauri 主要版本的兼容性。并非所有插件都像 Tauri 本身一样稳定。

每个插件的稳定性都是按插件定义的,并在插件文档中记录(即将推出)。插件 API 可能会在次要版本中中断,但我们将尽量将这些更改保持在最低限度,特别是对于被认为是稳定的插件。

移动支持

此版本中非常受期待的一部分是移动操作系统支持。以前版本的 Tauri 允许为桌面操作系统使用单个 UI 代码库,但现在这已扩展到 iOS 和 Android。

我们已经调查并试验了不同的解决方案来支持移动设备,并决定使用操作系统本机语言(Swift 和 Kotlin)为 Rust 代码构建接口,并允许开发人员用这些语言编写部分功能。

这意味着您可以重用与系统交互的 Swift 或 Kotlin 应用程序的现有逻辑,并将其公开给 Rust 或前端。目前,这可以通过上面提到的插件系统实现。

我们支持使用模拟器或真机进行开发,并提供大量工具来使该过程尽可能无缝。我们目前对开发人员体验并不完全满意,但正在积极改进以使其与桌面体验相媲美。

在移动端,并非所有官方插件都受支持。有些插件的设计初衷就与移动端不太契合,还有一些插件尚未实现移动端支持。如果您想为这部分内容贡献力量,请查看本文档的最后部分

允许列表已死,允许列表万岁

是的,不再有 allowlist 了,因为我们很快就达到了这个系统的限制。我们最初将其专门用于 Tauri 核心功能,但它甚至没有覆盖 Tauri 的所有 API。我们的新系统不仅覆盖了 Tauri 的所有核心 API 表面,还支持应用程序和插件开发者使用统一的方法来实现他们自己的访问控制和作用域。

我们实现的新系统使用了 permissions - “Tauri 命令的开关”scopes - “Tauri 命令的参数验证”capabilities - “将权限和作用域附加到窗口和 WebView”,以创建一个灵活且易于使用的访问控制系统。

它允许创建命名的权限或作用域文件,并与其他命名的权限或作用域重用和组合它们。这使得构建更细粒度的描述性集合成为可能,其中包含多个简单或复杂的权限和作用域。

作为插件开发者,您可以将多个基本权限抽象到一个 default 权限中。这可以基于您的默认安全假设和威胁模型。所有官方 Tauri 插件的默认权限在默认情况下都是相当安全的。

作为应用程序开发者,您可以使用、扩展或减少插件权限。当然,您也可以为自己的应用程序构建权限和作用域。

通过此添加,Tauri 的核心现在能够理解来自前端 WebView 的命令调用消息是否被允许到达命令函数。它还能够将配置的作用域附加到消息中。

命令实现负责解释和执行作用域。您可以在我们的文档中阅读更多关于我们的威胁模型和安全方法的信息。

外部安全审计

v2 的主要变更和架构在 beta 和发布候选期间由 Radically Open Security 进行了独立审计。请花时间阅读报告,并了解更多关于 @gronke@pcwizz 的出色工作。

整个审计由 NLNet 的优秀人士通过 NGI 的资助完成,我们非常感谢能够获得完全资助的外部安全审计,用于重大版本发布,这让我们感到非常荣幸。

这次审计的结果促使我们重写了开发服务器的暴露方式,特别是针对移动开发。如果没有审计人员的帮助和指导,这次重写是不可能实现的 ❤️。

此外,我们加强了 iFrame API 的暴露,修复了 fshttp 插件的作用域验证和资源标识符访问,提高了跨进程通信的稳定性,以及许多其他与安全相关的修复和改进。

进程间通信 (IPC) 重写

通过重写 IPC 层,我们现在支持了期待已久的原始负载功能,并总体上改变了其底层工作方式。

以前,所有 IPC 负载都经过 json 序列化和反序列化,这造成了开销。当前端和后端之间传输超过几千字节的数据时,这一点尤为明显。

新系统支持 原始请求。这些请求加快了从后端到前端以及反之亦然的大数据传输速度,您可以在其中直接使用原始字节,或使用您自己的(反)序列化过程(例如 bson、protobuf、avro 等)。

对于直接从文件系统读取文件到 WebView 中,我们仍然推荐使用 convertFileSrc 功能,因为如果您不需要在 Rust 后端处理数据,它很可能仍然更快。

分发指南

随着 Tauri 2.0 的发布,分发渠道的多样性大大增加。部分原因是移动生态系统,部分原因是我们的社区贡献。

我们有关于如何发布到 Apple AppstoreGoogle PlayMicrosoft StoreCrabNebula CloudFlathubSnapcraftAUR 以及更多分发格式的官方指南,请参阅我们的分发文档

变更日志

本节包含从 1.x 版本开始的所有更改的简洁列表。

显示完整列表

已添加

  • 添加了移动端支持。
  • 在不稳定的功能标志后添加了多 WebView 支持。有关更多信息,请参阅 WindowBuilder 和 WebviewBuilder。
  • 添加了 rustls-tls cargo 功能标志
  • 在创建 webview 窗口时添加了 shadow 选项,Rust 中添加了 WebviewWindow::set_shadow 方法,以及 JS 中等效的 API。
  • 在 Rust 中添加了 tauri::Webviewtauri::WebviewBuildertauri::WebviewWindowtauri::WebviewWindowBuilder 结构体,以及 Js 中等效的类。旧的 tauri::Windowtauri::WindowBuilder 行为已移至 tauri::WebviewWindowtauri::WebviewWindowBuilder
  • 添加了 tauri::scope::fs 模块
  • 添加了 tauri::App/AppHandle::default_window_icon 方法。
  • 添加了带有 IPC 原语的 tauri::ipc 模块。
  • 添加了 tauri::ipc::Channel 类型和等效的 JS Channel 类型,用于跨 IPC 发送数据。
  • 在创建 webview 窗口时添加了 incognito 选项。
  • 在创建 webview 窗口时添加了 windowEffects 选项,以及 WebviewWindow::set_effects 以尝试在运行时更改效果。
  • 添加了 tauri::path::PathResolver
  • 添加了 tauri::Manager::path 方法以访问新的 PathResolver
  • 在创建 webview 窗口时添加了 visibleOnAllWorkspaces 选项。
  • 添加了 tauri::App/AppHandle::primary_monitorApp/AppHandle::available_monitors 方法。
  • 添加了 tauri::plugin::Builder::on_navigationtauri::plugin::Plugin::on_navigation
  • 添加了 tauri::WebviewWindow::navigate 方法
  • 在 macOS 和 iOS 上为深度链接支持添加了 tauri::RunEvent::Opened
  • 在 bundler 中添加了文件关联支持。
  • 添加了 tauri::App/AppHandle::cleanup_before_exit 以手动调用清理逻辑。在此函数返回后,您应始终立即退出 tauri 应用程序,并且不要使用任何与 tauri 相关的 API。
  • 在 Linux 上,添加了 tauri::WebviewWindow::default_vbox 方法,以获取对包含菜单栏和 webview 的 gtk::Box 的引用。
  • 添加了 linux-libxdo cargo 功能标志(默认禁用),以启用链接到 libxdo,该标志用于使 Linux 上的 CutCopyPasteSelectAll 本地菜单项工作。
  • 在 macOS 上,添加了 tauri::WebviewWindow::ns_view 方法,以获取指向 NSWindow 内容视图的指针。
  • 添加了 tauri::Builder::register_asynchronous_uri_scheme_protocol,以允许异步解析自定义 URI 方案协议请求,以防止阻塞主线程。
  • 包含拖放事件的放置和悬停位置。
  • 添加了 tauri::WebviewWindow::set_progress_bar 方法
  • 在创建 webview 窗口时添加了 tauri::WebviewWindow::set_always_on_bottom 方法和 alwaysOnTop 选项。
  • 添加了 tauri::WebviewWindowBuilder::on_page_load 方法。
  • 添加了 common-controls-v6 cargo 功能标志(默认启用)。
  • 添加了 Window::destroy 以强制关闭窗口。
  • 添加了 tauri::EventId 类型
  • 添加了 tauri::WindowBuilder::on_download 以处理下载请求事件。
  • 添加了 tauri::WebviewWindowBuilder::parent,它是 Windows、Linux 和 macOS 上父功能的便捷包装器。
  • 仅在 Windows 上添加了 tauri::WebviewWindowBuilder::owner
  • 仅在 Linux 上添加了 tauri::WebviewWindowBuilder::transient_fortauri::WebviewWindowBuilder::transient_for_raw
  • 添加了 tauri::WebviewWindow::start_resize_draggingtauri::ResizeDirection 枚举。
  • 添加了 tauri::WebviewWindowBuilder::proxy_url 方法。
  • 添加了 tauri::WebviewEvent 枚举
  • 添加了 tauri::RunEvent::WebviewEvent 变体。
  • 添加了 tauri::Builder::on_webview_eventtauri::Webview::on_webview_event 方法。
  • 添加了 tauri::image 模块,其中包括 tauri::image::Imagetauri::image::JsImage 类型以及 tauri::image::include_img! 宏。
  • 添加了 tauri::is_dev 函数,以确定应用程序是否在开发模式下运行。
  • tauri::Assets trait 上添加了 tauri::Assets::setup 方法,允许您为自定义资源提供程序运行初始化代码。
  • 添加了 tauri::Rect 结构体。
  • 添加了 tauri::WebviewWindow::set_zoom 方法
  • 在创建 webview 窗口时添加了 zoomHotkeys 选项。
  • 添加了 window.isTauri JS 全局函数,以检查是否在 tauri 中运行。
  • 添加了 specta 功能标志,该标志为 AppHandleStateWindowWebviewWebviewWindow 类型添加了 specta 支持。
  • 添加了 tauri::App/AppHandle/WebviewWindow::cursor_position getter,以获取当前光标位置。
  • 添加了 tauri::App/AppHandle/WebviewWindow::monitor_from_point(x,y) getter,以从给定点获取显示器。
  • 添加了 tauri::RunEvent::Reopen,以处理 macOS 上单击 Dock 图标的操作。
  • 在 JS app 模块中添加了 defaultWindowIcon,以在 JS 中检索默认窗口图标。
  • 添加了 tauri::WebviewWindow::set_title_bar_style,以在 macOS 上运行时设置标题栏样式。
  • 添加了 API 以支持分别设置窗口大小约束
    • 添加了 tauri::WindowBuilder::inner_size_constraintstauri::WebviewWindowBuilder::inner_size_constraints
    • 添加了 tauri::WindowSizeConstraints 结构体
    • 添加了 tauri::Window::set_size_constraintstauri::WebviewWindow::set_size_constraints

增强功能

  • 在 IPC 实现上使用自定义协议以提高性能。
  • 增强了新创建窗口的居中效果,使其在可见后不再跳到中心。
  • 您的应用程序不再需要 custom-protocol Cargo 功能,现在已被忽略。要检查是否在生产环境运行,请使用 #[cfg(not(dev))] 而不是 #[cfg(feature = "custom-protocol")]
  • 改进了 JS path API,以便在可能的情况下返回简化的 Windows 路径,即删除 UNC (\\?\) 前缀。
  • 改进了反序列化 Tauri 插件配置时显示的错误消息。
  • 将 gtk 应用程序 ID 设置为 tauri.conf.json 中定义的 identifier,以确保应用程序的唯一性。可以通过将 enableGtkAppId 选项设置为 false 来禁用此功能。
  • 在 Windows 上,本地处理调整未装饰窗口大小的操作,这提高了性能并修复了之前 JS 实现的一些烦恼之处
    • 当光标在边缘移动时,不再出现光标闪烁。
    • 即使 data-tauri-drag-region 元素存在于顶部,也可以从顶部调整大小。
    • 启动调整大小后,点击不会穿透其后面的元素,因此不再发生意外点击。
  • AppHandle::restartprocess::restart 标记为 发散函数

错误修复

  • 不再解包和展平 IPC 上的 payload,这样带有名为 cmdcallbackerroroptionspayload 的参数的命令就不会破坏 IPC。
  • 修复了在事件循环运行时调用 set_activation_policy 的问题。
  • 修复了无法阻止从另一个 webview 关闭窗口的问题。
  • 在 Windows 上,修复了装饰窗口最初不透明,直到调整大小才透明的问题。
  • 解析文件系统作用域检查中的符号链接。
  • 修复了 JS basename(path, 'ext') API 实现删除 ext 的所有出现位置的问题,它应该只删除最后一个。
  • 修复了 Windows 上退出时窗口白色闪烁的问题
  • 分别应用 minWidthminHieghtmaxWidthmaxHeight 约束,这修复了一个长期存在的错误,即除非宽度和高度一起约束,否则这些约束永远不会被应用。

已更改

  • 窗口创建和设置 hook 现在在事件循环准备就绪时调用。
  • default-tls 功能重命名为 native-tls
  • 更改了插件设置 hook 以接受类型为 PluginApi 的第二个参数
  • 更改了 tauri::Window 结构体的行为,并将其旧行为移至新的 tauri::WebviewWindow 类型。
  • tauri::api::path 模块移动到 tauri::path
  • tauri::api::path 中的所有函数移动到 tauri::path::PathResolver 的方法
  • system-tray 功能标志重命名为 tray-icon
  • 更改了 tauri::App::handletauri::Manager::app_handle 方法以返回对 AppHandle 的引用,而不是拥有的值。
  • 更改了 tauri::Builder::register_uri_scheme_protocol 以返回 http::Response 而不是 Result<http::Response>。要返回错误响应,请手动创建状态代码 >= 400 的响应。
  • Windows 和 Android 上的自定义协议现在使用 http 方案而不是 https
  • tauri::Env.args 更改为 tauri::Env.args_os,现在使用 OsString 而不是 String
  • TAURI_AUTOMATION 环境变量更改为 TAURI_WEBVIEW_AUTOMATION
  • 更改了 tauri::Builder::invoke_system 以接受引用而不是拥有的值。
  • 更改了tauri::Builder::invoke_systemtauri::Builder::on_page_load hooks 以接受 tauri::Webview 参数而不是 tauri::Window
  • tauri::command 模块项移动到 tauri::ipc 模块,这样它的导入名称就不会与 tauri::command 宏冲突。
  • 更改了 tauri::App::run_iteration 以接受回调并删除了其返回值。
  • 更改了 AppHandle::exitAppHandle::restart 以触发 RunEvent::ExitRequestedRunEvent::Exit
  • tauri::WebviewWindowBuilder::owner_window 重命名为 tauri::WebviewWindowBuilder::owner_raw,并将 tauri::WebviewWindowBuilder::parent_window 重命名为 tauri::WebviewWindowBuilder::parent_raw
  • window-data-url 功能标志重命名为 webview-data-url
  • 更改了 tauri::WebviewWindow::close 以触发关闭请求事件,而不是强制关闭窗口。使用 tauri::WebviewWindow::destroy 强制关闭。
  • icon-icoicon-png 功能标志分别重命名为 image-icoimage-png
  • 删除了 tauri::Icon 枚举,请改用新的 tauri::Image 类型。以前接受 tauri::Icon 的所有 API 都已更改为接受 tauri::Image
  • 更改了 tauri::Context 结构体和 tauri::Assets trait,使其具有 R: Runtime 泛型。
  • tauri::Context::assets_mut 重命名为 tauri::Context::set_assets
  • 更改了 tauri::Context 类型,使其没有 <A: Assets> 泛型,以便可以使用 Context::set_assets 交换资源实现。
  • 更改了 tauri::Context::assets 以返回 &dyn Assets 而不是 &A 泛型。
  • tauri::FileDropEvent 枚举重命名为 tauri::DragDropEvent 并重命名了其变体。还重命名了 js 事件
  • tauri::WindowEvent::FileDrop 枚举变体重命名为 tauri::WindowEvent::DragDrop
  • 将文件拖放事件重命名为 tauri://drag-entertauri://drag-overtauri://drag-droptauri://drag-leave
  • tauri::WebviewWindow::disable_file_drop_handler 更改为 tauri::WebviewWindow::disable_drag_drop_handler
  • 更改了 tauri::WebviewWindow::url getter 以返回结果。
  • 更改了 tauri::Env.args_os,以包含二进制文件路径,以前跳过了该路径。
  • 将 JS window 模块中的 getAllgetCurrent 重命名为 getAllWindowsgetCurrentWindow,但您可能需要 webviewWindow 模块中的 getAllWebviewWindowsgetCurrentWebviewWindow

已删除

  • 删除了 reqwest-* Cargo 功能
  • UpdaterEvent
  • 删除了 tauri::api 模块,并将其移动到 plugins-workspace repo 中的独立插件中。
  • 删除了 tauri::scope::IpcScope
  • 删除了 tauri::scope::ipc 模块及其所有类型。
  • 删除了 tauri::scope::FsScope,请使用 tauri::scope::fs::Scope
  • 删除了 tauri::scope::GlobPattern,请使用 tauri::scope::fs::Pattern
  • 删除了 tauri::scope::FsScopeEvent,请使用 tauri::scope::fs::Event
  • 删除了 tauri::scope::HttpScope
  • 删除了 tauri::scope::ShellScope
  • 删除了 tauri::scope::ShellScopeAllowedCommand
  • 删除了 tauri::scope::ShellScopeAllowedArg
  • 删除了 tauri::scope::ExecuteArgs
  • 删除了 tauri::scope::ShellScopeConfig
  • 删除了 tauri::scope::ShellScopeError
  • 删除了 linux-protocol-headers cargo 功能标志,现在默认启用。
  • 删除了 tauri::path::Errortauri::path::Result,并将其变体添加到 tauri::Error
  • 删除了 tauri::path::Resulttauri::plugin::Result 别名,您应该使用 tauri::Result 或您自己的 Result 类型。
  • 更改了 tauri::Builder::on_page_load 处理程序以接受引用。页面加载 hook 现在为加载开始和完成事件触发,要确定是什么触发了它,请参阅 tauri::PageLoadPayload::event 字段。
  • 删除了 tauri::GlobalWindowEvent 结构体,并将其字段解包以直接传递给 tauri::Builder::on_window_event
  • 删除了 tauri::EventHandler 类型。
  • tauri::Context::default_window_icon_mut 重命名为 tauri::Context::set_default_window_icon,并将其更改为接受 Option<T>

配置重组

根据 RFC#5 重构了 Tauri 配置

  • package.productNamepackage.versiontauri.bundle.identifier 字段移动到顶层。
  • 删除了 package 对象。
  • tauri 对象重命名为 app
  • tauri.bundle 对象移动到顶层。
  • build.distDir 字段重命名为 frontendDist
  • build.devPath 字段重命名为 devUrl,并且不再接受路径,它将仅接受 URL。
  • tauri.pattern 移动到 app.security.pattern
  • 删除了 tauri.bundle.updater 对象,其字段已移动到 plugins.updater 对象下的 updater 插件中。
  • build.withGlobalTauri 移动到 app.withGlobalTauri
  • tauri.bundle.dmg 对象移动到 bundle.macOS.dmg
  • tauri.bundle.deb 对象移动到 bundle.linux.deb
  • tauri.bundle.appimage 对象移动到 bundle.linux.appimage
  • 从每个 bundle 配置对象中删除了所有 license 字段,而是添加了 bundle.licensebundle.licenseFile
  • AppUrl 重命名为 FrontendDist,并重构了其变体以使其更加明确。
  • tauri.window.fileDropEnabeld 重命名为 app.window.dragDropEnabled

迁移

由于我们力求尽可能平滑地从以前的 Tauri 版本进行迁移,因此我们提供了文档来指导您完成该过程。

如果您是从 1.x 版本迁移,请查看此迁移指南

对于从 2.0 beta 或发布候选版本升级,请查看此迁移指南

Tauri v2 CLI 包含一个 migrate 命令,该命令可以自动执行大部分过程并帮助您完成迁移

npm install @tauri-apps/cli@next
npm run tauri migrate

行动号召

如果您熟悉 Tauri 并且在您的旅程中已经使用过它,请花时间查看 Github DiscussionsGithub Issues。也许您已经解决了您的 Tauri 新手伙伴现在正在遇到的问题。

如果您认为您看到的某些问题是通用的,并且应该在某个地方记录下来,那么我们可能在我们的官方文档中为您准备了完美的位置。

要贡献改进或添加,我们欢迎在 tauri-docs 存储库中提交 PR。请确保您已阅读贡献指南

如果您有能力理解当前文档并将其翻译成您的母语,我们感谢您对我们的文档进行内容翻译

Tauri 周围的存储库也在寻找贡献者,特别是我们希望有更多的维护者和贡献者加入 plugin-workspace

插件现在是 Tauri 开发和用户体验的重要组成部分,欢迎各种形式的帮助。从讨论新的插件想法,与他人合作编写新插件,到贡献 PR 以修复现有插件中的错误,或在插件自述文件或代码中记录奇怪的解决方法和知识。

路线图

您可能期望我们提供未来的可靠计划和新的酷炫想法。我们目前有一些想法,但尚未承诺 2.x 之后的路线图。

我们主要希望通过更好的开发者体验、更好的文档和更少的影响性错误来改进这个主要版本。我们特别希望改善移动开发体验,并使从想法到发布应用程序的整个流程尽可能无缝。

我们认为至少应该提及的未来计划

  • 为 Linux 提供或捆绑 Chromium Embedded Framework (CEF) 作为 WebKit2GTK 的替代方案
  • Servo 作为 Tauri WebView (Wry 中的 POC)

如果您想在这些想法上进行协作,请告知我们,我们将一起解决。


© 2025 Tauri 贡献者。CC-BY / MIT