tauri vue3 rust问题

409 阅读3分钟

在生产中使用检查器

# debug方式打包
npm run tauri build -- --debug
# 设置devtools 开发模式支持
tauri = { version = "...", features = ["...", "devtools"] }

mac 下的window设置 transparent 需要开启macOSPrivateApi

tauri.conf.json 中设置 "macOSPrivateApi": true,

打包 ios、ipad 移动包

1、npm run tauri ios init
2、xcode 打开gen下的.xcodeproj 配置开发者信息
3、gen/apple/build/ExportOptions.plist 中method 设置为 development
4、npm run tauri ios build
5、爱思助手,应用 -> 导入安装
6、ipad设置->通用->VPN与设备管理 信任开发者
7、ipad设置->隐私与安全性->打开开发者模式

项目开发者模式设置(1-项目文件方式[src-tauri目录下新建Info.plist]|2-打包到处文件方式[gen/apple/build/ExportOptions.plist])

1、gen/apple/build/ExportOptions.plist  文件中设置
<plist version="1.0">
    <dict> 
        <key>method</key> 
        <string>development</string> 
    </dict> 
</plist>
2、设置支持webRTC
<plist version="1.0">
<dict>
    <key>NSCameraUsageDescription</key>
    <string>Request camera access for WebRTC</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>Request microphone access for WebRTC</string>
</dict>
</plist>

build 后的app,axios vite中的http请求,请求路径端口丢失,代理失效

1、使用vue3+vite+rust+warp 开发,vue3 前端端口为1420 ----访问---->  warp服务器端口为3030
- > 开发环境可以使用vite 配置代理来解决跨域问题
- > 生产环境vite的代理就不起作用了
2、tauri Preflight response is not successful. Status code: 403 due to access control checks.
- > 这个问题在服务端设置 Access-Control-Allow-Origin: * 不能解决问题,warp如下设置没啥用
let cors = warp::cors()
    .allow_any_origin()
    .allow_methods(vec!["GET", "POST", "PUT", "DELETE", "OPTIONS"]);
let apis = login().or(register()).or(online_users()).or(search_users());
let route =apis.with(cors);
3、使用tauri的http插件进行http的访问,cros问题解决
- > 

多租户client

1、在tauri中多个 window 是共享localstorage,独享sessionstorage
2、多租户设计?为了调试,发送文字、文件、截屏可以通过自己给自己发送进行调试,如果时发送音视频,可以通过修改tauri.conf.json中的productName、identifier,先build一个客户端,通过本地dev启动的客户端和build的客户端进行音视频的交互 来进行调试
3、跨域问题

指定 tauri.conf.json 位置

package.json配置文件中指定配置 
"tauri": {
  "configPath": "config/tauri.config.json"
},

开发模式下忽略文件变化

1、 使用忽略文件**  **`.taurignore`**:
在 `src-tauri` 下创建 `.taurignore` 忽略文件,底层依赖 [ignore](https://link.zhihu.com/?target=https%3A//github.com/BurntSushi/ripgrep/tree/master/crates/ignore) crate,忽略规则设置请查看 ignore 文档,与 `.gitignore` 规则类似。
2、 使用命令行参数** **`--no-watch`**:

截图功能需要透明全屏窗口

1、创建webviewWindow 并设置 transparent: true
2、tauri.conf.json中设置macOSPrivateApi": true

pinia 状态管理 持久话,否则刷新页面丢失

1、npm install pinia-plugin-persistedstate
2、使用持久化
const pinia = createPinia()
pinia.use(piniaPluginPersistedState);
export {pinia};
3、配置持久化
defineStore("user", ()=>{
    return { xx,yy};
},{
    persist: true,
})

vue3 响应式对象的 .value问题

1、在js中 如果是ref对象需要使用.value,reactive 对象不需要
2、在template的dom中  都不要用.value,直接访问即可

pinia state在 tauri 多个窗口间状态共享,子窗口可以取到 主窗口设置的值,但是修改值 传递不到父窗口

1、@tauri-apps/api/event 中的listen 和emit 事件机制来处理
2、子窗口修改时  emit 发送事件,由主窗口监听到事件后,state的改变都统一在主窗口中

IM消息设计

1、消息都是通过本地存储来显示在客户端上
2、在线消息接收到后存储在本地
3、离线消息 先存储在服务器端、当用户登陆时发送在线消息 走步骤2
4、服务器端 留存所有消息记录

当使用 warp + tarui的http插件 使用js的FormData对象 进行文件上传的时候,返回400 bad request

1、切记 不要显示指定content-type 头为 multipart/form-data
2`FormData` 会自动设置 `Content-Type` 为 `multipart/form-data`,千万不要手动设置。
3、除了warp 外还需要添加以下依赖
futures-util = "0.3.17"
futures-channel = "0.3.17"

warp 静态文件服务

1、静态代理
warp::path("files").and(warp::fs::dir("./uploads"));
2、添加到路由
let cors = warp::cors()
    .allow_any_origin()
    .allow_methods(vec!["GET", "POST", "PUT", "DELETE", "OPTIONS"]);
let apis = (download_files);
let route =apis.with(cors);

下载文件

1、tauri环境下 window.open('xx','_blank') 不生效
2、可以使用<a>标签替代,注意这里url写绝对 路径,如下
<a :href="'http://localhost:3030/files/' + JSON.parse(item.content)['fileName']" target="_blank">
  <div class="message-bubble-receiver-file">
    <span>{{ JSON.parse(item.content)['fileName'] }}</span>
    <el-icon :size="size+15" :color="'deepskyblue'"><Files /></el-icon>
  </div>
</a>