slot deposit pulsa slot mahjong slot gacor slot gacor slot gacor resmi slot gacor 2025 slot gacor terpercaya slot gacor 2025 slot gacor hari ini slot gacor hari ini slot gacor hari ini
Tauri 最佳实践:混合使用 JS 与 Rust 开发桌面应用程序
17611538698
webmaster@21cto.com

Tauri 最佳实践:混合使用 JS 与 Rust 开发桌面应用程序

前端 0 2570 2024-08-02 08:21:23

图片

导读:本文将带领大家重新观察 Tauri,这个能使用任何前端框架并联合 Rust 内核构建桌面应用程序的应用框架。

我们将使用 Tauri 2.0 测试版为大家进行详细介绍。

在 2022 年 1 月,Tauri 的第一次出现,我们对它的评测总结是一个使用任何前端框架与Rust 核心构建桌面应用程序的框架。

由于 Rust 语言在过去两年半中人气显著飙升,我们认为值得再次回顾 Tauri — — 尤其是它最近刚推出了 2.0 版本。

Tauri 的宣传语是“构建一个优化、安全且独立于前端的应用程序,用于多平台部署”,这在以前是可以理解的,但更多的部署目标使其与我最近发布的其他应用产品更加一致。

使用Tauri 最大的优势,是能够让熟悉Web 开发的工程师能够构建桌面和移动应用程序。

我们能获得 Rust 的安全性,同时也能获得 Web 开发的熟悉度和灵活性。

--Tauri

接下来,我们将尝试构建一个可以在 Mac 上完整运行的 UI 应用程序,看看在实践的道路是否变得更顺畅。

Tauri 已经发布了多个版本,仍然称自己为“工具包(Toolkit)”,这对开发者来说仍然是准确的。

从概念上讲,Tauri 充当静态 Web 主机。因此Tauri 可与 Rust 包和系统的原生 Web 视图配合使用,输出一个中等尺寸的可执行应用程序。

所以通过使用Tauri,在理论上我们既能获得 Rust 的安全性,又能获得 Web 开发的熟悉度和灵活性。

Tauri 的入门路线看起来更新颖一些,采用现在流行的单行开始。在此之前,我怀疑我自己的环境 Rust 安装的版本比较旧,所以我应该更新它。

先开始进行说明:

图片

最后,它会提醒你启动新的 shell 或获取 env 文件。我注意到这一切都有了新的更友好的口音——因为 Rust 现在很流行!

好的,现在我应该可以使用 Tauri 单行代码了:

图片

注意,我们已经进入 Tauri 2.0 的测试阶段。

模板安装选项可识别工具包的更多变化性质。我可以使用 .NET,但为了获得更通用的视图层,我将使用 JavaScript。显然,Rust 也是可用的。

图片

我保留了稍旧的 npm / node 组合,并构建了相关模板:

图片

然后,我们在开发环境中运行模板:

图片

这将构建我们开始所需的所有软件包。第一次需要几分钟。这些将是 Rust 与操作系统窗口对话的方式。

最后,它会启动应用程序。如下图:

图片

因此,我们启动并弹出一个应用程序,并将其作为标准 Mac 应用程序出现在我的托盘中。

好的,让我们看看它是如何构成的。在深入研究之前,请注意,点击图标会启动一个浏览器页面,在文本框中输入您的姓名并按下按钮会显示问候语:

图片

这将有助于我们稍后解决 Rust 问题。代码结构与 Web 应用程序的预期一致:

图片

我选择了原始的 JavaScript,在模板中会得到一个非常原始的index.html :







Tauri App




Welcome to Tauri!







Click on the Tauri logo to learn more about the framework














你可以注意到,在锚点处显示图像,处理链接行为。

请注意,JavaScript 在main.js中,窗口本身上的应用程序标题不是在此处定义的。

我们有一个非常“古老”的form表单中输入文本的方法。所以我们必须处理该表单以提取输入的名字,并将结果放在 final 中。

以下,是 main.js 的内容:


const { invoke } = window.__TAURI__.core;
let greetInputEl;
let greetMsgEl;

async function greet() {
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
greetMsgEl.textContent = await invoke("greet", { name: greetInputEl.value });
}
window.addEventListener("DOMContentLoaded", () => {
greetInputEl = document.querySelector("#greet-input");
greetMsgEl = document.querySelector("#greet-msg");
document.querySelector("#greet-form").addEventListener("submit", (e) => { e.preventDefault();
greet();
});
});


选择活动元素并向表单按钮添加事件监听器后,我们运行一个函数来处理输入并将其粘贴到输出段落中。这里需要用到一些 Rust,因此我们了解了它的工作原理。

如果我们回到生成区域的主目录,我们会注意到有 src-tauri 的新目录:

图片

其中在 main.rs中的src中,有一些就是 Rust 代码:

// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

我们能够看到 JavaScript 中的invoke调用如何到达处理字符串的Rustgreet函数。这很好,因为我们可以访问Tauri为我们管理的Rust函数。(我们还需要告诉构建器greet函数。)

最后显示的文件是控制窗口本身的 JSON 配置,tauri.conf.json:

{
"productName": "thenewstack",
"version": "0.0.0",
"identifier": "com.tauri.dev",
"build": { "frontendDist": "../src" },
"app": { "withGlobalTauri": true, "windows": [
{
"title": "thenewstack",
"width": 800,
"height": 600
}
],
"security": { "csp": null } },
"bundle": { "active": true,
"targets": "all",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
... ]
}
}

为了确保我们理解了所有内容,让我们设定一个可识别的目标,并给新游客打印欢迎消息。

我们把上面的窗口目标改小一点,并加上一个唯一的标识符:

{  ...   "identifier": "io.thenewsatck",  ...  "app" : {    "windows": [      {        "title": "Welcome to TheNewStack",        "width": 600,        "height": 200
} ... }, ... }}

然后我们适当地修改消息代码。这将强制构建检查更改。

最后,我们运行完整的构建过程,看看它对可执行文件都做了什么。

图片

这也需要时间,因为这是首次构建和编译。

结果会产生一个 dmg 和一个 app 文件。我们将应用程序移动到应用程序文件夹中,就可以将其作为普通的 Mac 应用程序执行了:

图片

该应用程序的大小仍然有点大(10.7 MB),但我没有采取任何措施来减少会自动添加到模板中的板条箱数量。

结论


我认为使用模板我们可以很快从零开始成为佼佼者,尽管允许使用一系列 JavaScript 框架的灵活性确实让一切变得更加复杂。我想知道更有主见的方法是否会更好。


但总的来说,我认为 Tauri 仍然是一个非常可靠的解决方案,可以流畅创建桌面应用程序,而不用担心窗口内部问题。


编译:洛逸
作者:Eoin Patrick
参考:
https://thenewstack.io/tauri-mixing-javascript-with-rust-for-gui-desktop-apps/

评论