Skip to content
/ yan Public

旧时王谢堂前燕 飞入寻常百姓家

Notifications You must be signed in to change notification settings

12Tall/yan

Repository files navigation

燕/yan

旧时王谢堂前燕 飞入寻常百姓家——《乌衣巷》唐·刘禹锡。

此项目是一个基于rustwebview的模板。后端采用wry,前端采用vue3作为骨架,前后端通过IPC 进程通信。至于为什么不直接用Electron或者tauri?首先Electron打包后的文件体积比较大,但是打包后的结果文件不够简洁;而tauri由于封装程度比较高,并不适合拿来学习理解整个项目的实现原理。

当然,通过webview(2)也有一些瑕疵,即无法直接调用平台的某些api、需要自己设置user_data_directory的位置。这些都是值得的,因为这些问题即使这次不遇到,以后也可能会遇到。就像《天月神话》里面说的,根本就没有银弹。


说明

由于没有嵌入Chromium,编译后的结果文件会比较小;但是这也导致要求系统必须已经预装了Webview运行时。当然也可以通过set_env来指定固定版本的webview(2)运行时,但是这样的编译结果就违背了简洁的初衷。另外,某些跨平台的代码,需要添加宏命令来实现条件编译。

Rust 后端

  1. Object对象可以通过get方法访问键值;
  2. 修改图标:需要引用ico库,详细代码参见wry/examples/icon.rs,需要注意的是源代码没有包含在wry库中,且有些类型已重新命名。
  3. 条件编译
  • #[cfg(debug_assertions)]:判断程序是否处于debug 状态,可用于任何语句块之前
  • #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")],添加在main.rs最前面

Vue前端

  1. vscode的插件不能正确识别web_srv子项目,所以最好能在新的IDE 窗口修改前端部分;
  2. 前端事件的监听器可以是异步函数;

依赖的库

不必过于担心引入过多的库而导致程序运行效率低下,因为:

  1. 事情总要做,不是自己做就是别人做;
  2. 编译器会帮我们优化;
  3. 开发效率也很重要,并且引入三方库让代码更整洁。

rust 库

序号 名称 说明
01 Geal/nom 二进制文件解析
02 WLBF/single-instance 跨平台应用单例模式
03 BurntSushi/byteorder Read trait 扩展,可用于二进制文件解析,比nom 更基础
04 tauri-app/wry 基于tao,支持webview2,生成桌面应用
05 Michael-F-Bryan/include_dir 将文件夹以二进制的形式打包进exe
06 PolyMeilex/rfd 跨平台的对话框库
07 hyperium/mime MIME 文件类型支持
08 retep998/winapi-rs win32api 的封装
09 microsoft/windows-rs 微软官方库,但有些东西不全
10 mdsteele/rust-ico ico 图标文件支持

js 库

序号 名称 说明
01 vue3 前端框架
02 jiggzson/nerdamer 数学符号计算库
03 electron-plus 基于vue3 的前端组件库
04 @vue/shared 避免Element 编译报错
05 mauriciopoppe/function-plot 基于D3.js 的函数绘图库(暂不兼容)
06 lodash 用于生成不重复的随机Id
07 d3.js 绘图库(不会直接用到)
08 three.js 三维绘图库(暂时用不到)

调试与打包

调试

调试模式下,需要启动一个vue 的web 服务,可以实现前端代码修改的实时同步。

# 1. 启动vue(需要新开一个控制台)
cd web_src
yarn
yarn dev  # 此进程会阻塞

# 2. 运行cargo
cargo run

发布

发布模式下,需要先编译前端vue 代码,然后再编译rust 代码。

# 1. 打包web 页面
cd web_src  
yarn
yarn build  

# 2. 打包exe
cd ..  # 切换回根目录
cargo build --release