跳到内容
Tauri

Tauri 2.0 稳定版发布

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

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

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

如果您勾选以下任何一个方框,您就应该使用 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

截至撰写本文时,Tauri 仓库在 GitHub 上有约 4,878 个已关闭的 Pull 请求约 3,570 个已关闭的 Issues,以及约1000 次讨论。要获得更详细的见解,请查看 Tauri 仓库的 OSSinsight 分析

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

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

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

当然,这只是一个有代表性的样本集,我们不完全知道还有谁在使用 Tauri 进行构建。

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

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

在初始 Alpha 版本发布后,我们花了近两年的时间公开完善和修改 Tauri 的架构。在我们自己对整体情况足够清晰后,我们于今年 2 月发布了 Beta 版本。同时,我们与外部安全审计师合作,检查我们的决策、架构更改等等。

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

发布候选版本的时间范围相对较短,主要包括高影响力的错误修复和文档改进。在发布候选阶段我们不得不做出的一些破坏性更改已捆绑在一起,直到最后才包含在稳定版本中。如果您主要关注从以前版本升级,请查看迁移部分

总的来说,我们花了两年多的时间在改进、新功能、错误修复、文档、重写和大量讨论上。

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

本次发布以及 Tauri 本身之所以能够实现,得益于 Lucas 的大量贡献,多年来他提供了源源不断的代码更改 ❤️。

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

显然,Lucas 并不是唯一一个致力于 Tauri 并做出贡献的个人,但我们认为他值得特别提及,因为他多年来一直承载、启动并支持这个项目及其社区。

在 2.0 版本中,AmrFabian-LarsTonyChipJasonYuWeiicbSimonOliver Lemasle 以及许多其他贡献者 (数据来源) 对 Tauri 仓库做出了重大贡献。

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

我们的组织中有大量(!)仓库,它们支持 Tauri 的成功,如果没有社区和工作组的贡献,Tauri 不会是现在这样。非常感谢所有参与者!

另外,特别感谢 Fabian-LarsSimon 对社区的持续投入。如果您曾参与 Tauri 的 Discord 或 Github 讨论,您很可能知道他们的名字或头像。

如果您在 Google 或 YouTube 上搜索过 Tauri,您可能看过 Jacob 的直播。如果还没有,请务必查看并订阅,因为他的会话远不止是教育性的。

Tauri 董事会Tauri 董事会在我们心中也有一个特殊的位置,其中突出提到 Daniel Yvetot-Thompson,他投入了无数小时、汗水、心血和奉献精神,使 Tauri 广为人知并可持续发展。

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

CrabNebula Logo

CrabNebula 赋予了上述和未提及的多人特权,不仅在业余时间,还在工作时间从事 Tauri 生态系统的工作。您可以在我们的博客上找到合作公告,我们对过去一年的合作感到非常满意。

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

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

通过这个主要版本,我们改进并更改了构建、开发和发布 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 本身做出贡献。

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

由于我们发布的是 Tauri 2.0,官方插件将遵循 Tauri 的主要版本,以便一眼就能看出与 Tauri 主要版本的兼容性。

每个插件的稳定性是根据插件定义的,并将在插件文档中(很快)记录。插件 API 可能会在次要版本中发生重大更改,但我们将尽量将这些更改降至最低,特别是对于被认为是稳定的插件。

这个版本备受期待的一部分是移动操作系统支持。Tauri 的先前版本允许桌面操作系统拥有一个单一的 UI 代码库,但现在这扩展到 iOS 和 Android。

我们研究并尝试了不同的解决方案来支持移动设备,并决定使用操作系统原生语言(Swift 和 Kotlin)来构建 Rust 代码的接口,并允许开发者用这些语言编写部分功能。

这意味着您可以重用现有的 Swift 或 Kotlin 应用程序逻辑,该逻辑与系统交互并将其暴露给 Rust 或前端。目前,这通过插件系统实现,如上所述。

我们支持使用模拟器或真实设备进行开发,并提供大量工具使过程尽可能无缝。目前我们对开发者体验并不完全满意,但正在积极改进以使其达到桌面体验的水平。

在移动设备上,并非所有官方插件都受支持。有些插件设计上就不适合移动设备,有些则尚未实现以支持移动设备。如果您想在此部分做出贡献,请查看此帖子的最后一部分

是的,allowlist 已经不存在了,因为我们很快就达到了这个系统的极限。我们把它专门用于 Tauri 核心功能,甚至没有涵盖所有 Tauri 的 API。我们的新系统不仅涵盖了所有 Tauri 的核心 API 接口,还支持应用程序和插件开发者以统一的方式实现自己的访问控制和作用域。

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

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

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

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

有了这个新增功能,Tauri 的核心现在能够理解来自前端 WebView 的命令调用消息是否允许到达命令函数。它还能够将配置的范围附加到消息中。

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

v2 的主要更改和架构在测试版和发布候选期间由 Radically Open Security 独立审计。请花时间阅读报告,并了解 @gronke@pcwizz 的出色工作。

整个审计工作由 NLNet 通过 NGI 资助,我们非常感谢能够获得主要版本外部安全审计的全额资助。

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

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

通过重写我们的 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 方法。
  • 新增 tauri::ipc 模块,包含 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,该库用于使 CutCopyPasteSelectAll 本机菜单项在 Linux 上工作。
  • 在 macOS 上,添加 tauri::WebviewWindow::ns_view 方法以获取 NSWindow 内容视图的指针。
  • 新增 tauri::Builder::register_asynchronous_uri_scheme_protocol 以允许异步解析自定义 URI 方案协议请求,以防止阻塞主线程。
  • 包含了拖放事件的放置和悬停位置。
  • 新增 tauri::WebviewWindow::set_progress_bar 方法
  • 新增 tauri::WebviewWindow::set_always_on_bottom 方法和创建 webview 窗口时的 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::setup 方法在 tauri::Assets 特征上,允许您为自定义资产提供者运行初始化代码。
  • 新增 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 上点击停靠栏图标的事件。
  • 新增 defaultWindowIcon 到 JS app 模块,以在 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 约束,这修复了一个长期存在的错误,即这些约束除非宽度和高度一起约束,否则永远不会应用。
  • 窗口创建和设置钩子现在在事件循环就绪时调用。
  • default-tls 功能重命名为 native-tls
  • 将插件设置钩子更改为接受第二个参数,类型为 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 钩子更改为接受 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 仓库中的独立插件。
  • 移除了 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 处理程序更改为接受引用。页面加载钩子现在在加载开始和完成事件时触发,要确定是什么触发了它,请参阅 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>

Tauri 配置已按 RFC#5 重构

  • 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.licensebundle.licenseFile
  • AppUrl 重命名为 FrontendDist 并重构其变体以更清晰。
  • tauri.window.fileDropEnabeld 重命名为 app.window.dragDropEnabled

我们力求将从先前 Tauri 版本的迁移过程尽可能顺利,为此我们提供了文档来指导您完成该过程。

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

要从 2.0 测试版或发布候选版升级,请查看此迁移指南

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 修复现有插件中的错误,到记录奇怪的变通方法和插件 README 或代码中的知识。

您可能期待我们有坚实的未来计划和新的酷炫想法。我们目前有一些想法,但尚未承诺 2.x 之外的路线图。

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

未来我们认为至少应该提及的一些方面:

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

如果您想在这些想法上进行协作,请告诉我们,我们将共同解决。


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