The Tauri plugin system allows extending framework functionality and creating reusable modules:
Plugin Architecture
Tauri plugins consist of two parts:
- Frontend part: JavaScript/TypeScript API
- Backend part: Rust extension
Creating a Plugin
1. Initialize Plugin Project
bashcargo create-tauri-plugin --name my-plugin
2. Rust Implementation
src-tauri/plugins/my-plugin/src/lib.rs:
rustuse tauri::{plugin::Plugin, Runtime}; #[tauri::command] async fn my_command(name: String) -> Result<String, String> { Ok(format!("Hello, {}!", name)) } pub struct MyPlugin<R: Runtime> { phantom: std::marker::PhantomData<R>, } impl<R: Runtime> Plugin<R> for MyPlugin<R> { fn name(&self) -> &'static str { "my_plugin" } fn initialize(&mut self, app: &tauri::AppHandle<R>, config: serde_json::Value) -> Result<(), Box<dyn std::error::Error>> { // Initialization logic Ok(()) } } pub fn init<R: Runtime>() -> MyPlugin<R> { MyPlugin { phantom: std::marker::PhantomData, } }
3. Register Commands
rustimpl<R: Runtime> MyPlugin<R> { pub fn commands() -> Vec<Box<dyn tauri::command::CommandItem<R>>> { vec![ tauri::command::CommandItem::new(my_command) ] } }
4. Frontend API
src-tauri/plugins/my-plugin/src-js/index.ts:
typescriptimport { invoke } from '@tauri-apps/api/tauri'; export async function myCommand(name: string): Promise<string> { return invoke('plugin:my_plugin|my_command', { name }); }
5. Use Plugin
Configure in tauri.conf.json:
json{ "plugins": { "my_plugin": { "enabled": true, "config": {} } } }
Common Official Plugins
tauri-plugin-clipboard
typescriptimport { writeText, readText } from 'tauri-plugin-clipboard-api'; await writeText('Hello'); const text = await readText();
tauri-plugin-fs-extra
typescriptimport { copyFile, moveFile } from 'tauri-plugin-fs-extra-api'; await copyFile('src.txt', 'dest.txt');
tauri-plugin-store
typescriptimport Store from 'tauri-plugin-store-api'; const store = new Store('.settings.dat'); await store.set('key', 'value'); const value = await store.get('key');
tauri-plugin-sql
typescriptimport Database from 'tauri-plugin-sql-api'; const db = await Database.load('sqlite:test.db'); const result = await db.select('SELECT * FROM users');
Plugin Best Practices
- Error Handling: Use
Resulttype for error handling - Async Operations: Use
async/awaitfor time-consuming operations - Type Safety: Use TypeScript to ensure type safety
- Complete Documentation: Provide clear API documentation and usage examples
- Test Coverage: Write unit tests and integration tests
Publishing Plugins
bash# Publish to crates.io cd src-tauri/plugins/my-plugin cargo publish # Publish to npm cd src-tauri/plugins/my-plugin/src-js npm publish
Community Plugins
The Tauri community provides a rich collection of plugins, which can be found in awesome-tauri.