跳转到内容
Tauri

Tauri 2.0 稳定版

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

什么是Tauri?

在 Tauri 应用程序中,前端使用您最喜欢的网络前端栈编写。它运行在操作系统 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)?
  • 您是一名前端网络开发人员,想要编写本机应用程序吗?
  • 您是一名 Rust 开发人员,希望编写具有漂亮用户界面并且可以选择使用 Rust 的应用程序吗?
  • 您是否有一支现有的网络开发团队,想以较低的初期投入扩展到本机应用程序市场?
  • 您是否有一支现有的 Rust 队伍,希望将一切都用 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 个已关闭问题,以及大约 1,000 次讨论。要了解更详细的信息,请查看 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的发布候选版本,以修复主要错误并获得更多来自实际应用的反馈。同时,外部审计完成并公开发布。

发布候选版本的时间框架相对较短,主要由高影响力的错误修复和文档改进组成。我们在发布候选阶段必须进行的一些破坏性变更被捆绑在一起,并在最终的稳定版本中包含在内。如果您主要是关注从旧版本升级,请查看迁移部分

总计,我们投入了两年的时间来改进、新增功能、错误修复、文档编写、重写以及大量的讨论。

在此期间,我们还发布了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以及许多其他贡献者(来源数据)那里获得了主要贡献。

我们还收到了越来越多的drive-by贡献者(一或几个PR)。我们对此表示感谢,但如果列出所有人,这里将会是一个非常长的名单。

我们的组织中有大量的,它们支持了Tauri的成功,而没有社区和工作组的贡献,Tauri现在不会处于这种状态。对每个人都表示衷心的感谢!

还有两项特别的呼吁和感谢,感谢他们在社区中的持续参与:Fabian-LarsSimon。如果您参与过Tauri的Discord或Github讨论,您可能知道他们的名字或头像。

如果您曾在 Google 或 YouTube 上搜索过 Tauri,您可能已经看过 Jacob 的直播之一。点此查看 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即可改进或实现特定功能。插件通常不依赖于其他插件(有少数例外)。这意味着要实现一个新的文件系统访问功能,只需 contributes to the fs 插件即可,而不是Tauri本身。

由于这个版本也针对移动平台,插件系统也支持移动插件。您可以在iOS上以Swift编写或重用原生代码,在Android上以Kotlin编写,并使用Annotations(Android上的@Command)将函数直接暴露给Tauri前端,或者通过从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 - “将权限和范围附加到Windows和WebViews”,以创建一个灵活且易于使用的访问控制系统。

它允许创建命名的权限或范围文件,并可以将它们与其他命名的权限或范围重新使用和组合。这使得可以构建包含多个简单或复杂权限和范围的更精细grained描述集。

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

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

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

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

外部安全审计

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

整个审计由NLNet的大力支持完成,资金来源于NGI,我们非常感激能够拥有这个特权地位,为我们主要版本提供全额资助的独立安全审计。

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

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

进程间通信(IPC)重写

通过重写我们的IPC层,我们现在支持了长久期待的原始数据包特性,并且一般地改变了其内部工作方式。

以前,所有IPC数据包都是进行json序列化和反序列化,这导致了开销。一旦在前端和后端之间传输几KB以上的数据,这个开销就会变得明显。

新系统支持原始请求。这些可以加快从后端到前端以及反过来的大数据传输速度,您可以选择直接使用原始字节,或者使用您自己的(反)序列化过程(例如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
  • 增加了用于访问新的PathResolvertauri::Manager::path方法。
  • 在创建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方法。
  • 增加了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::Imagetauri::image::JsImage类型以及tauri::image::include_img!宏的tauri::image模块。
  • 增加了用于确定应用程序是否以开发模式运行的tauri::is_dev函数。
  • tauri::Assets特质上增加了tauri::Assets::setup方法,该特质允许您运行自定义资源提供程序的初始化代码。
  • 增加了tauri::Rect结构体。
  • 增加了tauri::WebviewWindow::set_zoom方法。
  • 在创建webview窗口时增加了zoomHotkeys选项。
  • 增加了window.isTauri JS全局函数,用于检查是否在tauri中运行。
  • 增加了specta功能标志,该标志为AppHandleStateWindowWebviewWebviewWindow类型添加了specta支持。
  • 增加了获取当前光标位置的tauri::App/AppHandle/WebviewWindow::cursor_position获取器。
  • 增加了从指定点获取监视器的tauri::App/AppHandle/WebviewWindow::monitor_from_point(x,y)获取器。
  • 增加了处理在macOS上点击Dock图标的tauri::RunEvent::Reopen
  • 向JS app模块中增加了defaultWindowIcon,以在JS中检索默认窗口图标。
  • 在macOS上添加了 tauri::WebviewWindow::set_title_bar_style 以运行时设置标题栏。
  • 增加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上退出时窗口发生白色闪烁的问题。
  • 分别应用 minWidthminHeightmaxWidthmaxHeight 限制,修复了一个长期存在的错误,其中这些限制除非宽度和高度一起限制,否则都不会应用。

更改

  • 当事件循环准备好时,现在会调用窗口创建和设置钩子。
  • 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 特性修改为带有 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,并重命名了其变体。同时重命名了 JavaScript 事件。
  • 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 获取器修改为返回一个结果。
  • 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 货物特性标记,现在默认启用。
  • 已移除 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>

配置重构

根据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 对象下的更新插件中。
  • 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 测试版或发布候选版本,请查看这篇 迁移指南

塔里v2 CLI 包含一个 migrate 命令,它自动化了大部分过程,并帮助您完成迁移。

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

行动号召

如果您熟悉塔里并在您的旅程中使用过它,请抽空查看 GitHub 讨论区GitHub 问题跟踪。也许您已经解决了塔里新用户目前遇到的问题。

如果您认为您看到的一些问题可能是通用的,应该有一些地方记录下来,我们可能在我们的官方 文档 中找到了一个完美的位置。

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

如果您能够理解并将当前文档翻译成您的母语,我们将极大地欢迎 内容翻译 到我们的文档中。

围绕塔里的存储库也在寻找贡献者,尤其是我们非常希望有维护者和贡献者加入对 plugin-workspace

现在插件已成为塔里开发和用户体验的重要组成部分,各种帮助都受欢迎。从讨论新插件创意、与其他人合作编写新插件,到为现有插件修复错误的 PR 或在插件 README 或代码中记录奇怪的解决方案和知识。

路线图

您可能期望我们看到更稳定的未来计划和新颖的想法。我们目前有一些想法,但尚未承诺在 2.x 以后的路线图。

我们主要希望专注于提高这个主要版本的开发者体验、更好的文档和更低影响度的错误。我们特别希望通过改进移动开发体验,使从想法到发布的应用程序的过程尽可能无缝。

对于未来的事项,我们认为至少应该提到以下几点

  • 为 Linux 提供/打包嵌入式 Chromium 框架 (CEF),作为 WebKit2GTK 的替代方案
  • Servo 作为塔里 WebView(在 Wry 的 POC

如果您想要参与这些想法的合作,请告诉我们,我们将一起解决这个问题。


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