2026/4/18 8:53:24
网站建设
项目流程
绵阳做网站的,阿里云免费企业邮箱申请,wordpress插件转换移动浏览,顺企网官网登录背景
近期#xff0c;我基于自研的个人时间管理 Web 应用 「时光助手」#xff0c;借助 AI 辅助开发#xff0c;通过 Tauri 框架完成了 Windows 客户端的打包工作。初次体验 Tauri 便收获了不错的反馈 —— 其生成的客户端体积轻量化、运行性能优异#xff0c;且与 Web 端…背景近期我基于自研的个人时间管理 Web 应用「时光助手」借助 AI 辅助开发通过 Tauri 框架完成了 Windows 客户端的打包工作。初次体验 Tauri 便收获了不错的反馈 —— 其生成的客户端体积轻量化、运行性能优异且与 Web 端的适配性远超预期。不过从 Web 应用到桌面客户端的迁移并非简单的 “打包封装” 就能一蹴而就目前仍有不少细节有待打磨。后续我计划从两个维度深耕一是系统性吃透 Tauri 框架的底层逻辑与进阶用法二是对 AI 生成的代码进行全面人工复核。毕竟 AI 生成的代码存在两个明显痛点部分逻辑的实现原理模糊不清可能暗藏隐患或冗余再加上各类功能框架与组件版本差异显著、官方文档覆盖不全AI 受限于底层机制产生的 “幻觉” 问题会被进一步放大。唯有人工逐行校验才能让代码真正稳定可靠。鼠标左键点击托盘图标不弹出菜单应用最小化到托盘后用户如想显示主窗口或退出通过右键托盘图标弹出菜单实现的当前的问题在于用户点击鼠标左键也会弹出菜单需要屏蔽掉左键菜单。依然使用 TRAE将需求告知 如下tauri框架生成的客户端当最小化托盘图标时鼠标左键单击不要显示菜单而是显示主窗口AI 处理完后发现代码没变化细看发现 AI 居然跳出了原先的项目结构新建了一个目录和文件比较无语如下/e/dev/meet/platform-web/src-tauri/src/lib.rs明确告诉它搞错了正确的位置是E:\dev\meet\platform-web\src-tauri\src才对项目内应该修改的源码进行调整看代码逻辑监控了托盘图标的点击事件如果判断是鼠标左键单击则显示主窗口代码如下// 修改托盘图标配置部分完整替换以下代码// 5. 创建系统托盘let_trayTrayIconBuilder::new().icon(app.default_window_icon().unwrap().clone()).tooltip(时光助手).menu(tray_menu)// 处理托盘图标点击事件 - 左键单击显示主窗口.on_tray_icon_event(|tray,event|{matchevent{TrayIconEvent::Click{button,..}{// 只处理左键单击ifbuttontauri::MouseButton::Left{letapp_handletray.app_handle();// 获取窗口并显示ifletSome(window)app_handle.get_webview_window(main){let_window.show();let_window.set_focus();}}}TrayIconEvent::DoubleClick{..}{letapp_handletray.app_handle();// 获取窗口并显示ifletSome(window)app_handle.get_webview_window(main){let_window.show();let_window.set_focus();}}_{}}})// 处理菜单点击事件.on_menu_event(|tray,event|{letapp_handletray.app_handle();matchevent.id().as_ref(){show_window{ifletSome(window)app_handle.get_webview_window(main){let_window.show();let_window.set_focus();}}quit_app{// 退出应用app_handle.exit(0);}_{}}}).build(app)?;结果打包的时候提示编译错误……Compilingtauri-plugin v2.5.2Compilingtauri-codegen v2.5.2InfoFilesrc-tauri\src\lib.rs changed.Rebuildingapplication...Compilingtauri-utils v2.8.1Compilingwindows v0.61.3Compilingtauri-build v2.5.3Compilingtauri-plugin v2.5.2Compilingtauri-codegen v2.5.2Compilingtauri v2.9.5Compilingtauri-macros v2.5.2Compilingtauri-plugin-os v2.3.2Compilingtauri-plugin-notification v2.3.3CompilingTimeHelperv3.4.0(E:\dev\meet\platform-web\src-tauri)Compilingwebview2-com-sys v0.38.0Compilingtao v0.34.5Compilingtauri-winrt-notification v0.7.2Compilingnotify-rust v4.11.7Compilingwebview2-com v0.38.0InfoFilesrc-tauri\tauri.conf.json changed.Rebuildingapplication...Compilingwindows v0.61.3CompilingTimeHelperv3.4.0(E:\dev\meet\platform-web\src-tauri)Compilingwebview2-com-sys v0.38.0Compilingtao v0.34.5Compilingtauri-winrt-notification v0.7.2Compilingnotify-rust v4.11.7Compilingwebview2-com v0.38.0Compilingtauri-runtime v2.9.2Compilingwry v0.53.5Compilingtauri-runtime-wry v2.9.3Compilingtauri v2.9.5Compilingtauri-plugin-single-instance v2.3.6Compilingtauri-plugin-notification v2.3.3Compilingtauri-plugin-os v2.3.2error[E0433]:failed to resolve:could not find MouseButtonintauri--src\lib.rs:66:49|66|...ifbuttontauri::MouseButton::Left{|^^^^^^^^^^^could not find MouseButtonintauri|help:consider importing thisenum|2usetauri::tray::MouseButton;|help:ifyou import MouseButton,refer to it directly|66-ifbuttontauri::MouseButton::Left{66ifbuttonMouseButton::Left{|Formore information about this error,tryrustc--explainE0433.把错误扔给 AIAI 分析是包搞错了如下我看到编译过程中出现了错误问题是找不到MouseButton类型。根据错误提示MouseButton应该来自tauri::tray 模块而不是直接在 tauri 根模块下。然后导入了 tray 下的 MouseButton结果代码使用还是 tauri 包下又搞了一轮编译不通过最终提供了一版编译无问题代码如下// 使用 Tauri 2.0 正确 API 实现所有功能usetauri::{menu::{MenuBuilder,MenuItemBuilder},tray::{MouseButton,TrayIconBuilder,TrayIconEvent},Manager,};usetauri_plugin_single_instance::initassingle_instance_init;pubfnrun(){tauri::Builder::default().plugin(tauri_plugin_os::init()).plugin(tauri_plugin_notification::init()).setup(|app|{// 1. 初始化单实例插件app.handle().plugin(single_instance_init(|app,_argv,_cwd|{// 当新实例启动时激活现有实例的窗口ifletSome(window)app.get_webview_window(main){let_window.show();let_window.set_focus();}}))?;// 2. 获取主窗口letmain_windowmatchapp.get_webview_window(main){Some(window)window,None{eprintln!(主窗口ID: main未创建);returnOk(());}};// 3. 监听窗口关闭事件letwindow_clonemain_window.clone();main_window.on_window_event(move|event|{iflettauri::WindowEvent::CloseRequested{api,..}event{// 阻止默认关闭api.prevent_close();// 隐藏窗口let_window_clone.hide();}});// 4. 创建托盘菜单letshow_window_itemMenuItemBuilder::new(显示主窗口).id(show_window).build(app)?;letquit_app_itemMenuItemBuilder::new(退出应用).id(quit_app).build(app)?;lettray_menuMenuBuilder::new(app).item(show_window_item).item(quit_app_item).build()?;// 5. 创建系统托盘let_trayTrayIconBuilder::new().icon(app.default_window_icon().unwrap().clone()).tooltip(时光助手).menu(tray_menu)// 处理托盘点击事件 - 修改这里.on_tray_icon_event(|tray,event|{matchevent{// 添加左键单击事件处理TrayIconEvent::Click{button,..}{ifbuttonMouseButton::Left{letapp_handletray.app_handle();// 获取窗口并显示ifletSome(window)app_handle.get_webview_window(main){let_window.show();let_window.set_focus();}}}// 保持双击事件处理不变TrayIconEvent::DoubleClick{..}{letapp_handletray.app_handle();// 获取窗口并显示ifletSome(window)app_handle.get_webview_window(main){let_window.show();let_window.set_focus();}}_{}}})// 处理菜单点击事件.on_menu_event(|tray,event|{letapp_handletray.app_handle();matchevent.id().as_ref(){show_window{ifletSome(window)app_handle.get_webview_window(main){let_window.show();let_window.set_focus();}}quit_app{// 退出应用app_handle.exit(0);}_{}}}).build(app)?;Ok(())}).run(tauri::generate_context!()).expect(运行 Tauri 应用失败);}但是经测试发现还是有问题左键点击依然会弹出菜单快速闪烁一下后消失……代码逻辑看上去一切正常于是只能开启人工诊断模式。去官网查看托盘功能相关文档https://tauri.app/zh-cn/learn/system-tray/#%E5%88%9B%E5%BB%BA%E6%89%98%E7%9B%98%E5%9B%BE%E6%A0%87发现官方有明确说明默认情况下确实单击左键会显示菜单如下图按照官方说明构建托盘的时候设置一个属性menu_on_left_click就可以了。手工修改打包时提示警告方法已过时……warning:useof deprecated method tauri::tray::TrayIconBuilder::R::menu_on_left_click:UseTrayIconBuilder::show_menu_on_left_click instead.--src\lib.rs:61:18|61|.menu_on_left_click(false)|^^^^^^^^^^^^^^^^^^|note:#[warn(deprecated)] on by default功能测试倒是正常了终于左键不再弹出菜单了。根据警告的提示将属性从已废弃的menu_on_left_click调整为show_menu_on_left_click编译也不再报警告了测试功能也正常。小结看起来一个挺简单的小问题AI 折腾了半小时出现了多次错误最终也没实现预期效果。人工查阅官方文档10 分钟就完成了处理当然也存在一定的运气成分刚好这个问题官方文档里有明确说明从警告信息来看官方文档也陈旧了……在这种局面下AI 也难以给出准确的答案。