跨平台开发之 Tauri

2023-11-07

比起 Electron,Tauri 打包后的安装包体积是真的小。

跨平台开发

最近使用跨平台开发框架写了一个软件,在此记录一下。

说起跨平台开发,我的理解是这样的:

  • 多依赖浏览器环境运行
  • 多使用前端语言进行开发
  • 只需一次编码,但不同平台可能需要做兼容处理
  • 能够在 macOS、Windows、Linux 或者 Android、iOS 上运行

跨平台框架选择

需求

女朋友让我帮忙写个文件上传的软件,先描述一下软件的功能需求:

  • 支持上传文件到七牛云
  • 上传后自动复制文件链接
  • 支持查看上传历史
  • 图片视频等资源可以直接预览

其实之前用 Java 写过一个「七牛云上传工具」,也能用,但是依赖 Java 环境,而且界面比较丑,也没有上传历史记录。

可能有人会说, PicGo 之类的软件不就可以满足需求么,干嘛还自己造轮子。

其实是这样的,类似 PicGo 的软件只能上传图片,而且安装包太大。我需要的是一个能上传文件,并且安装包小的轻量级软件,所以正好借这个机会自己来实现。

经过我的考虑,我对框架选择提出了以下要求:

  • 使用 Vue 开发
  • 能够打包成客户端
  • 客户端支持 macOS 和 Windows

这么看下来肯定是跨平台开发了,那选择哪个框架呢?

Electron VS Tauri

本来是想用「Electron」的,但是说真的,只看官方文档没看出来怎么使用 Vue 入门。GitHub 虽然有一个「electron-vue」项目,但已经太久没维护了,连项目初始化都报错。

无奈只好放弃使用 Electron,一番搜索后找到了「Tauri」,跟 Electron 类似,也支持在 Mac、Win、Linux 上运行,并且最新的 2.0(Alpha)还支持在 Android 和 iOS 上运行。不过这不是最主要的,最主要的是以下两点:

  • 官方脚手架初始化项目支持 Vite,也就是说可以无缝使用 Vue 进行开发。
  • 打包后的安装包体积小,众所周知 Electron 打包会包含一个浏览器,而 Tauri 并不会。

Tauri 入门

官方仓库:https://github.com/tauri-apps/tauri

特点

不同于 Electron 嵌入 Chromium 的做法,Tauri 利用 macOS 上的 WebKit、Windows 上的 WebView2 和 Linux 上的 WebKitGTK,以此来避免嵌入浏览器的笨重包袱,使得安装包能够做到很小的体积。

但这也可能导致兼容性问题,例如低版本的 Windows 系统不包含 Webview2,需要设置 Webview2 的安装配置;不同系统对混合内容等问题的兼容性不同。

环境准备

这里只介绍一下 macOS 下的准备工作,其他系统准备工作请参考「Prerequisites」。

  • CLang 和 macOS 开发依赖项
xcode-select --install
  • Rust
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

初始化

我这里以官方 Vite 初始化项目为例,更多初始化请参考官方文档「Quick Start」。

npm create tauri-app@latest

选择适合自己的配置项。

❯ npm create tauri-app@latest
Need to install the following packages:
  create-tauri-app@3.3.5
