Token导航 LogoToken导航

Agent Skill · 开发规范

vue3-best-practices(vue3 最佳实践)

用于辅助前端页面、组件、样式和交互逻辑的开发与维护。它适合让 Agent 生成或审查 React、Next.js、Vue、Tailwind、CSS 等相关代码,整理组件结构,或定位布局和性能问题。使用时需要结合项目现有设计系统、路由和构建方式,避免只生成孤立片段;涉及页面改动时,应配合本地预览和构建检查确认视觉效果。

vue3-best-practices 是开发规范类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描已通过,按安装量在开发规范类的 1,265 个 Skill 里排第 1,096。

总安装 242周安装 10GitHub Stars 公开资料未说明下载 79核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:vue3-best-practices(vue3 最佳实践)
来源仓库:https://github.com/protagonistss/ithinku-plugins
仓库路径:skills/vue3-best-practices
安装命令:
npx skills add https://github.com/protagonistss/ithinku-plugins --skill vue3-best-practices
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/protagonistss/ithinku-plugins --skill vue3-best-practices

这个 Skill 是做什么的

开发规范类 Skill 用来统一代码风格、目录结构和评审口径,产出多为检查清单或改写建议。

用于 Vue 3 开发最佳实践的参考与支持。vue3-best-practices 属于开发规范类 Skill,可作为该场景下的辅助能力补充。适合查找 Vue 3 项目的现代化开发模式和优化方案。可协助获取 Composition API、TypeScript 集成等最佳实践。

建议结合 Vue 3 新特性和项目实际需求进行选择。安装方式:通过 GitHub 仓库安装,适用于 Claude 等宿主。

来源仓库内路径:skills/vue3-best-practices

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/protagonistss/ithinku-plugins --skill vue3-bes…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

vue3-best-practices 怎么安装?

在终端执行 npx skills add https://github.com/protagonistss/ithinku-plugins --skill vue3-best-practice…。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

vue3-best-practices 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

vue3-best-practices 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

vue3-best-practices 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

vue3-best-practices 用的人多吗?

公开数据是累计安装 242 次,近一周安装 10 次,下载 79 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

vue3-best-practices 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发规范类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发规范类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
vercel-react-best-practices

Vercel React 最佳实践 · Codex、Claude

8,490,72025,918操作浏览器MIT通过
web-design-guidelines

网页设计指南 · Codex、Claude

6,686,01625,885需要联网MIT有提醒
remotion-best-practices

Remotion 最佳实践 · Codex、Claude

6,505,6323,027操作浏览器MIT有提醒
supabase-postgres-best-practices

Supabase Postgres 最佳实践 · Codex、Claude

3,175,5232,030需要联网MIT通过
next-best-practices

Next.js 最佳实践 · Codex、Claude

1,848,240841操作浏览器MIT通过
vue3-best-practices

vue3 最佳实践 · 本页

242—需要联网未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Vue 3 Best Practices

🌟 技能核心

本技能指导开发者编写 模块化、类型安全、高性能 的 Vue 3 应用。

核心原则:

  • Composition API First
  • 逻辑复用 (Composables)
  • 类型推导优先
  • 单一数据流

📁 推荐项目结构

src/
├── assets/              # 静态资源
├── components/          # 通用组件
│   ├── ui/              # 基础 UI 组件
│   └── business/        # 业务组件
├── composables/         # 组合式函数 (use*.ts)
├── stores/              # Pinia stores
├── views/               # 页面组件
├── router/              # 路由配置
├── types/               # TypeScript 类型定义
├── utils/               # 工具函数
├── api/                 # API 请求封装
└── App.vue

命名规范:

类型规范示例
组件PascalCaseUserProfile.vue
ComposablescamelCase + use 前缀useAuth.ts
StorescamelCase + Store 后缀userStore.ts
工具函数camelCaseformatDate.ts

🧠 核心原则

1. Script Setup 与 Composition API

<script setup lang="ts">
// ✅ 推荐:显式导入,利于代码阅读和依赖追踪
import { ref, computed, watch, onMounted } from 'vue'
import { useUserStore } from '@/stores/userStore'

