Tauri 2.0 稳定版发布
我们非常自豪地宣布 Tauri 新主要版本的稳定版发布。欢迎来到 Tauri 2.0!
在 Tauri 应用程序中,前端是用您喜欢的 Web 前端堆栈编写的。它在操作系统 WebView 中运行,并与主要用 Rust 编写的应用程序核心进行通信。
如果您勾选以下任何一个方框,您就应该使用 Tauri
- 您是否希望所有平台使用单个 UI 代码库?
- 您是否希望在用户的平台(例如 Windows、macOS、Linux、Android、iOS)上触达尽可能多的用户?
- 您是前端 Web 开发人员,想编写原生应用程序吗?
- 您是 Rust 开发人员,正在寻找编写具有漂亮 UI 的应用程序,并可以选择使用 Rust 编写吗?
- 您是否拥有一支现有的 Web 开发团队,并希望以低前期投资扩展到原生应用程序市场?
- 您是否拥有一支现有的 Rustacean 团队,并希望所有内容都用 Rust 编写?
截至撰写本文时,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 并不是唯一一个致力于 Tauri 并做出贡献的个人,但我们认为他值得特别提及,因为他多年来一直承载、启动并支持这个项目及其社区。
在 2.0 版本中,Amr、Fabian-Lars、Tony、Chip、Jason、YuWei、icb、Simon、Oliver Lemasle 以及许多其他贡献者 (数据来源) 对 Tauri 仓库做出了重大贡献。
我们收到了越来越多的临时贡献者(一个或很少的 PR)。我们感谢他们,但如果把所有人的名字都列出来,这将是一个非常长的列表。
我们的组织中有大量(!)仓库,它们支持 Tauri 的成功,如果没有社区和工作组的贡献,Tauri 不会是现在这样。非常感谢所有参与者!
另外,特别感谢 Fabian-Lars 和 Simon 对社区的持续投入。如果您曾参与 Tauri 的 Discord 或 Github 讨论,您很可能知道他们的名字或头像。
如果您在 Google 或 YouTube 上搜索过 Tauri,您可能看过 Jacob 的直播。如果还没有,请务必查看并订阅,因为他的会话远不止是教育性的。
Tauri 董事会Tauri 董事会在我们心中也有一个特殊的位置,其中突出提到 Daniel Yvetot-Thompson,他投入了无数小时、汗水、心血和奉献精神,使 Tauri 广为人知并可持续发展。
我们不应忘记的一件重要事情是,我们获得了这个开源项目的稳定合作伙伴的支持。
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)
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 本身做出贡献。
由于此版本也面向移动平台,因此插件系统也支持移动插件。您可以使用 Swift (iOS) 和 Kotlin (Android) 编写或重用原生代码,并通过使用 Annotations
(Android 上的 @Command
)、实现 iOS 上的 Subclass
(YourPluginClass: Plugin
),或从基于 Rust 的 Tauri 命令调用 Swift 或 Kotlin 代码,将函数直接暴露给 Tauri 前端。请查看文档了解如何编写自己的插件。
由于我们发布的是 Tauri 2.0,官方插件将遵循 Tauri 的主要版本,以便一眼就能看出与 Tauri 主要版本的兼容性。
每个插件的稳定性是根据插件定义的,并将在插件文档中(很快)记录。插件 API 可能会在次要版本中发生重大更改,但我们将尽量将这些更改降至最低,特别是对于被认为是稳定的插件。
在系统启动时自动启动您的应用。
允许您的移动应用程序使用摄像头扫描二维码、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
- “将权限和作用域附加到 Windows 和 WebViews”,以创建一个灵活但易于使用的访问控制系统。
它允许创建命名权限或范围文件,并将其与其他命名权限或范围重用和组合。这使得构建更细粒度的描述性集合成为可能,其中包含多个简单或复杂的权限和范围。
作为插件开发者,您可以将多个基本权限抽象为一个 default
权限。这可以基于您的默认安全假设和威胁模型。所有官方 Tauri 插件的默认权限在默认情况下都是合理安全的。
作为应用程序开发人员,您可以使用、扩展或减少插件权限。当然,您也可以为自己的应用程序构建权限和范围。
有了这个新增功能,Tauri 的核心现在能够理解来自前端 WebView 的命令调用消息是否允许到达命令函数。它还能够将配置的范围附加到消息中。
命令实现负责解释和执行范围。您可以在我们的文档中阅读更多关于我们的威胁模型和安全方法的信息。
v2 的主要更改和架构在测试版和发布候选期间由 Radically Open Security 独立审计。请花时间阅读报告,并了解 @gronke 和 @pcwizz 的出色工作。
整个审计工作由 NLNet 通过 NGI 资助,我们非常感谢能够获得主要版本外部安全审计的全额资助。
此次审计结果促使我们重写了开发服务器的暴露方式,特别是针对移动开发。如果没有审计师的帮助和指导,此次重写将是不可能的 ❤️。
此外,我们加强了 iFrame API 的暴露,修复了 fs
和 http
插件的范围验证和资源标识符访问,提高了我们的进程间通信稳定性,以及许多其他与安全相关的修复和改进。
通过重写我们的 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
方法。 - 新增
tauri::ipc
模块,包含 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
,该库用于使Cut
、Copy
、Paste
和SelectAll
本机菜单项在 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_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::setup
方法在tauri::Assets
特征上,允许您为自定义资产提供者运行初始化代码。 - 新增
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 上点击停靠栏图标的事件。 - 新增
defaultWindowIcon
到 JSapp
模块,以在 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
约束,这修复了一个长期存在的错误,即这些约束除非宽度和高度一起约束,否则永远不会应用。
- 窗口创建和设置钩子现在在事件循环就绪时调用。
- 将
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::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
钩子更改为接受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
仓库中的独立插件。 - 移除了
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
处理程序更改为接受引用。页面加载钩子现在在加载开始和完成事件时触发,要确定是什么触发了它,请参阅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.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.licenseFile
。 - 将
AppUrl
重命名为FrontendDist
并重构其变体以更清晰。 - 将
tauri.window.fileDropEnabeld
重命名为app.window.dragDropEnabled
我们力求将从先前 Tauri 版本的迁移过程尽可能顺利,为此我们提供了文档来指导您完成该过程。
如果您正在从 1.x 版本迁移,请查看此迁移指南。
要从 2.0 测试版或发布候选版升级,请查看此迁移指南。
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 修复现有插件中的错误,到记录奇怪的变通方法和插件 README 或代码中的知识。
您可能期待我们有坚实的未来计划和新的酷炫想法。我们目前有一些想法,但尚未承诺 2.x 之外的路线图。
我们主要想专注于改进这个主要版本,提供更好的开发者体验、更好的文档和更少的影响性错误。我们尤其希望改进移动开发体验,并使从想法到发布应用程序的整个流程尽可能无缝。
未来我们认为至少应该提及的一些方面:
- 提供或捆绑 Chromium Embedded Framework (CEF) for Linux 作为 WebKit2GTK 的替代方案
- Servo 作为 Tauri WebView (Wry 中的 POC)
如果您想在这些想法上进行协作,请告诉我们,我们将共同解决。
© 2025 Tauri 贡献者。CC-BY / MIT