Tauri 2.0 稳定版本发布
我们非常自豪地宣布 Tauri 新主要版本的稳定版本发布。欢迎来到 Tauri 2.0!
什么是 Tauri?
在 Tauri 应用程序中,前端是用您最喜欢的 Web 前端堆栈编写的。这在操作系统 WebView 中运行,并与主要用 Rust 编写的应用程序核心通信。
我应该何时使用 Tauri?
如果您选中以下任何复选框,则应使用 Tauri
- 您是否想要一个适用于所有平台的单一 UI 代码库?
- 您是否希望尽可能多地在他们的平台上(例如 Windows、MacOS、Linux、Android、iOS)接触用户?
- 您是前端 Web 开发人员,想要编写原生应用程序吗?
- 您是 Rust 开发人员,希望编写具有美观 UI 的应用程序,并可以选择用 Rust 编写吗?
- 您是否有一个现有的 Web 开发人员团队,并希望以较低的前期投资扩展到原生应用程序市场?
- 您是否有一个现有的 Rustacean 团队,并希望一切都用 Rust 编写?
Tauri 有多受欢迎?
在 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 不是唯一为 Tauri 工作和贡献的人,但我们认为他非常值得特别提及,因为他多年来一直承担、启动和支持该项目及其社区。
我们在 2.0 中收到了来自 Amr、Fabian-Lars、Tony、Chip、Jason、YuWei、icb 、Simon、Oliver Lemasle 和更多贡献者(来源数据)的重大贡献。
我们收到了越来越多的临时贡献者(一个或极少的 PR)。我们感谢这些,但如果列出所有人,这里将是一个非常长的列表。
我们的组织中有很多(!)存储库,这些存储库支持 Tauri 的成功,如果没有社区和工作组的贡献,Tauri 就不会有今天的成就。非常感谢所有参与者!
另一个特别的致敬和感谢,感谢他们不断参与社区的是 Fabian-Lars 和 Simon。如果您参与了 Tauri 的 Discord 或 Github 讨论,您可能知道他们的名字或头像。
如果您曾经在 Google 或 YouTube 上搜索过 Tauri,您可能看过 Jacob 的直播 之一。如果不是这种情况,请务必查看并订阅,因为他的课程不仅仅是教育性的。
我们心中另一个特殊的位置是 Tauri 董事会,重点是 Daniel Yvetot-Thompson,感谢他为使 Tauri 闻名且可持续发展付出的无数时间、汗水、鲜血和奉献精神。
我们不应忘记的一件重要事情是,我们获得了这个开源项目稳定合作伙伴的支持。
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)
irm https://create.tauri.app/ps | iex
sh (curl -sSL https://create.tauri.app/sh | psub)
npm create tauri-app@latest
yarn create tauri-app
pnpm create tauri-app
deno run -A npm:create-tauri-app
bun create tauri-app
cargo install create-tauri-app --lockedcargo create-tauri-app
当然,在开始构建应用程序之前,您需要在开发系统上安装一些先决条件。为此,我们在 官方文档 中提供了包含操作系统特定部分的详尽指南。
整个入门体验得到了改进,现在还引导了 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 上实现 Subclass
(YourPluginClass: Plugin
),或者通过从基于 Rust 的 Tauri 命令调用 Swift 或 Kotlin 代码。查看关于如何编写自己的插件的文档。
由于我们将 Tauri 作为 2.0 发布,官方插件将遵循 Tauri 的主要版本,以便一目了然地了解与 Tauri 主要版本的兼容性。并非所有插件都像 Tauri 本身一样稳定。
每个插件的稳定性都是按插件定义的,并在插件文档中记录(即将推出)。插件 API 可能会在次要版本中中断,但我们将尽量将这些更改保持在最低限度,特别是对于被认为是稳定的插件。
在系统启动时自动启动您的应用程序。
允许您的移动应用程序使用相机扫描 QR 码、EAN-13 和其他类型的条形码。
提示用户在 Android 和 iOS 上进行生物识别身份验证。
读取和写入系统剪贴板。
从命令行界面解析参数。
将您的 Tauri 应用程序设置为 URL 的默认处理程序。
用于打开和保存文件以及消息对话框的本机系统对话框。
访问文件系统。
注册全局快捷方式。
访问用 Rust 编写的 HTTP 客户端。
在生产应用程序中使用本地主机服务器。
可配置的日志记录。
在 Android 和 iOS 上读取和写入 NFC 标签。
向用户发送本机通知。
在外部应用程序中打开文件和 URL。
读取有关操作系统的信息。
在文件系统上持久化运行时范围更改。
将窗口移动到常用位置。
访问当前进程。
访问系统 Shell 以生成子进程。
确保您的 Tauri 应用程序的单个实例一次运行。
Tauri 插件,为前端提供接口,以通过 sqlx 与 SQL 数据库通信。
持久键值存储。
加密的安全数据库。
Tauri 应用程序的应用内更新。
通过 HTTP 进行文件上传。
在 JavaScript 中使用 Rust 客户端打开 WebSocket 连接。
持久化窗口大小和位置。
移动支持
此版本中非常受期待的一部分是移动操作系统支持。以前版本的 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 的暴露,修复了 fs
和 http
插件的作用域验证和资源标识符访问,提高了跨进程通信的稳定性,以及许多其他与安全相关的修复和改进。
进程间通信 (IPC) 重写
通过重写 IPC 层,我们现在支持了期待已久的原始负载功能,并总体上改变了其底层工作方式。
以前,所有 IPC 负载都经过 json 序列化和反序列化,这造成了开销。当前端和后端之间传输超过几千字节的数据时,这一点尤为明显。
新系统支持 原始请求。这些请求加快了从后端到前端以及反之亦然的大数据传输速度,您可以在其中直接使用原始字节,或使用您自己的(反)序列化过程(例如 bson、protobuf、avro 等)。
对于直接从文件系统读取文件到 WebView 中,我们仍然推荐使用 convertFileSrc
功能,因为如果您不需要在 Rust 后端处理数据,它很可能仍然更快。
分发指南
随着 Tauri 2.0 的发布,分发渠道的多样性大大增加。部分原因是移动生态系统,部分原因是我们的社区贡献。
我们有关于如何发布到 Apple Appstore、Google Play、Microsoft Store、CrabNebula Cloud、Flathub、Snapcraft、AUR 以及更多分发格式的官方指南,请参阅我们的分发文档。
变更日志
本节包含从 1.x 版本开始的所有更改的简洁列表。
显示完整列表
已添加
- 添加了移动端支持。
- 在不稳定的功能标志后添加了多 WebView 支持。有关更多信息,请参阅 WindowBuilder 和 WebviewBuilder。
- 添加了
rustls-tls
cargo 功能标志 - 在创建 webview 窗口时添加了
shadow
选项,Rust 中添加了WebviewWindow::set_shadow
方法,以及 JS 中等效的 API。 - 在 Rust 中添加了
tauri::Webview
、tauri::WebviewBuilder
、tauri::WebviewWindow
、tauri::WebviewWindowBuilder
结构体,以及 Js 中等效的类。旧的tauri::Window
和tauri::WindowBuilder
行为已移至tauri::WebviewWindow
和tauri::WebviewWindowBuilder
。 - 添加了
tauri::scope::fs
模块 - 添加了
tauri::App/AppHandle::default_window_icon
方法。 - 添加了带有 IPC 原语的
tauri::ipc
模块。 - 添加了
tauri::ipc::Channel
类型和等效的 JSChannel
类型,用于跨 IPC 发送数据。 - 在创建 webview 窗口时添加了
incognito
选项。 - 在创建 webview 窗口时添加了
windowEffects
选项,以及WebviewWindow::set_effects
以尝试在运行时更改效果。 - 添加了
tauri::path::PathResolver
- 添加了
tauri::Manager::path
方法以访问新的PathResolver
- 在创建 webview 窗口时添加了
visibleOnAllWorkspaces
选项。 - 添加了
tauri::App/AppHandle::primary_monitor
和App/AppHandle::available_monitors
方法。 - 添加了
tauri::plugin::Builder::on_navigation
和tauri::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 上的Cut
、Copy
、Paste
和SelectAll
本地菜单项工作。 - 在 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_for
和tauri::WebviewWindowBuilder::transient_for_raw
。 - 添加了
tauri::WebviewWindow::start_resize_dragging
和tauri::ResizeDirection
枚举。 - 添加了
tauri::WebviewWindowBuilder::proxy_url
方法。 - 添加了
tauri::WebviewEvent
枚举 - 添加了
tauri::RunEvent::WebviewEvent
变体。 - 添加了
tauri::Builder::on_webview_event
和tauri::Webview::on_webview_event
方法。 - 添加了
tauri::image
模块,其中包括tauri::image::Image
和tauri::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
功能标志,该标志为AppHandle
、State
、Window
、Webview
和WebviewWindow
类型添加了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_constraints
和tauri::WebviewWindowBuilder::inner_size_constraints
- 添加了
tauri::WindowSizeConstraints
结构体 - 添加了
tauri::Window::set_size_constraints
和tauri::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::restart
和process::restart
标记为 发散函数
错误修复
- 不再解包和展平 IPC 上的
payload
,这样带有名为cmd
、callback
、error
、options
或payload
的参数的命令就不会破坏 IPC。 - 修复了在事件循环运行时调用
set_activation_policy
的问题。 - 修复了无法阻止从另一个 webview 关闭窗口的问题。
- 在 Windows 上,修复了装饰窗口最初不透明,直到调整大小才透明的问题。
- 解析文件系统作用域检查中的符号链接。
- 修复了 JS
basename(path, 'ext')
API 实现删除ext
的所有出现位置的问题,它应该只删除最后一个。 - 修复了 Windows 上退出时窗口白色闪烁的问题
- 分别应用
minWidth
、minHieght
、maxWidth
和maxHeight
约束,这修复了一个长期存在的错误,即除非宽度和高度一起约束,否则这些约束永远不会被应用。
已更改
- 窗口创建和设置 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::handle
和tauri::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_system
、tauri::Builder::on_page_load
hooks 以接受tauri::Webview
参数而不是tauri::Window
。 - 将
tauri::command
模块项移动到tauri::ipc
模块,这样它的导入名称就不会与tauri::command
宏冲突。 - 更改了
tauri::App::run_iteration
以接受回调并删除了其返回值。 - 更改了
AppHandle::exit
和AppHandle::restart
以触发RunEvent::ExitRequested
和RunEvent::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-ico
和icon-png
功能标志分别重命名为image-ico
和image-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-enter
、tauri://drag-over
、tauri://drag-drop
和tauri://drag-leave
- 将
tauri::WebviewWindow::disable_file_drop_handler
更改为tauri::WebviewWindow::disable_drag_drop_handler
。 - 更改了
tauri::WebviewWindow::url
getter 以返回结果。 - 更改了
tauri::Env.args_os
,以包含二进制文件路径,以前跳过了该路径。 - 将 JS
window
模块中的getAll
和getCurrent
重命名为getAllWindows
和getCurrentWindow
,但您可能需要webviewWindow
模块中的getAllWebviewWindows
和getCurrentWebviewWindow
。
已删除
- 删除了
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::Error
和tauri::path::Result
,并将其变体添加到tauri::Error
- 删除了
tauri::path::Result
和tauri::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.productName
、package.version
和tauri.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.license
和bundle.licenseFile
。 - 将
AppUrl
重命名为FrontendDist
,并重构了其变体以使其更加明确。 - 将
tauri.window.fileDropEnabeld
重命名为app.window.dragDropEnabled
迁移
由于我们力求尽可能平滑地从以前的 Tauri 版本进行迁移,因此我们提供了文档来指导您完成该过程。
如果您是从 1.x 版本迁移,请查看此迁移指南。
对于从 2.0 beta 或发布候选版本升级,请查看此迁移指南。
Tauri v2 CLI 包含一个 migrate
命令,该命令可以自动执行大部分过程并帮助您完成迁移
npm install @tauri-apps/cli@nextnpm run tauri migrate
yarn upgrade @tauri-apps/cli@nextyarn tauri migrate
pnpm update @tauri-apps/cli@nextpnpm tauri migrate
cargo install tauri-cli --version "^2.0.0" --lockedcargo tauri migrate
行动号召
如果您熟悉 Tauri 并且在您的旅程中已经使用过它,请花时间查看 Github Discussions、Github 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