// 顶层 await 支持
const data = await fetchInitialData()

// 响应式状态
const count = ref(0)
const doubled = computed(() => count.value * 2)

// Store 使用
const userStore = useUserStore()
</script>

要点:

  • 默认使用 <script setup lang="ts">,更简洁,运行时性能更好
  • 支持顶层 await
  • 显式导入 ref, computed, watch 等(而非依赖自动导入)

2. 响应式数据 (Reactivity)

场景推荐原因
基本类型ref清晰的 .value 访问
对象/数组(默认)reactive更直观;解构需 toRefs
需要整体替换/可空对象ref便于赋新对象与类型约束
深层嵌套大对象reactive仅当不解构时使用
大型外部实例shallowRef避免不必要的深度响应
// ✅ 推荐
const user = ref<User | null>(null)
user.value = { name: 'John' }

// ⚠️ 谨慎使用 reactive
const state = reactive({ items: [] })
// 解构会丢失响应性!
const { items } = state // ❌ items 不再是响应式

// ✅ 使用 toRefs 解构
const { items } = toRefs(state)

3. 组件通信

Props 定义(带默认值)
// Vue 3.5+ 推荐写法
const { title, count = 0 } = defineProps<{
  title: string
  count?: number
}>()

// Vue 3.4 及以下
const props = withDefaults(defineProps<{
  title: string
  count?: number
}>(), {
  count: 0
})

注意:解构式 props 需要 Vue 3.5+(或编译选项 propsDestructure: true)。否则解构结果非响应式,建议使用 withDefaults 或保留 props.xxx 访问。

Emits 定义
const emit = defineEmits<{
  change: [id: number]
  update: [value: string]
}>()

// 使用
emit('change', 123)
v-model(Vue 3.4+)
// 简化双向绑定
const modelValue = defineModel<string>()
const count = defineModel<number>('count', { default: 0 })
Slots 类型化
defineSlots<{
  default: (props: { item: Item }) => any
  header: () => any
}>()
Expose
// 暴露给父组件的方法/属性
defineExpose({
  focus: () => inputRef.value?.focus(),
  reset
})

4. 组件命名 (defineOptions)

递归组件、调试、DevTools 中必须显式命名:

defineOptions({
  name: 'TreeNode',      // 递归组件必须
  inheritAttrs: false    // 禁用属性自动透传
})

何时需要命名:

场景必要性
递归组件⭐ 必须
DevTools 调试推荐
KeepAlive include/exclude必须
Transition 组件推荐

5. 属性透传 (inheritAttrs)

<script setup lang="ts">
defineOptions({ inheritAttrs: false })

// 获取透传的属性
const attrs = useAttrs()
</script>

<template>
  <!-- 手动绑定到内部元素 -->
  <div class="wrapper">
    <input v-bind="attrs" />
  </div>
</template>

6. 泛型组件(Vue 3.3+)

<script setup lang="ts" generic="T extends { id: number }">
defineProps<{
  items: T[]
  selected?: T
}>()

const emit = defineEmits<{
  select: [item: T]
}>()
</script>

🧩 逻辑复用 (Composables)

基本模式

// composables/useCounter.ts
import { ref, computed } from 'vue'

export function useCounter(initial = 0) {
  const count = ref(initial)
  const doubled = computed(() => count.value * 2)

  function increment() {
    count.value++
  }

  function reset() {
    count.value = initial
  }

  return {
    count,
    doubled,
    increment,
    reset
  }
}

带异步请求的 Composable

// composables/useFetch.ts
import { ref, shallowRef, watchEffect, toValue, type MaybeRefOrGetter } from 'vue'

export function useFetch<T>(url: MaybeRefOrGetter<string>) {
  const data = shallowRef<T | null>(null)
  const error = shallowRef<Error | null>(null)
  const loading = ref(false)

  async function execute() {
    loading.value = true
    error.value = null
    try {
      const res = await fetch(toValue(url))
      data.value = await res.json()
    } catch (e) {
      error.value = e as Error
    } finally {
      loading.value = false
    }
  }

  watchEffect(() => {
    execute()
  })

  return { data, error, loading, refresh: execute }
}

