Tauri 2.0 稳定版
我们非常自豪地终于宣布了 Tauri 新的主要版本的稳定版发布。欢迎来到 Tauri 2.0!
什么是Tauri?
在 Tauri 应用程序中,前端使用您最喜欢的网络前端栈编写。它运行在操作系统 WebView 中,并与主要用 Rust 编写的应用程序核心进行通信。
何时应该使用 Tauri?
如果您勾选以下任何一个框,您应该使用 Tauri
- 您是否想要适用于所有平台的单一 UI 代码库?
- 您是否想尽可能多地在他们的平台上接触用户(例如 Windows、MacOS、Linux、Android、iOS)?
- 您是一名前端网络开发人员,想要编写本机应用程序吗?
- 您是一名 Rust 开发人员,希望编写具有漂亮用户界面并且可以选择使用 Rust 的应用程序吗?
- 您是否有一支现有的网络开发团队,想以较低的初期投入扩展到本机应用程序市场?
- 您是否有一支现有的 Rust 队伍,希望将一切都用 Rust 编写?
Tauri 的流行程度如何?
截至写作时,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并不是唯一一位为Tauri做贡献的个体,但我们认为他应得到特殊的提及,因为他在多年来一直承载、启动并支持该项目和其社区。
2.0中,我们从Amr、Fabian-Lars、Tony、Chip、Jason、YuWei、icb、Simon、Oliver Lemasle以及许多其他贡献者(来源数据)那里获得了主要贡献。
我们还收到了越来越多的drive-by贡献者(一或几个PR)。我们对此表示感谢,但如果列出所有人,这里将会是一个非常长的名单。
我们的组织中有大量的库,它们支持了Tauri的成功,而没有社区和工作组的贡献,Tauri现在不会处于这种状态。对每个人都表示衷心的感谢!
还有两项特别的呼吁和感谢,感谢他们在社区中的持续参与:Fabian-Lars和Simon。如果您参与过Tauri的Discord或Github讨论,您可能知道他们的名字或头像。
如果您曾在 Google 或 YouTube 上搜索过 Tauri,您可能已经看过 Jacob 的直播之一。点此查看 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
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即可改进或实现特定功能。插件通常不依赖于其他插件(有少数例外)。这意味着要实现一个新的文件系统访问功能,只需 contributes to the fs
插件即可,而不是Tauri本身。
由于这个版本也针对移动平台,插件系统也支持移动插件。您可以在iOS上以Swift编写或重用原生代码,在Android上以Kotlin编写,并使用Annotations
(Android上的@Command
)将函数直接暴露给Tauri前端,或者通过从Rust基于Tauri的命令中调用Swift或Kotlin代码。有关如何编写自己的插件,请参阅文档。
由于我们现在发布Tauri为2.0版本,官方插件将遵循Tauri的主要版本,以便一目了然地看到与Tauri主要版本的兼容性。但并非所有插件都像Tauri本身那样稳定。
每个插件的稳定性都是由每个插件定义并(即将)在插件文档中记录的。插件API可能在较小版本中破坏,但我们将尽量将这些更改保持在最低限度,特别是对于被认为是稳定的插件。
在系统启动时自动启动您的应用程序。
允许您的移动应用程序使用相机扫描二维码、EAN-13和其他类型的条形码。
在Android和iOS上提示用户进行生物识别认证。
读取和写入系统剪贴板。
解析命令行界面的参数。
将您的Tauri应用程序设置为URL的默认处理器。
用于打开和保存文件的本地系统对话框以及消息对话框。
访问文件系统。
注册全局快捷键。
访问由Rust编写的HTTP客户端。
在生产应用程序中使用localhost服务器。
可配置的日志记录。
在Android和iOS上读取和编写NFC标签。
向用户发送原生通知。
读取有关操作系统的信息。
在文件系统中持久化运行时范围更改。
将窗口移动到常见位置。
访问当前进程。
访问系统shell以使用默认应用程序管理文件和URL以及生成子进程。
确保您的Tauri应用程序一次只运行一个实例。
Tauri插件提供通过sqlx与SQL数据库通信的接口。
持久键值存储。
加密安全的数据库。
Tauri应用程序的内联更新。
通过HTTP进行文件上传。
使用Rust客户端在JavaScript中打开WebSocket连接。
持久窗口大小和位置。
移动端支持
这次发布备受期待的部分是移动操作系统支持。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的暴露性,为fs
和http
插件修复了作用域验证和资源标识符访问,改进了我们的进程间通信稳定性,以及许多其他安全相关的修复和改进。
进程间通信(IPC)重写
通过重写我们的IPC层,我们现在支持了长久期待的原始数据包特性,并且一般地改变了其内部工作方式。
以前,所有IPC数据包都是进行json序列化和反序列化,这导致了开销。一旦在前端和后端之间传输几KB以上的数据,这个开销就会变得明显。
新系统支持原始请求。这些可以加快从后端到前端以及反过来的大数据传输速度,您可以选择直接使用原始字节,或者使用您自己的(反)序列化过程(例如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
。 - 增加了用于访问新的
PathResolver
的tauri::Manager::path
方法。 - 在创建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
方法。 - 增加了
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::Image
和tauri::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
功能标志,该标志为AppHandle
、State
、Window
、Webview
和WebviewWindow
类型添加了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_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
、minHeight
、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
特性修改为带有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-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
获取器修改为返回一个结果。 - 将
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
货物特性标记,现在默认启用。 - 已移除
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>
。
配置重构
根据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
对象下的更新插件中。 - 将
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 测试版或发布候选版本,请查看这篇 迁移指南。
塔里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
行动号召
如果您熟悉塔里并在您的旅程中使用过它,请抽空查看 GitHub 讨论区 和 GitHub 问题跟踪。也许您已经解决了塔里新用户目前遇到的问题。
如果您认为您看到的一些问题可能是通用的,应该有一些地方记录下来,我们可能在我们的官方 文档 中找到了一个完美的位置。
为了贡献改进或添加内容,我们欢迎在 tauri-docs 存储库中提交 PR。不过,请确保您已经阅读了贡献指南 贡献指南。
如果您能够理解并将当前文档翻译成您的母语,我们将极大地欢迎 内容翻译 到我们的文档中。
围绕塔里的存储库也在寻找贡献者,尤其是我们非常希望有维护者和贡献者加入对 plugin-workspace
。
现在插件已成为塔里开发和用户体验的重要组成部分,各种帮助都受欢迎。从讨论新插件创意、与其他人合作编写新插件,到为现有插件修复错误的 PR 或在插件 README 或代码中记录奇怪的解决方案和知识。
路线图
您可能期望我们看到更稳定的未来计划和新颖的想法。我们目前有一些想法,但尚未承诺在 2.x 以后的路线图。
我们主要希望专注于提高这个主要版本的开发者体验、更好的文档和更低影响度的错误。我们特别希望通过改进移动开发体验,使从想法到发布的应用程序的过程尽可能无缝。
对于未来的事项,我们认为至少应该提到以下几点
如果您想要参与这些想法的合作,请告诉我们,我们将一起解决这个问题。
© 2025 Tauri 贡献者。CC-BY / MIT