mcpField
V
vue-best-practices

vue-best-practices

github.com/ejirocodesDevelopment6284 installsUpdated 18w ago
Repository

About vue-best-practices

vue-best-practices is a reference skill for developers working with Vue 3. It organizes guidance on TypeScript, components, tooling, testing, and common mistakes, including Vue 3.5 patterns.

Key features

  1. 01TypeScript and component typing
  2. 02Volar and IDE configuration
  3. 03Vue component patterns
  4. 04Tooling and HMR guidance
  5. 05Pinia and router testing
  6. 06Common mistake prevention

Use cases

  1. 01Choosing patterns for reactive props
  2. 02Typing Vue component props
  3. 03Configuring Volar templates
  4. 04Setting up Pinia store tests

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/ejirocodes/agent-skills --skill vue-best-practices

After installing, type/vue-best-practicesin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
components.md
testing.md
tooling.md
typescript.md
volar.md

Details

From the project README

Vue 3 Best Practices

Quick Reference

TopicWhen to UseReference
TypeScriptProps extraction, generic components, useTemplateRef, JSDoc, reactive props destructuretypescript.md
VolarIDE config, strictTemplates, CSS modules, directive comments, Volar 3.0 migrationvolar.md
ComponentsdefineModel, deep watch, onWatcherCleanup, useId, deferred teleportcomponents.md
ToolingmoduleResolution, HMR SSR, duplicate plugin detectiontooling.md
TestingPinia store mocking, setup stores, Vue Router typed paramstesting.md

Essential Patterns

Extract Component Props
import type { ComponentProps } from 'vue-component-type-helpers'
import MyButton from './MyButton.vue'

type Props = ComponentProps<typeof MyButton>
Reactive Props Destructure (Vue 3.5+)
<script setup lang="ts">
// Destructured props are reactive - preferred in Vue 3.5+
const { name, count = 0 } = defineProps<{ name: string; count?: number }>()
</script>
useTemplateRef (Vue 3.5+)
<script setup lang="ts">
import { useTemplateRef, onMounted } from 'vue'

const inputRef = useTemplateRef('input')  // Auto-typed
onMounted(() => inputRef.value?.focus())
</script>
<template><input ref="input" /></template>
onWatcherCleanup (Vue 3.5+)
import { watch, onWatcherCleanup } from 'vue'

watch(query, async (q) => {
  const controller = new AbortController()
  onWatcherCleanup(() => controller.abort())
  await fetch(`/api?q=${q}`, { signal: controller.signal })
})
defineModel with Required
// Returns Ref<Item> instead of Ref<Item | undefined>
const model = defineModel<Item>({ required: true })
Deep Watch with Numeric Depth
// Vue 3.5+ - watch array mutations without full traversal
watch(items, handler, { deep: 1 })
Pinia Store Test Setup
import { createTestingPinia } from '@pinia/testing'
import { vi } from 'vitest'

mount(Component, {
  global: {
    plugins: [createTestingPinia({ createSpy: vi.fn })]
  }
})

Common Mistakes

  1. Using InstanceType<typeof Component>['$props'] - Use ComponentProps instead
  2. Missing createSpy in createTestingPinia - Required in @pinia/testing 1.0+
  3. Using withDefaults with union types - Use Reactive Props Destructure
  4. strictTemplates in wrong tsconfig - Add to tsconfig.app.json, not root
  5. ts_ls with Volar 3.0 - Use vtsls instead (Neovim)
  6. deep: true on large structures - Use numeric depth for performance
  7. Watching destructured props directly - Wrap in getter: watch(() => count, ...)
  8. Random IDs in SSR - Use useId() for hydration-safe IDs

Comments

Markdown supported