Ok to proceed? (y) y
✔ Project name · tauri-app
✔ Choose which language to use for your frontend · TypeScript / JavaScript - (pnpm, yarn, npm)
✔ Choose your package manager · npm
✔ Choose your UI template · Vue - (https://vuejs.org)
✔ Choose your UI flavor · JavaScript

然后安装依赖:

npm install

接下来预览项目:

npm run tauri dev

控制台会显示预览链接,点击即可通过浏览器进行预览。同时会启动一个客户端的预览界面,如下图所示(第一次运行需要下载资源,可能会比较慢,耐心等待即可)。

客户端预览

如果只想通过浏览器进行预览,执行 npm run dev 即可。

项目目录

可以看到项目的目录跟 Vue 基本是一致的,多出的 src-tauri 目录便是 Tarui 特有的。

┌── public
│   ├── tauri.svg
│   └── vite.svg
├── src
│   ├── assets
│   ├── components
│   ├── App.vue
│   ├── main.js
│   └── styles.css
├── src-tauri
│   ├── icons
│   ├── src
│   ├── target
│   ├── Cargo.lock
│   ├── Cargo.toml
│   ├── build.rs
│   └── tauri.conf.json
├── README.md
├── index.html
├── package-lock.json
├── package.json
└── vite.config.js
  • icons:各个平台的图标,可查看「Icons」进行详细了解
  • src:Rust 代码,Tauri 可以在前端调用 Rust 代码,可查看「Calling Rust from the frontend」进行详细了解
  • target:打包目录
  • Cargo.lock & Cargo.toml & build.rs:Rust 相关
  • tauri.conf.json:Tauri 的配置文件,可查看「Configuration」进行详细了解

开发

Tauri 虽然支持 Rust,但是完全不会 Rust 也没影响,像我就完全没接触过 Rust。

就跟正常开发 Vue 项目一样,安装依赖包,引入依赖,写页面、组件即可。

我这里使用了 View UI Plus七牛云 JavaScript SDK,按照各自的文档进入引入和使用即可。

额外说一句,七牛云 JavaScript SDK 需要先获取到上传凭证才能上传,具体可参考「上传凭证」文档。

API

Tauri 提供了一些列 API 使得开发更加容易,这里以「clipboard」为例,简单说下 Tauri API 的使用。

首先,需要在 tauri.conf.json 里设置 clipboard 节点,参考下面的代码:

{
  "tauri": {
    "allowlist": {
      "clipboard": {
        "all": true, // enable all Clipboard APIs
        "writeText": true,
        "readText": true
      }
    }
  }
}

如果仅需设置剪贴板内容,无需读取,则只设置 writeTexttrue 即可。

在代码中使用 writeText

import { writeText } from '@tauri-apps/api/clipboard';
await writeText('Tauri is awesome!');

更多关于 Tauri API 使用可查看「@tauri-apps/api」。

生成图标

Tauri 支持 macOS、Windows 和 Linux 三个平台,为了简化 icon 的制作,Tauri 提供了专门生成 icons 的命令。

npm run tauri icon 图片路径

原始图片最好是 1024x1024 的 png 图片,执行命令后即可生成各平台下的 icon。

可查看「Icons」进行详细了解。

打包

npm run tauri build

使用 Mac 进行打包,那么打出来的就是 dmg 包,只能 macOS 使用。如果想实现跨平台打包,可以参考「Cross-Platform Compilation」。其他平台打包可参考「Building」。

界面展示

展示一下我使用 Tauri + Vue + View UI Plus 实现的界面。

文件上传

历史记录

图片预览

上传配置

Tauri 踩坑

在使用 Tauri 过程中踩了一些坑,也记录下来。

文件拖拽

拖拽上传需要在配置文件里将 tauri.conf.json 里 windows 节点下的 fileDropEnabled 设置为 false,否则会跟 Vue 组件的拖拽冲突。

"windows": [
  {
    "fullscreen": false,
    "resizable": false,
    "title": "文件上传工具",
    "width": 800,
    "height": 450,
    "fileDropEnabled": false,
  }
]

并且为了防止将图片拖拽到非上传区域导致页面显示图片的情况,需要阻止页面 dropdragover 的默认监听:

window.addEventListener("drop", (e) => e.preventDefault(), false);
window.addEventListener("dragover", (e) => e.preventDefault(), false);

右键菜单

软件最后要打包成客户端,不需要浏览器的右键菜单,可参考下方代码,禁用右键菜单:

window.addEventListener("contextmenu", (e) => e.preventDefault(), false);

复制文本

View UI Plus 带有 $Copy 复制到剪贴板 的全局方法,但在 Tauri 框架里有可能会失败。

解决办法就是调用 Tauri 的 writeText

混合内容

Tauri 打包后的应用其实是 https:// 的一个网页应用,如果页面中包含了 http:// 的资源那就是混合内容,控制台会报错,图片等资源会显示不出来;如果资源也是 https:// 那就不是混合内容,也不会报错。

由于做的是图片预览,所以我的解决办法是使用 Tauri 的 os type 判断,在 Windows 下直接打开一个 WebviewWindow 来加载图片 url,显示是没问题的。

但是在 macOS 上打开 WebviewWindow 加载图片 url 图片无法显示,控制台会提示 Failed to load resource: The resource could not be loaded because the App Transport Security policy requires the http://xxx.xxx.xxx use of a secure connection,暂时只能提示手动去浏览器访问预览。

这里要注意,在开发模式下混合内容是不会报错的,显示也都正常,但是打包之后就会报错并且显示异常。

Windows 相关

Windows 下执行脚本可能提示「无法加载文件 xxx,因为在此系统上禁止运行脚本」,这是因为 PowerShell 执行策略导致的。

我的做法是更改 PowerShell 执行策略为 Bypass

Set-ExecutionPolicy -ExecutionPolicy Bypass

但是这个策略是有风险的,如果你的主力系统是 Windows,建议参考「about_Execution_Policies」选择合适的执行策略和执行策略范围。

打包的时候遇到 Error failed to bundle project: error running light.exe: error running light.exe 的问题,设置 budle 节点下的 windowswix 语言为 zh-CN

"bundle": {
  "windows": {
    "wix": {
      "language": "zh-CN"
    }
  }
},

在 Windows 上 Tauri 依赖的是微软的 WebView2,Windows 10 1803 及以后的版本和 Windows 11 都是自带 WebView2 的,但如果是低版本的系统,在安装时会自动下载和安装 WebView2,但是安装过程没有提示,感觉像是卡住了,体验不是很好。如果想自行配置 Webview2 的安装选项,可以参考 「Webview2 Installation Options」。

窗口居中闪烁

默认的窗口位置并不是居中的,可以设置 windows 节点的 cnetertrue

"windows": [
  {
    "fullscreen": false,
    "resizable": false,
    "title": "文件上传工具",
    "width": 800,
    "height": 450,
    "fileDropEnabled": false,
    "center": true
  }
]

但是这个居中有点问题,窗口还是会从默认位置出现,然后再跳到居中的位置,能看到跳的过程,体验不是很好。

总结

总体来说使用 Tauri 开发跨平台应该还是不错的,与 Vue 生态完美配合,安装包的体积也可以做到很小。

但也不可避免的有一些问题,例如 Windows 下 Webview2 的安装问题、不同系统下混合内容的兼容性问题等。

我觉得如果是个人项目可以用 Tauri 搞一下,但如果是商业化的项目需要提前评估,防止入坑后需要过多的时间来填坑。

更多关于 Tauri 的使用参考请查看「Tauri 官方文档」。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨平台开发之 Tauri 的相关文章

随机推荐

  • 基于Hybris平台的电商个性化服务实践

    个性化服务是什么 下面例举几个典型的电商网站的个性化服务案例 对于浏览过新品推荐的客户 电商网站主动为此类客户推荐一款新上市的商品 对于单笔订单总金额达到1000 并且该订单中包含化妆品的客户 此用户将被升级为金牌客户 后续电商网站定期为金
  • RAID介绍及RAID5配置实例(超详细)

    一 RAID磁盘阵列介绍 磁盘阵列的全名 Redundant Arrays of Inexpensive Disk RAID 中文简称是独立冗余磁盘阵列 RAID可以通过技术 软件或者硬件 将多个独立的物理硬盘整合成为一个较大的硬盘组 逻辑
  • MATLAB实现基本的遗传算法(写成函数形式,可调用),优化目标函数,并举例展示

    遗传算法 其本质上是一种进化算法 相比其他的算法应用范围比较广泛 特别是对于一些非线性 多模型 多目标的函数优化问题 用其他的优化方法较难求解 而遗传算法可以方便的得到较好的结果 不过正如我在PSO粒子群算法的文章中说道 每种算法的应用场景
  • Ubuntu: 安装最新版本的 Nginx

    Ubuntu 默认 apt 源中的 Nginx 版本比较旧 今天介绍下如何在 Ubuntu 中安装最新版本的 Nginx 要安装较新版本的 Nginx 可以使用 Nginx 的 APT 源 执行如下脚本来添加 Nginx APT 源 bin
  • gitlab项目的备份与迁移

    gitlab项目的备份与迁移 最近工作中需要用到gitlab项目的备份与迁移工作 因此做了一个简单的部署配置 这里小小记录一下 一 gitlab的安装 1 安装准备 1 本人由于在centos7上部署gitlab 因此使用的gitlab的版
  • unity3d 启动项目卡在load script assembly

    最近突然碰到unity启动项目 卡在load script assembly的情况 删除了library重开也还是如此 日志打印里面打印到 刷新script开始然后就戛然而止了 后来发现是 项目里某个文件夹被一个命令行占用了 unity在导
  • 安装nrm报错

    internal validators js 124 throw new ERR INVALID ARG TYPE name string value TypeError ERR INVALID ARG TYPE The path argu
  • 2023华为OD机试真题【最接近中位数的索引】

    前言 本题使用Java解答 如果需要python版本答案 请查看以下链接 Python版本答案 题目内容 给定一个数组X和正整数K 请找出使表达式X i x i 1 X i K 1 结果最接近于数组中位数的下标i 如果有多个i满足条件 请返
  • [Java]两个有理数的加减乘除

    public class Rational private long num 0 分子 private long den 1 分母 Begin long i public Rational long num long den this nu
  • Blender 的 操作与快捷键

    Blender是一款开源的免费的3D建模软件 目前来看还不错哦 Blender的快捷键 鼠标右键选中物体 左键是确认 选中下 按住滑轮拖动鼠标可以环视 选中下 按住shift正反键可以上下 选中下 按住shift按住滑轮拖动鼠标可以左右 小
  • javaweb-HTTP协议(服务器数据的接收、处理、响应流程)详解

    HTTP协议 HTTP请求 两种HTTP请求方式 在服务器接收信息 HttpServletRequest 请求行 请求头 请求体 处理 响应 HTTP协议 什么是HTTP协议 超文本传输协议 Hypertext Transfer Proto
  • https请求跨域问题的解决

    原http服务升级为https服务后 发现同级域名下的单点登录不可用 报错 The page at https aaa xxx com was loaded over HTTPS but requested an insecure fram
  • CTFweb篇——upload-labs

    0x00 前言 本次以 upload labs的Pass 00和pass 01为例 0x01 进入靶场 pass 00 首先查看Pass 00题目 任务要求上传一个webshell到服务器 编写一句话木马 然后上传 右键复制图像地址 连接菜
  • Windows系统克隆***与防范

    随着电脑技术的发展和电脑的普及 还有大大小小的 骇客 网站和越来越简单的工具 使得目前 变得日趋频繁 被植入 的电脑或 服务器也越来越多 与此同时系统管理员的 安全意识也在不断提高 加上杀毒软件的发展 网络 的生命周期也越来越短 所以 者在
  • sql函数创建和调用

    create FUNCTION Fun GetDeptID 传入参数 或参数类型 UserID VARCHAR 100 IDepGrade INT 返回值类型 RETURNS VARCHAR 100 AS BEGIN 定义返回值 DECLA
  • 揭开“视频超分”黑科技的神秘面纱

    在看电影时 有一幕大家应该都非常熟悉 警察从证据图片中选取一块区域放大 再放大 直到一个很小的目标变得清晰可见 从而发现重要的线索 现实中是不是真的有这样的技术 可以把模糊的小图变得清晰 答案是 一定程度上可以 这项黑科技就是超分辨率技术
  • 【教程】PyTorch Timer计时器

    转载请注明出处 小锋学长生活大爆炸 xfxuezhang cn OpenCV的Timer计时器可以看这篇 Python Timer和TimerFPS计时工具类 Timer作用说明 统计某一段代码的运行耗时 直接上代码 开箱即用 import
  • 【实战】通过 JS 将 HTML 导出为 PDF 文档

    背景介绍 某老人院信息管理系统项目 甲方要求将财务模块的各种报表导出为PDF文档 方便打印 之前的解决方案 是将报表生成专门的打印 HTML 页面 然后按 Ctrl P 调用浏览器本身打印功能去打印 这种方式存在的问题是不同分辨率的显示器
  • vue单页应用在页面刷新时保留状态数据的方法

    在Vue单页应用中 如果在某一个具体路由的具体页面下点击刷新 那么刷新后 页面的状态信息可能就会丢失掉 这时候应该怎么处理呢 如果你也有这个疑惑 这篇文章或许能够帮助到你 一 问题 现在产品上有个需求 单页应用走到某个具体的页面 然后点击刷
  • 跨平台开发之 Tauri

    比起 Electron Tauri 打包后的安装包体积是真的小 跨平台开发 最近使用跨平台开发框架写了一个软件 在此记录一下 说起跨平台开发 我的理解是这样的 多依赖浏览器环境运行 多使用前端语言进行开发 只需一次编码 但不同平台可能需要做