【tauri+rust】App会加载白屏,有时显示在左上角显示一小块,如何优化

使用tauri做App时不可避免的会遇到上图问题,Tauri在启动时会先创建原生窗口,然后才加载WebView引擎并执行前端代码,这就导致存在一个时间差。当前端框架初始化耗时较为明显,Vue/React等现代前端框架需要完成虚拟DOM构建、组件挂载等。

解决方案

在创建时我们先将原生窗口改为不可见,等前端界面加载完成后再加载窗口即可。

主要操作如下:

1、tauri.conf.json设置visible:false
2、main.rs增加命令:show_main_window,
rust 复制代码
// 显示主窗口
#[tauri::command]
pub async fn show_main_window(window: tauri::Window) -> Result<(), String> {
    log::info!("Frontend requested to show main window");
    
    // 短暂延迟确保渲染完成
    tokio::time::sleep(std::time::Duration::from_millis(200)).await;
    
    window.show().map_err(|e| e.to_string())?;
    window.center().map_err(|e| e.to_string())?;
    window.set_focus().map_err(|e| e.to_string())?;
    
    log::info!("Main window is now visible");
    Ok(())
}
3、App.vue增加调用show_main_window
javascript 复制代码
import { invoke } from '@tauri-apps/api/core';

onMounted(async () => {
  // 初始化多语言
  localStorage.setItem('client-lang', 'zh_CN');
  // 初始化本地数据库
  try {
    await localDB.init();
    console.log('本地数据库初始化成功');
  } catch (error) {
    console.error('本地数据库初始化失败:', error);
  }
  try {
    // 等待 Vue 应用完全挂载
    await new Promise(resolve => setTimeout(resolve, 500))
    await invoke('show_main_window')
    
  } catch (error) {
    console.error('Failed to show window:', error)
    // 备用方案:直接使用 API
    try {
      await appWindow.show()
      await appWindow.center()
    } catch (fallbackError) {
      console.error('Fallback also failed:', fallbackError)
    }
  }
});
</script>
相关推荐
用户83580861879115 小时前
Go 高并发下的“内存刺客“:自研 Size-Class 无锁对象池,把 sync.Pool 的 P99 从 128μs 压到 41μs
后端
货拉拉技术15 小时前
资损下降 99.96% 的背后— AI 资损防控平台实战
后端
山水洛行17 小时前
AI Agent 智能体记忆:从检索到被治理的数据系统
后端
卷无止境17 小时前
C++20 的概念与约束:让模板编程终于"说人话"
后端
Ai拆代码的曹操17 小时前
一次排查三种连接泄漏模式,再也不怕 HikariCP 连接池爆满了
后端
咪库咪库咪17 小时前
Cypher入门
后端
雪隐18 小时前
个人电脑玩AI-08让5060 Ti给你打工——我拿 Unlimited-OCR扫了 600 页书,然后悟了
人工智能·后端
AskHarries18 小时前
用 OpenClaw 做一份完整 PPT:从主题、提纲到 slide deck
后端·程序员
Csvn18 小时前
Linux 常用操作命令合集与运维实战
后端