注意:MaybeRefOrGetter/toValue 需要 Vue 3.3+。低版本可用 unref 或改为仅接收 Ref。

最佳实践:

  • ✅ 以 use 开头命名
  • ✅ 返回对象包含响应式状态和方法
  • ✅ 优先使用 VueUse 已有工具
  • ❌ 不要在 Composable 中使用 this

📦 状态管理 (Pinia)

Setup Store(推荐)

// stores/userStore.ts
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useUserStore = defineStore('user', () => {
  // State
  const user = ref<User | null>(null)
  const token = ref('')

  // Getters
  const isLoggedIn = computed(() => !!token.value)
  const displayName = computed(() => user.value?.name ?? 'Guest')

  // Actions
  async function login(credentials: LoginDTO) {
    const res = await api.login(credentials)
    user.value = res.user
    token.value = res.token
  }

  function logout() {
    user.value = null
    token.value = ''
  }

  return {
    user,
    token,
    isLoggedIn,
    displayName,
    login,
    logout
  }
})

要点:

  • 优先使用 Setup Store,与组件写法一致
  • State 保持扁平化
  • Getters = computed
  • Actions 处理同步/异步逻辑

🚫 反模式对照表

❌ 错误做法✅ 正确做法
使用 Mixins使用 Composables
const {prop} = props 解构props.prop 或 toRefs(props)
在 setup 中写 created 逻辑直接写在 setup 顶层
忘记 .value始终在 script 中使用 .value
reactive 后解构使用 ref 或 toRefs
Options API 混用统一使用 Composition API

⚡ 性能优化

技术场景示例
v-memo大型列表/表格v-memo="[item.id, item.selected]"
shallowRef大型外部实例地图、图表实例
KeepAlive缓存组件标签页切换
路由懒加载所有路由() => import('./Page.vue')
defineAsyncComponent条件渲染组件模态框、抽屉
// 路由懒加载
const routes = [
  {
    path: '/dashboard',
    component: () => import('@/views/Dashboard.vue')
  }
]

// 异步组件
const HeavyModal = defineAsyncComponent(() =>
  import('./HeavyModal.vue')
)

🛠️ 技术栈推荐

分类推荐
构建工具Vite
路由Vue Router 4
状态管理Pinia
UI 组件库Element Plus / Naive UI / Ant Design Vue
样式方案UnoCSS / Tailwind CSS
测试Vitest + Vue Test Utils
工具库VueUse

🔄 迁移指南:Options → Composition

Options APIComposition API
data()ref() / reactive()
computed: {}computed()
methods: {}普通函数
watch: {}watch() / watchEffect()
created<script setup> 顶层代码
mountedonMounted()
this.xxx直接访问变量

🐛 常见错误排查

问题原因解决
数据不更新忘记 .value检查 ref 访问
解构后不响应reactive 解构使用 toRefs()
computed 不执行未访问 .value确保访问响应式依赖
watch 不触发监听了原始值使用 getter 函数
Props 类型错误缺少类型定义添加泛型类型

📂 示例文件

本技能包含以下完整示例,位于 examples/ 目录:

文件说明
component-example.vue递归树形组件,展示 defineOptions 命名、插槽透传
composable-example.tsusePagination 分页逻辑封装
store-example.tsPinia Setup Store 完整示例

🎨 常用指令示例

# 生成 Composable
/vue-coder 提取这段逻辑为一个名为 usePagination 的 Composable 函数。

# 转换 Options API
/vue-coder 将这个 Options API 组件重构为 <script setup lang="ts"> 写法。

# 优化响应式
/vue-coder 检查这段代码中 reactive 的使用是否合理,建议改为 ref。

# 添加类型
/vue-coder 为这个组件的 props 和 emits 添加完整的 TypeScript 类型。

# 性能优化
/vue-coder 分析这个列表组件的性能问题,建议优化方案。

平台分布

Codex

34.27%
按下载量换算27

Claude

30.73%
按下载量换算24

Cursor

19.62%
按下载量换算15

Gemini CLI

9.45%
按下载量换算7

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills