Tauri默认使用tauri://协议加载HTML,禁用file://以绕过跨域限制;需通过tauri dev启动、配置devPath、安装@tauri-apps/api,并在Rust端注册带#[tauri::command]的async函数及allowlist权限。

直接用 HTML 开发 Tauri 应用的前端界面完全可行,但关键不是“能不能写 HTML”,而是“怎么让 HTML 在 Tauri 环境里真正跑通、调用系统能力、不被安全策略拦住”。
为什么 file:// 协议下你的 HTML 会加载失败或禁用 API
Tauri 默认使用 tauri:// 自定义协议(而非 file://)加载前端资源,这是为了绕过浏览器对本地文件的跨域和 API 限制。如果你双击 index.html 打开,或者用 live-server 启动,invoke、listen、fs.readTextFile 全部会静默失败或抛出 NotSupportedError。
- 确保你通过
tauri dev启动——它会起一个本地 HTTP 服务并注入@tauri-apps/api全局对象 - 检查控制台是否报
Cannot find module '@tauri-apps/api':说明没装依赖,运行npm install @tauri-apps/api - 确认
tauri.conf.json中build.devPath指向你的 HTML 入口(如http://localhost:1420或../dist)
invoke 调用 Rust 命令时总返回 Promise {<pending>}</pending> 或报错
这不是前端问题,是 Rust 端没配好:Tauri 的 invoke 必须对应一个已注册的、带 #[tauri::command] 标记的函数,且不能是私有作用域。
- Rust 端要显式在
main.rs里注册命令:invoke_handler(tauri::generate_handler![your_command_name]) - 函数签名必须是
async fn your_command_name() -> Result<string string></string>(返回类型需实现Serialize) - 前端调用时注意 await:
const res = await invoke('your_command_name');,否则拿到的是 Promise 对象本身 - 如果报
Command not found,检查命令名大小写、是否拼错,以及是否在tauri.conf.json的allowlist里开了对应权限(如fs,shell)
用 fs.readTextFile 读取本地文件却提示 AccessDenied
Tauri 默认禁止前端随意访问任意路径,必须显式声明允许的目录范围,否则哪怕文件就在同级目录也会被拦截。
立即学习“前端免费学习笔记(深入)”;
- 在
tauri.conf.json中配置fs.scope,例如:["$APPPATH/**", "$APPDIR/**"](允许读取应用安装目录下所有文件) - 避免用绝对路径如
C:/data/config.json—— 改用resolvePath或预设别名:await fs.readTextFile('config.json', { dir: BaseDirectory.App }) -
BaseDirectory枚举值包括App、AppConfig、AppData等,优先用这些,而不是硬编码路径 - 开发时若用
tauri dev,$APPPATH指向的是src-tauri目录,不是前端dist目录 —— 文件得放对位置
最常被忽略的一点:Tauri 的 dev 和 build 模式下,资源路径解析逻辑不同,fs.scope 配置必须覆盖两种场景;另外,Rust 命令里的错误处理一定要 return Err(...) 而不是 panic!,否则前端 invoke 会卡死或无响应。


















