news 2026/10/23 21:11:06

【A11】Tauri v2 + 原生前端(无框架)项目笔记:从零到登录界面

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【A11】Tauri v2 + 原生前端(无框架)项目笔记:从零到登录界面

一、环境准备

在开始之前,需要确保系统已安装以下工具:

  • Node.js(18+):用于运行前端构建工具和 Tauri CLI
  • Rust:Tauri 后端使用 Rust 编写,需安装 Rust 工具链
  • 系统依赖:Windows 需安装 WebView2(Win10 1803+ 通常自带);macOS 需 Xcode Command Line Tools;Linux 需 webkit2gtk 等

验证安装:

node-vcargo--version

如果 Rust 未安装,访问 rustup.rs 按提示安装即可。

二、创建 Tauri 项目

Tauri 官方推荐使用create-tauri-app工具来快速初始化项目。在你想存放项目的文件夹中执行:

npmcreate tauri-app@latest

系统会依次提示你进行以下选择:

  1. 项目名称:输入a11
  2. 标识符(bundle identifier):例如com.a11.app(全局唯一即可)
  3. 前端语言:选择TypeScript / JavaScript
  4. 包管理器:选择npm
  5. UI 模板:选择Vanilla(即无框架,纯 HTML/CSS/JS)
  6. 是否使用 TypeScript:选择Yes或No均可

完成后,进入项目目录并安装依赖:

cda11npminstall

然后启动开发模式验证:

npmrun tauri dev

看到弹出的应用窗口就说明项目创建成功了。

三、理解项目结构

创建完成后,项目大致结构如下:

a11/ ├── src/ # 前端源码(HTML/CSS/JS/TS) │ ├── index.html │ ├── styles.css │ └── main.ts ├── src-tauri/ # Rust 后端 │ ├── src/ │ │ ├── lib.rs # Rust 代码入口(主要修改这里) │ │ └── main.rs # 桌面端入口,一般不改 │ ├── capabilities/ │ │ └── default.json # 权限配置文件 │ ├── icons/ # 应用图标 │ ├── tauri.conf.json # Tauri 主配置文件 │ ├── Cargo.toml │ └── build.rs ├── package.json └── vite.config.ts

关键点:

  • tauri.conf.json是 Tauri 的主配置文件,包含应用标识符、窗口设置、开发服务器地址等所有配置
  • capabilities/default.json控制前端可以调用哪些 Tauri 命令,默认所有插件命令都被拦截,需要显式声明权限
  • src/lib.rs是写 Rust 业务逻辑的地方,main.rs只是桌面端入口,不需要修改

四、配置无框架(Vanilla)前端

使用 Vanilla 模板时,Tauri 需要一个前端开发服务器来提供 HTML/CSS/JS 文件。模板默认使用 Vite 作为构建工具。

在vite.config.ts中,需要添加一项配置,防止 Vite 监听src-tauri目录(否则 Rust 编译产生的文件变化会触发前端热更新,造成无限循环):

