一、前言
Tauri
是一款比较新的跨平台桌面框架,也是我目前最喜欢的一个框架,其官网为:Tauri
它的作用其实和Electron
很像:使用Web前端技术开发桌面软件。
但不同之处在于,Electron
是可以通过纯粹前端技术进行开发,也就是你只需要懂html
、js
、css
,就可以使用它来开发软件了。
而Tauri
则不同,除了这些基础的,你还需要懂rust
这门开发语言才行,所有js不支持的本地功能,你都可以使用rust来自行扩展。
虽然这看上去比electron更麻烦了,但就开发体验来说,我觉得tauri比electron要好得多,你几乎不需要任何其它配置就可以直接进行开发使用,并且只要你熟悉rust语言,就能非常方便的任意扩展本地功能集。
如果想要在electron框架中自定义扩展本地功能集,你大概率是需要写C++代码、然后再将两者进行绑定的,相比之下electron可能还更麻烦一点。
虽然tauri在开发本地应用的体验上比electron要好上不少,但缺点也是显而易见的:
- 你需要学会使用rust语言,这提升了开发者的使用门槛。
- tauri出现的较晚,各种文档、资料目前都较少,这进一步提高了门槛。
- tauri跨平台兼容性较差,这是它生成的可执行文件只有几兆的根本原因:它使用了系统自带的webview。
但不管怎么说,时代始终是在向前发展的,我相信未来这些问题都会被相继解决。
学习tauri开发应用还有一个很重要的因素:tauri还支持移动端开发,而electron只支持PC端开发。
也就是说,tauri真的能实现一套代码、全平台运行,而且使用的还是前端的技术,相比于另一个试图一套代码全平台运行、但目前依旧生态薄弱的flutter,我甚至觉得tauri会更加有前景。
如果对rust语言不熟悉,可以参考本站的rust教程文章:rust语言初识入门。
二、基本认识
官方教程一般都是对有一定经验的开发者所写的,所以基本不可能用大白话去写教程,这就导致新手其实是很难在短时间内看懂的。
进入tauri主页后,直接点击开始:
官方文档介绍的很全面,包含了tauri的由来,核心概念,项目创建,开发、分发等等一系列的模块。
但由于官方文档目前仍然在积极更新,未来内容很可能会发生变动,所以我这里就不一步一步按官方文档来了。
简单来说你想要使用tauri框架,你就得先安装好rust开发环境,没有安装的可以参考文章:初识rust。
除了基本的rust,你还需要安装前端基石Node.js,tauri默认使用的该js运行时来运行web前端代码。
目前tauri已经升级到了2.0版本,支持移动端开发,虽然bug依旧很多,但如果你想要尝试,可以参考后续文章介绍:tauri安卓开发环境搭建。
如果你目前是正常安装的windows10及之后的电脑,那么默认就已经安装了WebView2
,不用理会,否则,你需要自行安装该组件:Microsoft Edge WebView2。
这个组件就是tauri在windows平台所利用的本地浏览器功能,因为tauri直接调用的它,而不是像electron中那样会直接将整个浏览器的核心功能打包进最终的安装包内,所以能使得它的体积非常小巧。
所以网上才会有这样的说法:每安装一个使用electron开发的程序,都相当于在你的电脑上多安装了一个浏览器。
至于linux、mac平台,过程是差不多的,可以自行探索。
为了能让大家能够更加清楚的认识到tauri框架是如何工作的,这里我将从零搭建一个tauri的基本开发环境,不过前提是你对rust语言比较熟悉。
从后面开始,我将直接使用vue3框架进行开发,如果你对vue3不熟悉,可以参考系列教程文章:vue初识。
tauri自带了一个npm项目初始化命令,直接运行即可:
npm create tauri-app@latest
为了能清晰理解其运行逻辑,这里选择了下面这样的项目配置:
项目名自选、标识会自动生成,前端选择ts/js、npm,vanila代表不使用任何框架,纯前端html、js、css。
然后是下面划红框中的内容:
cd test
npm install
目的是初始化项目的,会安装所需要的前端包,如果不需要开发安卓,那么就可以不运行红框下的安卓初始化。
最后运行命令:
npm run tauri dev
即可看到一个app生成了:
这是其默认生成的代码,现在进入test文件夹修改一下代码:
test目录下,src目录此时就是前端代码目录,并且index.html
是主页面文件,你修改其内的任何东西,app界面都会实时响应效果,非常友好。
而src-tauri目录下的便是rust代码。
三、js与rust通信
仅仅像上面这样启动起来还是不够的,前端都是使用js代码写的,而现在后端我们使用的则是rust代码。
为了能扩展js本地功能,我们就需要让js调用rust代码。
想要实现这一点,需要执行下面三个步骤。
首先是在tauri的配置文件中启动js调用rust代码的能力,默认该项目生成后便已经启动了:
然后第二步,在rust代码中注册想要被js代码使用的函数:
正常写rust中的函数即可,唯一需要注意的是,如果你想要你的函数被js调用,那么必须在前面添加一个宏:#[tauri::command]
。
写了函数后还需要注册,注册的方式就是在main
函数中调用invoke_handler
函数,该函数的参数由tauri::generate_handler!
这个官方提供的宏来产生。
这个宏可接收的是一个数组,其中的所有元素都是使用了#[tauri::command]
的函数,你只需要将函数名挨个填入进去即可注册函数成功。
然后来到第三步,就是js代码中调用该函数:
首先从tauri挂载的全局对象tauri
中取出其提供的invoke
函数:
const { invoke } = window.__TAURI__.core
然后使用该函数来调用我们前面在rust中注册的函数:
invoke('greet', { name: 'World' });
它的第一个参数是函数名,第二个参数就是函数的参数对象,因为前面我函数中写的参数名为name
,所以这里的对象{}
中存放的就也是一个name
键对应其值为"world"
。
由于它返回的是一个promise对象,想要取出其值可以用await
,但这里不是在异步函数中,所以无法使用,只能暂时使用该对象上的then
函数得到返回值:
invoke('hello_tauri', { name: 'World' })
.then((response) => {
console.log(response)
});
此时运行程序,按F12
打开控制台,就能看到调用成功、成功得到了rust函数的返回值:
上面是js代码调用rust函数的过程,rust同样也是可以调用js代码的,只不过需要依靠“事件”,这个后文我会提及,因为纯js代码没有类型提示写起来还是太过难受了。
四、构建应用
开发完毕后,我们需要将其构建为可执行文件分发给其它人使用。
也很简单,运行下面这条命令即可:
npm run tauri build
首次构建的话,这个过程会比较漫长,构建完成后,它还会自动帮我们生成安装包,不过这个需要你有“梯子”去下载相应的工具,否则会失败,但这并不影响软件的正常使用:
比如我这里就打包了msi与nsis这两种类型的安装包。
这些在你前期学习都无所谓的,不用管,直接来到目录src-tauri\target\release
中,可以看到项目同名的可执行文件,双击它即可运行:
并且直接将其发给其它人也是能够直接使用的,但要注意,如果对方电脑上没有安装WebView2
,那么就运行不起来,需要先下载的WebView2
。
但这并不需要你担心,刚才提到的那个msi与nsis安装包会自动对用户环境进行检测,如果发现目标计算机上没有安装,那么它会自动引导用户去安装。
所以真正分发应用的时候,还是建议你分发它构建好的安装包:
至于如何配置它,我会在后面的文章对其进行详细介绍。