tauri 真的太难用了,浪费了我整整一天

328 天前
 drymonfidelia

天天看 V2 有人吹 tarui ,刚好有客户反应我们客户端太大了,于是给公司打包新网站(启动动画播完 location.href 跳转到线上地址,没别的功能)成 exe 的时候想试一下

我们网站检测是否客户端访问是检测请求头的 app-name 字段是否有值(有个中间件,全部请求都检测)

Electron 非常简单,三行代码搞定

 session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback) => {
    details.requestHeaders['app-name'] ='myapp'
    details.requestHeaders['app-ver'] = '1.0-win'
    details.requestHeaders['app-iver'] = '20240202-01M'
    
    callback({ requestHeaders: details.requestHeaders })
  })

tauri 这个问题 Google 能搜到 4 篇讨论贴,实际给出方案的只有这一篇 https://github.com/tauri-apps/tauri/discussions/4912

有人在下面提问说编译不了,快半年了没人回复

我看 Rust 和 tauri 文档折腾了一天还没搞定,放弃了,用 Electron 3 分钟打好包提交 (最后还被领导骂了这么简单一个需求弄了一天是不是又在上班时间打游戏)

附上我改的最后一版,还是不行,有能力的 V 友看看要写多少行才能实现这个简单的功能

fn main() {
    tauri::Builder::default()
        .setup(|app| {
            let main_window = app.get_window("main").unwrap();
            main_window.with_webview(|webview| unsafe {
                let core = webview.controller().CoreWebView2().unwrap();
                let mut token: EventRegistrationToken = EventRegistrationToken::default();
                core.AddWebResourceRequestedFilter("*", COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL);
                core.add_WebResourceRequested(
                    CoreWebView2WebResourceRequestedEventHandler::create(Box::new(move |sender, args| {
                        if let Some(args) = args {
                            let request: ICoreWebView2WebResourceRequest = args.Request().unwrap();
                            request
                                .Headers()
                                .unwrap()
                                .SetHeader("app-name", "myapp")
                                .SetHeader("app-ver", "1.0-win")
                                .SetHeader("app-iver", "20240202-01W")
                                .unwrap();
                        }
                        Ok(())
                    })),
                    &mut token,
                );
            });
            Ok(())
        })
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
12162 次点击
所在节点    程序员
63 条回复
NessajCN
328 天前
@drymonfidelia
你是不是对 tauri 的用法有很大的误解?它不是给你用来当套壳浏览器的,所谓的 js 前端只是个画 ui 的工具,你甚至不能在前端用 fetch 或 axios 这些前端请求工具。
我发你的这段代码是让你生成好 state 后在 rust 后端发请求然后返回给前端显示的。你得在 command 函数里调用 req_client.client.get()
drymonfidelia
328 天前
@NessajCN 但是我的目的就是拿来当套壳浏览器,之前我的 /t/989348 /t/1011628 两个帖子都很多人无脑推荐 tauri 。
同需求 Electron 就能非常方便实现
zeusho871
328 天前
用 wails ,我在 mac windows 成功了
drymonfidelia
328 天前
NessajCN
328 天前
@drymonfidelia 我看了一下,是你自己没表达清楚
你标题问的是 「我要做一个专用浏览器」
但你实际的需求是「选一个现成浏览器好方便地显示我们的网页」

你能分清「自己手搓浏览器」和「给自己网页套个现成浏览器的壳」这两者之间的区别吧?
drymonfidelia
328 天前
@NessajCN 「我要做一个专用浏览器」应该是比「选一个现成浏览器好方便地显示我们的网页」更底层的需求,我认为是应该更能实现改个默认请求头这种简单需求
NessajCN
328 天前
@drymonfidelia 确实更能实现啊,我不就用 3 分钟写了实现代码吗
只不过 tauri 它真不是你要的现成浏览器啊。
你要类比,前端 js 在这里的作用完全是 qml 在 qt 里的作用,也就是画个静态页面当 ui
你想拿 tauri 来访问其他网站并且完美的显示在前端 ui ,那你当然得在 rust 里写 get 函数,并且自己重新手动写前端静态显示代码。说到底 tauri 它是个「 Rust gui 」框架而不是浏览器。
ShadowPower
328 天前
其实两者的用途不太一样……

Electron 适合直接把网页打包成应用,或者以 JavaScript/TypeScript 为主的应用。
而 Tauri 的定位则是为 Rust 程序提供一个界面,只是界面部分使用系统的 WebView 来实现。
djs
328 天前
专用浏览器用这个?不是应该直接干一个 chromium 下来自己编译吗
ShadowPower
328 天前
对了,顺便一提,Tauri 的规划里其实还有抛弃 WebView ,自己实现界面绘制,虽然我感觉大概率走不通这条路。
但是可以从这一点看出来,Tauri 的目标和 Electron 其实完全不一样,只是恰巧有一些交集……
changdy
328 天前
@guguji5 我没记错的话 ..好像几种桌面 gui 都是仅支持各自生态下打包各自的安装包.
drymonfidelia
328 天前
@dcsuibian 我们公司是交代的事情干完了,上班时间看 AV 都没人管你
nebkad
328 天前
这帖子真的太难顶了,浪费了我整整一分钟
araraloren
328 天前
@nebkad 就是在钓鱼。。
0x723b
328 天前
如果你的需求是拦截 webview 的请求并添加 header 的话,根据 https://github.com/tauri-apps/tauri/discussions/4690 , 似乎是无法实现的
drymonfidelia
328 天前
@araraloren 看什么都钓鱼 我要钓鱼写这么长代码干什么 能钓鱼的话题多了去了
lisongeee
328 天前
所以 tauri 到底能不能实现拦截并修改 webview 的任意请求?

有时候需要在 webview 里放置同公司其它组的业务页面,然后拦截加上自定义登录参数

这种需求虽然不敢说不多见但是也不敢说不少见
rming
327 天前
tauri 确实不够完善,关于 webview2 设置问题可以参考下这个 https://github.com/tauri-apps/tauri/issues/4284 和这个 https://docs.rs/webview2-com/latest/webview2_com/Microsoft/Web/WebView2/Win32/struct.ICoreWebView2HttpRequestHeaders.html#method.SetHeader 手机随便搜了下,仅供参考
kkk9
327 天前
@lisongeee #37 rust 里写一个类 fetch 函数,js 内替换原来的 fetch ,实际调用的是这个函数。

tauri 调用 webview 的 api 来干活,一切规则需要遵循系统 webview ,并不能自定义或者修改核心

electron 本质上是一个 chromium 浏览器的,提供各种封装好的 API ,支持自定义,可以修改核心
CLMan
327 天前
你的思路没什么问题,但知识储备跟不上,这个问题涉及到 win32 api ,而且 rust 语言本身是一个很难学的语言。

下面是解决方案:
-----
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

use tauri::Manager;
use webview2_com::{Microsoft::Web::WebView2::Win32::{ICoreWebView2WebResourceRequest, COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL}, WebResourceRequestedEventHandler};
use windows::{core::HSTRING, Win32::System::WinRT::EventRegistrationToken};

fn main() {
tauri::Builder::default()
.setup(|app| {
let main_window = app.get_window("main").unwrap();
main_window.with_webview(|webview| unsafe {
let core = webview.controller().CoreWebView2().unwrap();
let mut _token: EventRegistrationToken = EventRegistrationToken::default();
core.AddWebResourceRequestedFilter(&HSTRING::from("*"), COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL).unwrap();
core.add_WebResourceRequested(
&WebResourceRequestedEventHandler::create(Box::new(move |_webview, args| {
if let Some(args) = args {
let request: ICoreWebView2WebResourceRequest = args.Request().unwrap();
request
.Headers()
.unwrap()
.SetHeader(&HSTRING::from("key1"), &HSTRING::from("value1"))
.unwrap();
}
Ok(())
})), &mut _token).unwrap();
}).unwrap();
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX