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

2024-02-03 01:20:49 +08:00
drymonfidelia  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");
}
12948 次点击
所在节点   程序员  程序员
63 条回复
roycestevie6761
roycestevie6761
2024-02-03 01:30:32 +08:00
rust 只适合当前问题没有解决方案,可能学一下 rust 搞一搞,如果有其他成熟的的替代方案,强行 rust 没啥意义,其他语言和框架至少迭代十年了都
drymonfidelia
drymonfidelia
2024-02-03 01:36:57 +08:00
@roycestevie6761 正常 v 友推荐的灵车我是不敢碰的,但是 tauri GitHub 上有 73.5k star 感觉很成熟了,试了下,没想到连改个默认请求头都做不到
roycestevie6761
roycestevie6761
2024-02-03 01:40:19 +08:00
@drymonfidelia 这个框架我没用过,但是 73K 不至于吧
drymonfidelia
drymonfidelia
2024-02-03 01:49:26 +08:00
@roycestevie6761 但凡他的 star 数少一点,我早就放弃折腾了
dcsuibian
dcsuibian
2024-02-03 02:36:46 +08:00
看来你之前上班时间打游戏被发现了呀
oldManNewThought
oldManNewThought
2024-02-03 02:58:23 +08:00
https://tauri.app/v1/api/js/http
设个 header 而已。肯定支持。记得 allowlist 添加域名。深入一点用下你会发现 tauri 真的比 electron 好。开箱即用的前端框架,简单明了的 api 。
CLMan
CLMan
2024-02-03 09:46:49 +08:00
用一个你没学过的(复杂)语言,干一件你不熟悉的事情(使用 tauri 框架),然后怪这东西太难用了。
iorilu
iorilu
2024-02-03 10:38:07 +08:00
赶时间的时候不要用不熟悉的新技术

仅凭这点并不难说明 tauri 不好, 毕竟学任何新东西都要花时间的
jeesk
2024-02-03 10:43:17 +08:00
呵呵。 如果是一个听别人说就敢用上生产的团队, 显示不合格的, 还是要自己探索。
guguji5
2024-02-03 10:50:56 +08:00
electron 也是垃圾,在 mac 上鼓捣了半天都没打成功 exe (也可能是我菜
hancai
2024-02-03 11:00:29 +08:00
我这两台也在折腾这玩意儿,rust 还是用不惯
ie88
2024-02-03 11:31:20 +08:00
```ts
import { fetch } from '@tauri-apps/api/http';
const response = await fetch('http://localhost:3003/users/2', {
method: 'GET',
timeout: 30,
});
```

试着 把 fetch 封装一下,类似于 axios 的做法

```ts
async function my_fetch(url: Url, config: Config) {
let custom_headers = {
"app-name": "myapp",
"app-ver": "1.0",
...
};
await fetch(url, {
...custom_headers,
...config
});
}
```

然后 每次调用 my_fetch
request 同理
不用管我上面的具体代码,没有 IDE 不会写了...
NessajCN
2024-02-03 11:41:26 +08:00
自己菜不要怪框架,谁让你用 webview 去折腾 headers 了?

struct ReqClient {
client: reqwest::Client

}
impl ReqClient {
fn new(client: reqwest::Client) -> Self {
Self {client}
}

tauri::Builder::default().
.setup( |app| {
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("app-name", header::HeaderValue::from_static("my-app"));
headers.insert("app-ver", header::HeaderValue::from_static("1.0-win"));
headers.insert("app-iver", header::HeaderValue::from_static("20240202-01M"));

let client = reqwest::Client::builder().default_headers(headers).build().unwrap();
app.manage(ReqClient::new(client));
}
//......
mscorlib
2024-02-03 11:43:54 +08:00
用过 electron 、wails 、tauri
目前公司在用 wails 做产品,部分产品正在用 electron 开发和改造
这仨只能说各有优劣
如果是开发 UI ,底层交互和计算比较少且不介意个头,推荐用 electron ,后面两个跟这个不是一个级别的东西,webview 安全机制会让你很多事做不了,还有 webview 在跨平台的时候 ui 会有差异。
推荐用自己熟悉的且好招人的语言,rust 招人几乎不可能。。
silomrelephant
2024-02-03 12:02:16 +08:00
吐槽一下,unwrap 没事不要乱用,可以用 map ,flatmap 直接操作容器里面的内容,另外异常的路径最好也要养成习惯处理,即使打印日志也是好的
drymonfidelia
2024-02-03 12:23:26 +08:00
@NessajCN 编译不了啊 failed to resolve: use of undeclared crate or module `reqwest` 全替换成 request 也不行
```
fn main() {
struct ReqClient {
client: request::Client

}
impl ReqClient {
fn new(client: request::Client) -> Self {
Self {client}
}
}
tauri::Builder::default()
.setup( |app| {
let mut headers = request::header::HeaderMap::new();
headers.insert("app-name", header::HeaderValue::from_static("my-app"));
headers.insert("app-ver", header::HeaderValue::from_static("1.0-win"));
headers.insert("app-iver", header::HeaderValue::from_static("20240202-01M"));

let client = request::Client::builder().default_headers(headers).build().unwrap();
app.manage(ReqClient::new(client));
})
}
```
```
error[E0433]: failed to resolve: use of undeclared crate or module `request`
--> src\main.rs:20:22
|
20 | let client = request::Client::builder().default_headers(headers).build().unwrap();
| ^^^^^^^ use of undeclared crate or module `request`

error[E0433]: failed to resolve: use of undeclared crate or module `request`
--> src\main.rs:15:27
|
15 | let mut headers = request::header::HeaderMap::new();
| ^^^^^^^ use of undeclared crate or module `request`
|
help: consider importing this struct
|
1 + use tauri::http::header::HeaderMap;
|
help: if you import `HeaderMap`, refer to it directly
|
15 - let mut headers = request::header::HeaderMap::new();
15 + let mut headers = HeaderMap::new();
|

error[E0433]: failed to resolve: use of undeclared crate or module `header`
--> src\main.rs:16:36
|
16 | headers.insert("app-name", header::HeaderValue::from_static("my-app"));
| ^^^^^^ use of undeclared crate or module `header`
|
help: consider importing this struct
|
1 + use tauri::http::header::HeaderValue;
|
help: if you import `HeaderValue`, refer to it directly
|
16 - headers.insert("app-name", header::HeaderValue::from_static("my-app"));
16 + headers.insert("app-name", HeaderValue::from_static("my-app"));
|

error[E0433]: failed to resolve: use of undeclared crate or module `header`
--> src\main.rs:17:35
|
17 | headers.insert("app-ver", header::HeaderValue::from_static("1.0-win"));
| ^^^^^^ use of undeclared crate or module `header`
|
help: consider importing this struct
|
1 + use tauri::http::header::HeaderValue;
|
help: if you import `HeaderValue`, refer to it directly
|
17 - headers.insert("app-ver", header::HeaderValue::from_static("1.0-win"));
17 + headers.insert("app-ver", HeaderValue::from_static("1.0-win"));
|

error[E0433]: failed to resolve: use of undeclared crate or module `header`
--> src\main.rs:18:36
|
18 | headers.insert("app-iver", header::HeaderValue::from_static("20240202-01M"));
| ^^^^^^ use of undeclared crate or module `header`
|
```
错误太多了贴不完
drymonfidelia
2024-02-03 12:24:24 +08:00
@ie88 tauri 只是拿来当套壳浏览器,不能改动现有网页代码
NessajCN
2024-02-03 12:25:51 +08:00
@drymonfidelia
大哥,你这对 rust 是一点不懂就来用 tauri 了啊?
cargo add reqwest
drymonfidelia
2024-02-03 12:40:32 +08:00
@NessajCN 编译好了,请求头还是没设置上

```
use reqwest::header::HeaderValue;
use tauri::Manager; // Import the Manager trait
fn main() {
struct ReqClient {
client: reqwest::Client,
}
impl ReqClient {
fn new(client: reqwest::Client) -> Self {
Self { client }
}
}

tauri::Builder::default().setup(|app| {
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("app-name", reqwest::header::HeaderValue::from_static("my-app"));
headers.insert("app-ver", reqwest::header::HeaderValue::from_static("1.0-win"));
headers.insert("app-iver", reqwest::header::HeaderValue::from_static("20240202-01M"));

let client = reqwest::Client::builder()
.default_headers(headers)
.build()
.unwrap();
app.manage(ReqClient::new(client));
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
```
iorilu
2024-02-03 12:45:37 +08:00
一定要牢记, 不要在公司生成环境, 有时间要求时候自作聪明搞不熟得新技术, 省的给领导留下不好印象

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

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

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

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

© 2021 V2EX