rust-fullstack について
Rust Full-Stack Web Development Patterns は、Rust で Web アプリケーションを構築する開発者向けのスキルです。Leptos のフロントエンド、Axum と SQLx のバックエンド、PostgreSQL に加え、認証、状態管理、API リクエスト、テナントルーティングのパターンを扱います。
主な機能
- 01Tailwind CSS と DaisyUI を使う Leptos フロントエンド
- 02Axum と SQLx のバックエンドパターン
- 03JWT アクセストークンとリフレッシュトークンの流れ
- 04フロントエンド状態と TTL ベースのキャッシュ
- 05API の再試行処理とテナントルーティング
- 06PostgreSQL のクエリと列挙型
活用シーン
- 01Rust のフルスタック Web アプリを構成
- 02Cookie ベースの JWT 認証を実装
- 03API のレート制限と 401 再試行に対応
- 04テナントのサブドメインでリクエストを振り分け
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ daiki48/ dotfiles --skill rust-fullstackインストール後、Claude Code で/rust-fullstackを入力して読み込まれたか確認します。
詳細
Rust フルスタック Web 開発パターン
技術スタック
| レイヤー | 技術 |
|---|---|
| フロントエンド | Leptos(Rust→WASM CSR)、Tailwind CSS + DaisyUI |
| バックエンド | Axum、SQLx(コンパイル時にクエリをチェック) |
| データベース | PostgreSQL |
| ビルド | Trunk(WASM)、Docker、Makefile |
JWT デュアルトークン認証
Access Token (short-lived) → API request auth
Refresh Token (long-lived) → Access token renewal
- HTTP-only Cookie に保存(XSS 対策)
- バックエンド:トークンの検証
- フロントエンド:401 時に自動で再試行
// Backend: Cookie setup
let cookie = format!(
"access_token={}; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age={}",
token, 900 // 15 min
);
// Frontend: 401 retry
if response.status() == 401 {
refresh_token().await?;
// Retry original request
}
フロントエンドの状態管理
provide_context(AuthContext::new());
provide_context(AppCache::new()); // TTL-based cache
provide_context(ToastContext::new());
// localStorage for preferences
let stored = window().local_storage()?.get_item("preferences")?;
API クライアントパターン
// Rate limiting (429) handling
async fn fetch_with_retry<T>(request: impl Fn() -> Future<T>) -> Result<T> {
loop {
match request().await {
Err(e) if e.status() == 429 => {
let delay = e.retry_after().unwrap_or(1000);
sleep(delay).await;
}
result => return result,
}
}
}
// Token refresh queue (prevent multiple refreshes)
static REFRESH_LOCK: OnceCell<RwLock<()>> = OnceCell::new();
マルチテナントのルーティング
{tenant}.example.com → Tenant identification
fn extract_subdomain(host: &str) -> Option<String> {
let parts: Vec<&str> = host.split('.').collect();
(parts.len() >= 3).then(|| parts[0].to_string())
}
async fn check_tenant_access(claims: &Claims, subdomain: &str) -> Result<(), AppError> {
// Verify user has access to this tenant
}
データベース
// SQLx compile-time query checking
let user = sqlx::query_as!(
User,
r#"SELECT id, name, role as "role: UserRole" FROM users WHERE id = $1"#,
id
).fetch_one(&pool).await?;
// PostgreSQL ENUMs
#[derive(sqlx::Type)]
#[sqlx(type_name = "user_role", rename_all = "PascalCase")]
pub enum UserRole { Admin, AreaManager, ServiceStation }
よく使うコマンド
make dev # Start local environment
make fmt # Format (cargo fmt + leptosfmt)
make lint # Clippy checks
make test # Run tests
make migrate-run # Apply migrations
開発メモ
| 項目 | 値 |
|---|---|
| バックエンドのポート | 3000 |
| ローカルサブドメイン | lvh.me(127.0.0.1 に解決されます) |
| 環境ファイル | .env.development、.env.staging、.env.production |
| 必須の環境変数 | DATABASE_URL、JWT_SECRET、APP_ENV |
関連スキル
leptos-guide- Leptos フロントエンドaxum-guide- Axum バックエンドsqlx-postgres- SQLx + PostgreSQL
コメント
Markdown 対応