clerk-vue-patterns について
Vue 3 で `@clerk/vue` v2 以降を使うコーディングエージェント向けのリファレンススキルです。Clerk のコンポーザブル、Vue Router のガード、Pinia 連携を説明し、Nuxt には別のスキルを案内します。
主な機能
- 01認証とユーザーのコンポーザブルを解説
- 02組織向けコンポーザブルを網羅
- 03Vue Router のナビゲーションガードを案内
- 04Pinia の認証状態連携を説明
- 05Vue と Nuxt の使い分けを説明
活用シーン
- 01Vue でリアクティブなサインイン状態を読む
- 02Vue Router のナビゲーションをガード
- 03Clerk の認証状態を Pinia に連携
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ clerk/ skills --skill clerk-vue-patternsインストール後、Claude Code で/clerk-vue-patternsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/composables.mdpinia-integration.mdvue-router-guards.mdtemplates/vue-basic-auth/index.htmlpackage.jsonvite.config.tstemplates/vue-basic-auth/src/App.vuemain.tsstyle.css詳細
Vue のパターン
SDK:@clerk/vue v2 以降(Vue 3)。Nuxt では clerk-nuxt-patterns を使用してください。
必要な情報を選んでください
| タスク | リファレンス |
|---|---|
| コンポーザブル:useAuth、useUser、useOrganization | references/composables.md |
| Vue Router のナビゲーションガード | references/vue-router-guards.md |
| 認証状態を持つ Pinia ストア | references/pinia-integration.md |
基本的な考え方
Vue では @clerk/vue のコンポーザブルを使用します。
useAuth()— リアクティブなisSignedIn、userId、signOutuseUser()— リアクティブなuserオブジェクトuseClerk()— 高度な操作に使用する完全な Clerk インスタンスuseOrganization()— リアクティブなorganization、membership
セットアップ
Vue(プレーン)
// main.ts
import { clerkPlugin } from '@clerk/vue'
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
app.use(clerkPlugin, {
publishableKey: import.meta.env.VITE_CLERK_PUBLISHABLE_KEY,
})
app.mount('#app')
コンポーザブルの使用方法
<script setup lang="ts">
import { useAuth, useUser } from '@clerk/vue'
const { isSignedIn, userId, signOut } = useAuth()
const { user } = useUser()
</script>
<template>
<div v-if="isSignedIn">
<p>Hello {{ user?.firstName }}</p>
<button @click="signOut()">Sign Out</button>
</div>
<SignInButton v-else />
</template>
組織の切り替え
<script setup lang="ts">
import { useOrganizationList } from '@clerk/vue'
const { userMemberships, setActive } = useOrganizationList()
</script>
<template>
<button
v-for="mem in userMemberships.data ?? []"
:key="mem.organization.id"
@click="setActive({ organization: mem.organization.id })"
>
{{ mem.organization.name }}
</button>
</template>
よくある落とし穴
| 症状 | 原因 | 修正方法 |
|---|---|---|
コンポーザブルが undefined を返す | ClerkProvider ツリーの外で使用している | app.use(clerkPlugin, { publishableKey }) が呼び出されていることを確認してください |
userId はリアクティブだが更新されない | 分割代入によってリアクティビティが失われる | const { userId } = useAuth() を使用してください(toRefs スタイルのコンポーザブルで、リアクティブです) |
インポート一覧
| 対象 | インポート |
|---|---|
| コンポーザブル | @clerk/vue |
| プラグインのセットアップ | @clerk/vue |
| コンポーネント | @clerk/vue |
関連項目
clerk-setup- Clerk の初期インストールclerk-custom-ui- カスタムフローと外観clerk-orgs- B2B 組織
ドキュメント
コメント
Markdown 対応