tauri软件开发隐藏main窗口,加载自定义的窗口,解决main窗口不能使用initialization_script问题
遇到的问题:main窗口只有eval函数,没有initialization_script函数,而且eval函数只能是在main窗口第一次加载的时候执行,当页面重新加载或导航到新页面时,使用.eval()注入的脚本会丢失,因为它们仅在初始加载时执行。当然这个功能还能实现别的需求:比如你的网页可能需要一些时间来加载,或者你需要在显示主窗口之前在 Rust 中运行初始化过程,先让main窗口隐藏,先启动
有能力可以看官方文档:初始屏幕 | Tauri Apps
遇到的问题:main窗口只有eval函数,没有initialization_script函数,而且eval函数只能是在main窗口第一次加载的时候执行,当页面重新加载或导航到新页面时,使用 .eval()
注入的脚本会丢失,因为它们仅在初始加载时执行。
当然这个功能还能实现别的需求:比如你的网页可能需要一些时间来加载,或者你需要在显示主窗口之前在 Rust 中运行初始化过程,先让main窗口隐藏,先启动副窗口显示加载动画,可以改善用户的加载体验。
隐藏main窗口
只需要在tauri.conf.json中添加这个配置就好了:
现在,您的主窗口将被隐藏,并且启动应用程序时将显示初始屏幕窗口。接下来,你需要一种方法来关闭初始屏幕,并在应用准备就绪时显示主窗口。如何执行此操作取决于在关闭初始屏幕之前要等待的内容。
等待网页
如果你正在等待你的 Web 代码,你需要创建一个 close_splashscreen
命令。
use tauri::Manager;
// 创建命令:
// 该命令必须是异步的,以便它不会在主线程上运行。
#[tauri::command]
async fn close_splashscreen(window: tauri::Window) {
// 关闭初始屏幕
if let Some(splashscreen) = window.get_window("splashscreen") {
splashscreen.close().unwrap();
}
// 显示主窗口
window.get_window("main").unwrap().show().unwrap();
}
// 注册命令:
fn main() {
tauri::Builder::default()
// Add this line
.invoke_handler(tauri::generate_handler![close_splashscreen])
.run(tauri::generate_context!())
.expect("failed to run app");
}
然后,您可以通过以下两种方式之一将其导入到您的项目中:
//使用 Tauri API npm 包:
import { invoke } from '@tauri-apps/api/tauri'
or
// With the Tauri global script:
const invoke = window.__TAURI__.invoke
最后,添加一个 invoke()
事件侦听器(或者随时调用它):
document.addEventListener('DOMContentLoaded', () => {
// 这将等待窗口加载,但你可以在您想要的任何触发器上运行此函数
invoke('close_splashscreen')
})
等待 Rust
如果你正在等待 Rust 代码运行,请将其放入 setup
函数处理程序中,以便您可以访问该 App
实例:
use tauri::Manager;
fn main() {
tauri::Builder::default()
.setup(|app| {
let splashscreen_window = app.get_window("splashscreen").unwrap();
let main_window = app.get_window("main").unwrap();
// 我们在新任务上执行初始化代码,这样应用程序就不会冻结
tauri::async_runtime::spawn(async move {
// 在这里初始化而不是消磨时间
println!("Initializing...");
std::thread::sleep(std::time::Duration::from_secs(2));
println!("Done initializing.");
// 显示主窗口
splashscreen_window.close().unwrap();
main_window.show().unwrap();
});
Ok(())
})
.run(tauri::generate_context!())
.expect("failed to run app");
}
如果你想在窗口加载的时候,注入脚本:
tauri::Builder::default()
.setup(|app| {
let _window = tauri::WindowBuilder::new(
app,
"PakePlus",
tauri::WindowUrl::App("https://juejin.cn/".into()),
)
.initialization_script(include_str!("./extension/custom.js"))
.title("PakePlus")
.build()?;
Ok(())
})
如果单纯只想保留副窗口的话,可以把tauri.config.json里面的windows删除掉即可,就不会有main窗口了。
如果你只想在main窗口加载的时候执行一次:
.setup(|app| {
let main_window = app.get_window("main").unwrap();
// 在窗口加载时注入脚本
main_window
.eval(include_str!("./extension/custom.js"))
.unwrap();
Ok(())
})
更多推荐
所有评论(0)