官方插件清单:fs、dialog、shell 与 notification

Tauri 2.x 把系统能力拆成独立插件:用文件系统装插件、用对话框装插件、按需引入。这既是体积控制手段,也是权限体系的一部分。本篇按使用频率介绍最常用的四组官方插件,给出接入步骤与典型用法。

一、文件系统:fs

文件系统插件在 Rust 与前端两侧都能用,是其他插件的基础模板。Cargo 端注册:

fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_fs::init())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

前端读写:

import { readTextFile, writeTextFile, appDataDir } from '@tauri-apps/plugin-fs'

const dir = await appDataDir()
await writeTextFile(`${dir}/config.json`, '{"theme":"dark"}')
const text = await readTextFile(`${dir}/config.json`)
console.log(text)

fs 的访问范围由 Capability 的 scope 限制,默认只能访问约定目录,这是 2.x 安全模型的核心,详见「权限模型:Capability 与作用域」。

二、对话框:dialog

对话框插件提供文件选择、消息提示与确认框:

import { open, confirm } from '@tauri-apps/plugin-dialog'

const filePath = await open({
  multiple: false,
  filters: [{ name: '图片', extensions: ['png', 'jpg'] }]
})

const ok = await confirm('确定删除这条记录吗?', { title: '确认', kind: 'warning' })

表中的能力分类清楚展示了边界:

能力 插件 典型场景
选择文件目录 dialog 打开、另存为
读写文件 fs 配置与数据持久化
打开外部程序与链接 shell 唤起浏览器、终端
系统通知 notification 下载完成提醒

对话框插件的 API 形态以官方文档为准,组件级弹窗仍由前端框架自己实现,插件只处理操作系统原生对话框。

三、Shell

Shell 插件用于打开系统默认程序:用浏览器打开链接、用文件管理器打开目录、唤起外部命令:

fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_shell::init())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
import { open } from '@tauri-apps/plugin-shell'

await open('https://tauri.app')
await open('/Users/me/Documents', 'open') // 打开目录,程序名按平台

执行任意外部命令需要额外权限声明,且务必校验输入,避免命令注入风险。同理,打开 URL 前校验协议白名单(只允许 https 等),防止恶意页面利用 shell 协议。

插件 风险点 防护
fs 任意路径读写 scope 限制目录
shell 命令注入、危险协议 权限声明加输入校验
notification 滥用打扰 用户可关的开关
dialog 误导性弹窗 文案明确

四、通知:notification

通知插件简单直接:

import { sendNotification } from '@tauri-apps/plugin-notification'

if (await isPermissionGranted()) {
  await sendNotification({ title: '同步完成', body: '已更新 128 条记录' })
}

需要先申请权限。macOS 首次会弹系统授权框,Windows 通知中心需要应用注册,各平台行为以系统文档为准。交互式通知(按钮、回复)在部分平台支持,复杂度较高,建议按需扩展。

五、插件引入的通用流程

归纳四个插件的接入共性,只要三步:加 Cargo 依赖并在 Builder 注册、装前端 npm 包、在 Capability 中声明要用的权限。完整清单如下:

插件 crate npm 包
文件系统 tauri-plugin-fs @tauri-apps/plugin-fs
对话框 tauri-plugin-dialog @tauri-apps/plugin-dialog
Shell tauri-plugin-shell @tauri-apps/plugin-shell
通知 tauri-plugin-notification @tauri-apps/plugin-notification

版本号请与项目 tauri 主版本匹配,混版会出现 API 不一致。版本兼容的排查可以借助 Claude Code 指南 的辅助分析,依赖配置文件中批量查找版本时 正则 mastery 很顺手。想自己造插件的话,见「自定义插件开发」。

六、插件的组合使用模式

真实应用往往组合四五个插件完成任务。典型组合:

场景 插件组合
导入文件处理 dialog 选文件、fs 读取、数据库落盘
导出分享 数据库查询、dialog 选目录、fs 写出、shell 打开
后台同步通知 网络、notification、updater
配置导入导出 dialog、fs 与状态读写

组合时注意权限链:每用到一个 API 就要在 Capability 里声明对应权限,漏一个就报错,权限声明参见「权限模型:Capability 与作用域」。

插件配合窗口管理还能做出更复杂的产品形态,比如同步在托盘菜单里触发、结果用系统通知推送,整套链路把 dialog、shell、notification、updater 全串起来。把每个插件当作积木,产品就是积木的组合方式。

官方插件是 Tauri 生态的地基:每个插件都是现成的最佳实践范例,读它们的源码能学到权限定义、事件封装、前端 API 设计的完整套路。用插件之余偶尔翻一翻源码,你会发现自己写代码的质感在悄悄提升。

插件与「重复造轮子」的边界值得常想:能用官方插件就别自己封装同类功能,社区轮子先搜一圈再动手。Tauri 生态的插件数量还在快速增长,每逢 Tauri 大版本升级时插件也会跟着适配,跟着官方走比自己维护省心得多。

最后提醒插件版本矩阵管理:把每个插件版本号记在依赖表里,升级 Tauri 主版本时同步核对,避免 API 静默变化导致的离奇错误。版本矩阵也是发布检查清单的一部分,值得纳入团队流程。

插件的引入顺序也有讲究:先把核心四件套(文件、对话框、Shell、通知)跑通,再按需加数据库与更新插件,每加一个都同步更新 Capability。一次性引入五六个插件容易出现权限报错无处下手的情况,逐个验证则是线性的排查路径。这套「增量插件化」的节奏建议直接写进新成员的入职文档,能让协作默契快速建立起来,也是降低 Tauri 上手门槛的有效经验。

延伸阅读

  • 权限模型:Capability 与作用域——插件能力背后的开关
  • 自定义插件开发——官方插件不够用时的下一步
  • Rust 入门:阅读插件源码的语法基础