跨平台开发之 Tauri

news2025/1/20 19:27:12

比起 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 官方文档」。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript的this关键字

文章目录 一、JavaScript this 关键字总结 一、JavaScript this 关键字 面向对象语言中 this 表示当前对象的一个引用。 但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。 在方法中,this 表示该方法所属的对象。 如果单独使用&a…

2023/4/18总结

项目 实现了服务器和客户端的连接,在登录注册上面。 然后去实现了密码MD5化,通过java自带的,去实现了MD5. public String getMD5(String str) throws NoSuchAlgorithmException {MessageDigest mdMessageDigest.getInstance("MD5&quo…

SSTI模板注入小结

文章目录 一、漏洞简述🍺二、flask模板注入🍺三、shrine(攻防世界)🍺四、SSTI注入绕过🍺 一、漏洞简述🍺 1、SSTI(Server-Side Template Injection,服务器端模板注入&am…

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题,它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…

SpringBoot基础学习之(二十):Shiro与Thymeleaf的整合版本

还是一样,本篇文章是在上一篇文章的基础上,实施再次进阶 Shiro是一种特别的流行的安全框架,Thymeleaf则是spring boot架构中使用的一种特别引擎。今天介绍的则是它们俩的整合版本。 实现的功能:前端的显示的内容,是根…

vi/vim命令,使用vi编辑器命令详解

linux常用命令:vi/vim vi命令有三种模式:一般模式,编辑模式,命令模式(底行模式) 可以通过 vi [文件路径]文件名 的命令启动vi,并且打开指定的文件进行查看、编辑,其中[文件路径] 是可选参数。如…

微信小程序开发:实现毛玻璃效果

前言 在微信小程序开发的时候,也会遇到一些和在前端开发一样的样式需求,二者的相通类似性非常的高,就拿样式相关的需求来说,可以说是一模一样的操作。那么本文就来分享一个关于实现高斯模糊效果的需求,微信小程序和前端…

【Linux网络服务】FTP服务

FTP服务 一、FTP服务1.1FTP服务概述1.2FTP服务的特点1.3FTP服务工作过程 二、设置FTP服务2.1实验一:设置匿名用户访问FTP服务(最大权限)2.2实验二:设置本地用户验证访问ftp,并禁止切换到ftp以外的目录(默认…

Linux- 进程的切换和系统的一般执行过程

我想在介绍进程切换之前,先引入中断的相关知识,它是我们理解进程切换的重要前提,也是Linux操作系统的核心机制。 中断的类型 • 硬件中断(Interrupt),也称为外部中断,就是CPU的两根引脚&…

微服务学习-SpringCloud -Nacos (集群及CP架构相关学习)

文章目录 Nacos集群下心跳机制相对于单机会有怎样的改变?CAP原则和BASE原则常见的注册中心实现对比Nacos集群实现协议Nacos CP架构实现源码Nacos CP架构leader是如何选举的呢? Nacos集群下心跳机制相对于单机会有怎样的改变? 在上一遍单机模…

百万赞同:网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求 以前的时候,所有企业是以产品为核心的,管你有啥漏洞,管你用户信息泄露不泄露,我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法》…

No.041<软考>《(高项)备考大全》【第25章】量化项目管理

第25章】量化项目管理 1 考试相关2 量化项目管理3 准备量化管理项目4 量化的管理项目5 练习题参考答案: 1 考试相关 选择可能考0-1分,案例论文不考。 2 量化项目管理 量化项目管理(QPM)的目的在于量化地管理项目,以达成项目已建…

Auto-GPT 5分钟详细部署指南

安装 conda 1. 下载安装 miniconda3 : Miniconda — conda documentation conda是一个包和环境管理工具,它不仅能管理包,还能隔离和管理不同python版本的环境。类似管理nodejs环境的nvm工具。 2. conda环境变量: 新建 CONDA_H…

混合网络监控工具

多年来,网络不可避免地变得更加复杂。混合网络架构包括跨多个供应商的 LAN、WAN、公共或私有云存储以及混合云。简而言之,它是虚拟和物理网络组件的混合体,自远程工作出现以来,这种类型的网络架构已经起飞。 什么是混合网络 混合…

【《C和指针》笔记】第一章<快速上手>

注释以/*开始到*/结束或者使用// .预处理指令:因为它们是由预处理器解释的,预处理器读入代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器。预处理指令(#include、#define)所定义的变量…

【论文阅读笔记|CASE 2022】EventGraph: Event Extraction as Semantic Graph Parsing

论文题目:EventGraph: Event Extraction as Semantic Graph Parsing 论文来源:CASE2022 论文链接:https://aclanthology.org/2022.case-1.2.pdf 代码链接:GitHub - huiling-y/EventGraph 0 摘要 事件抽取涉及到事件类型检测、…

【Scala】集合

目录 类型 不可变集合 可变集合 数组 不可变 可变数组 不可变数组与可变数组的转换 多维数组 List list运算符 可变 ListBuffer Set 集合 不可变 Set 可变 mutable.Set Map 集合 可变 Map 元组 操作 通用操作 衍生集合操作 计算函数 排序 sorted sortB…

java springboot VUE 健康食谱管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE 健康食谱管理系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开 发),系统具有完整的源代码…

PHP快速入门08-JSON与XML处理

文章目录 前言一、使用介绍1.1 JSON处理1.2 XML处理 二、常见用法20例2.1 将数组转换为JSON格式:2.2 将JSON字符串转换回PHP数组:2.3 读取XML文件:2.4 将XML字符串转换成PHP对象:2.5 从URL获取JSON数据:2.6 写入JSON文…

SpringBoot集成Disruptor

Disruptor介绍 1.Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于 Disruptor 开发的系统单线程能支撑每秒 600 万订单,2010 年…