乐闻世界logo
搜索文章和话题

How does the Tauri plugin system work

2月19日 19:16

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

bash
cargo create-tauri-plugin --name my-plugin

2. Rust Implementation

src-tauri/plugins/my-plugin/src/lib.rs:

rust
use 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

rust
impl<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:

typescript
import { 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

typescript
import { writeText, readText } from 'tauri-plugin-clipboard-api'; await writeText('Hello'); const text = await readText();

tauri-plugin-fs-extra

typescript
import { copyFile, moveFile } from 'tauri-plugin-fs-extra-api'; await copyFile('src.txt', 'dest.txt');

tauri-plugin-store

typescript
import 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

typescript
import 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

  1. Error Handling: Use Result type for error handling
  2. Async Operations: Use async/await for time-consuming operations
  3. Type Safety: Use TypeScript to ensure type safety
  4. Complete Documentation: Provide clear API documentation and usage examples
  5. 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.

标签:Tauri