exportdefaultdefineConfig({// ...server:{watch:{ignored:["**/src-tauri/**"],},},});

这一配置在 Tauri 官方文档中有明确说明。

前端入口是src/index.html,直接在其中编写 HTML 结构,CSS 放入src/styles.css,JavaScript 逻辑放入src/main.ts(或.js)。由于没有框架,所有 DOM 操作都是原生 JavaScript。

五、实现登录界面

5.1 窗口配置

登录界面通常需要较小的窗口尺寸,并禁止用户调整大小。在tauri.conf.json的app.windows中配置:

{"app":{"windows":[{"title":"a11","width":380,"height":520,"resizable":false,"decorations":false,"center":true}]}}
  • decorations: false会移除系统默认标题栏,让我们可以用 HTML/CSS 实现自定义标题栏
  • resizable: false锁定窗口大小
  • center: true让窗口居中显示

5.2 自定义标题栏与窗口控制

移除系统标题栏后,需要自己实现拖动窗口和最小化/关闭按钮。

拖动区域:在 HTML 中,给标题栏的拖动区域添加data-tauri-drag-region属性,用户按住该区域即可拖动窗口:

<divclass="titlebar__drag"data-tauri-drag-region><span>a11</span></div>

窗口按钮:最小化和关闭按钮需要调用 Tauri 的窗口 API。在 Vanilla 模板中,Tauri v2 的 API 通过window.__TAURI__全局对象暴露(注意 v2 中路径变为了window.__TAURI__.core和window.__TAURI__.window):

// 最小化document.getElementById('btn-min').addEventListener('click',async()=>{const{getCurrentWindow}=window.__TAURI__.window;awaitgetCurrentWindow().minimize();});// 关闭document.getElementById('btn-close').addEventListener('click',async()=>{const{getCurrentWindow}=window.__TAURI__.window;awaitgetCurrentWindow().close();});

5.3 配置窗口权限(关键步骤)

在 Tauri v2 中,前端调用任何窗口操作命令都需要在 capability 文件中声明权限,否则会被拦截。

打开src-tauri/capabilities/default.json,在permissions数组中添加:

{"permissions":["core:default","core:window:allow-close","core:window:allow-minimize","core:window:allow-start-dragging","core:window:allow-toggle-maximize"]}

各权限的作用如下:

权限作用
core:window:allow-close允许关闭窗口
core:window:allow-minimize允许最小化窗口
core:window:allow-start-dragging允许通过拖动区域移动窗口
core:window:allow-toggle-maximize允许最大化/还原窗口

注意:core:window:default默认不包含start-dragging,所以必须单独添加。如果没有添加allow-start-dragging,data-tauri-drag-region属性将不会生效。

5.4 登录表单逻辑

登录表单使用原生 HTML 表单元素,JavaScript 处理提交:

document.getElementById('login-form').addEventListener('submit',async(e)=>{e.preventDefault();constaccount=document.getElementById('account').value.trim();constpassword=document.getElementById('password').value;// 简单校验if(!account||!password){showError('请输入账号和密码');return;}// 模拟登录请求(后续可替换为真实接口)try{// 这里可以调用 Tauri 的 invoke 与 Rust 后端通信// const { invoke } = window.__TAURI__.core;// const result = await invoke('login', { account, password });console.log('登录:',account);}catch(err){showError('登录失败,请重试');}});

如果需要与 Rust 后端通信(例如验证账号密码),可以在src-tauri/src/lib.rs中定义命令:

#[tauri::command]fnlogin(account:String,password:String)->Result<String,String>{ifaccount=="admin"&&password=="123456"{Ok("登录成功".into())}else{Err("账号或密码错误".into())}}#[cfg_attr(mobile, tauri::mobile_entry_point)]pubfnrun(){tauri::Builder::default().invoke_handler(tauri::generate_handler![login]).run(tauri::generate_context!()).expect("error while running tauri application");}

前端通过invoke调用:

const{invoke}=window.__TAURI__.core;try{constmsg=awaitinvoke('login',{account,password});// 登录成功,可以跳转或关闭登录窗口}catch(err){showError(err);}

5.5 记住账号与自动登录

利用localStorage保存用户选择:

// 登录成功后保存if(document.getElementById('remember').checked){localStorage.setItem('a11_account',account);}if(document.getElementById('auto-login').checked){localStorage.setItem('a11_auto_login','true');}// 页面加载时回填window.addEventListener('DOMContentLoaded',()=>{constsaved=localStorage.getItem('a11_account');if(saved){document.getElementById('account').value=saved;document.getElementById('remember').checked=true;}if(localStorage.getItem('a11_auto_login')==='true'){document.getElementById('auto-login').checked=true;}});

六、完整开发流程总结

1. npm create tauri-app@latest → 项目名 a11,Vanilla 模板 2. cd a11 && npm install 3. 配置 vite.config.ts(忽略 src-tauri 目录) 4. 修改 tauri.conf.json → decorations: false, resizable: false, 窗口尺寸 5. 编辑 src/index.html + src/styles.css + src/main.ts → 实现登录界面 UI 6. 配置 capabilities/default.json → 添加窗口权限 7. 实现标题栏拖动 + 窗口按钮 + 登录表单逻辑 8. 可选:在 src-tauri/src/lib.rs 添加 Rust 命令 9. npm run tauri dev 测试 10. npm run tauri build 打包

常见问题与注意事项:

  • data-tauri-drag-region不生效:检查capabilities/default.json中是否添加了core:window:allow-start-dragging权限。
  • Tauri API 未定义:确认使用的是 Tauri v2,API 路径为window.__TAURI__.core(invoke)和window.__TAURI__.window(窗口操作),而非 v1 的window.__TAURI__.tauri。
  • Vite 无限热更新:务必在vite.config.ts中配置server.watch.ignored: ["**/src-tauri/**"]。
  • 双击标题栏无法最大化:Tauri 的 drag region 默认不处理双击最大化行为,需要手动监听dblclick事件并调用toggleMaximize()。
  • 窗口尺寸限制:登录窗口建议resizable: false,登录成功后如需切换到主界面,可以创建新窗口或调整当前窗口尺寸,参考 Tauri 窗口 API 的setSize方法。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 21:11:05

SpringBoot接口限流实战:从本地滑动窗口到Redis与Sentinel分布式限流

写SpringBoot接口&#xff0c;最怕什么&#xff1f;不是业务逻辑复杂&#xff0c;也不是数据库慢查询&#xff0c;而是某个接口突然被刷爆&#xff0c;后面所有请求跟着一起死。我自己遇到过最典型的一次&#xff1a;一个内部数据查询接口平时只有几十QPS&#xff0c;结果某个合…

作者头像 李华
网站建设 2026/10/18 0:07:35

葡萄目标检测实操:YOLO/VOC双格式数据集与YOLOv8训练避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 23:55:35

ESP32驱动MAX30102脉搏血氧心率传感器

ESP32驱动MAX30102脉搏血氧心率传感器MAX30102脉搏血氧心率传感器MAX30102模块引脚定义MAX30102模块与ESP32开发板引脚接线MAX30102 Arduino驱动程序获取心率数据获取血氧饱和度数值获取指尖温度MAX30102脉搏血氧心率传感器 MAX30102一种光学传感器&#xff0c;能够以无创方式…

作者头像 李华
网站建设 2026/10/23 7:26:13

工控PCBA代工厂生产有哪些工艺?SMT、DIP、AOI与X-Ray解析

工业控制器、自动化控制板、电机控制板等产品&#xff0c;对PCBA制造工艺通常有较高要求。一块工控PCBA可能同时包含MCU、存储器、通信芯片、QFN、BGA、连接器、继电器以及功率器件&#xff0c;因此生产过程并不是简单的SMT贴片。从实际制造来看&#xff0c;工控PCBA通常涉及SM…

作者头像 李华
网站建设 2026/10/18 23:40:10

2026年程序员必备:AI驱动后端开发,小白也能轻松转型!

文章指出&#xff0c;2026年后端开发将发生巨大变革&#xff0c;AI将主导CRUD等重复性工作&#xff0c;传统CRUD工程师价值下降。真正的AI驱动后端工程师需掌握AI集成、智能架构设计、上下文工程与Agent编排、生产级AI治理等能力&#xff0c;成为企业争抢的对象。文章建议后端工…

作者头像 李华