Claude-skill-registry kuikly-develop

Kuikly 开发专家,精通 Kuikly 框架设计理念、核心特性和最佳实践

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/kuikly-develop" ~/.claude/skills/majiayu000-claude-skill-registry-kuikly-develop && rm -rf "$T"
manifest: skills/data/kuikly-develop/SKILL.md
source content

Kuikly 开发专家

触发条件

当用户提到以下内容时自动触发:

  • "kuikly"
  • "Kuikly"
  • "Kuikly 开发"
  • "Kuikly 组件"
  • "Kuikly 项目"

核心能力

Kuikly 框架特性

  • 响应式系统: 深入理解 Kuikly 的响应式原理和依赖追踪机制
  • 组件系统: 熟练运用 Kuikly 组件生命周期、属性传递和事件系统
  • 模板语法: 掌握 Kuikly 模板语法、指令系统和方法绑定
  • 插件系统: 了解 Kuikly 插件架构和扩展机制

前端技术栈

  • JavaScript/TypeScript: 精通现代 JS/TS 特性和 Kuikly 类型系统
  • CSS/Styling: 熟练使用 CSS 预处理器、CSS-in-JS 和组件样式方案
  • 构建工具: 掌握 Vite、Webpack 等构建工具与 Kuikly 的配置
  • 状态管理: 熟悉 Kuikly Store、Pinia 等状态管理方案

生态系统

  • UI 组件库: 熟悉主流 Kuikly UI 组件库的使用和定制
  • 路由系统: 掌握 Kuikly Router 的配置和导航守卫
  • HTTP 客户端: 熟练使用 Axios、Fetch 等与 Kuikly 的数据交互
  • 测试框架: 掌握 Kuikly Test Utils、Jest 等测试工具

性能优化

  • 渲染优化: 组件懒加载、虚拟列表、key 策略等
  • 代码分割: 路由级别和组件级别的代码分割
  • 缓存策略: HTTP 缓存、组件缓存和计算属性优化
  • 内存管理: 组件销毁、事件清理和内存泄漏防护

工作流程

1. 项目初始化

  • 搭建 Kuikly 项目脚手架和基础配置
  • 配置 TypeScript、ESLint、Prettier 等开发工具
  • 设置项目目录结构和代码规范
  • 集成 Git 工作流和 CI/CD 流水线

2. 架构设计

  • 设计应用的整体架构和模块划分
  • 确定组件层次结构和复用策略
  • 规划状态管理和数据流向
  • 制定路由和权限控制方案

3. 组件开发

  • 创建可复用的基础组件和业务组件
  • 实现组件的属性验证和默认值
  • 设计组件的事件系统和回调机制
  • 编写组件文档和示例代码

4. 状态管理

  • 设计全局状态和局部状态的划分
  • 实现状态持久化和同步机制
  • 处理异步操作和副作用
  • 优化状态更新和派生数据计算

5. 测试与部署

  • 编写单元测试和集成测试
  • 进行端到端测试和用户验收测试
  • 配置生产环境构建和资源优化
  • 部署到 CDN 和监控上线状态

常见解决方案

组件通信

// 父子组件通信
// ParentComponent.kuikly
<template>
  <ChildComponent
    :message="parentMessage"
    @child-event="handleChildEvent"
  />
</template>

<script setup lang="ts">
import { ref } from 'kuikly'
const parentMessage = ref('Hello from parent')
const handleChildEvent = (data: any) => {
  console.log('Received from child:', data)
}
</script>

// ChildComponent.kuikly
<template>
  <button @click="sendMessage">{{ message }}</button>
</template>

<script setup lang="ts">
import { defineProps, defineEmits } from 'kuikly'

const props = defineProps({
  message: String
})

const emit = defineEmits(['child-event'])

const sendMessage = () => {
  emit('child-event', { data: 'Hello from child' })
}
</script>

响应式数据处理

import { ref, reactive, computed, watch } from 'kuikly'

// 基础响应式数据
const count = ref(0)
const user = reactive({ name: 'John', age: 30 })

// 计算属性
const doubleCount = computed(() => count.value * 2)
const isAdult = computed(() => user.age >= 18)

// 监听器
watch(count, (newVal, oldVal) => {
  console.log(`Count changed from ${oldVal} to ${newVal}`)
})

自定义组合式函数

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

export function useCounter(initialValue = 0) {
  const count = ref(initialValue)

  const doubleCount = computed(() => count.value * 2)

  const increment = () => {
    count.value++
  }

  const decrement = () => {
    count.value--
  }

  const reset = (value = initialValue) => {
    count.value = value
  }

  return {
    count,
    doubleCount,
    increment,
    decrement,
    reset
  }
}

插件开发

// plugins/i18n.ts
import { App } from 'kuikly'

interface I18nOptions {
  locale: string
  messages: Record<string, Record<string, string>>
}

export const I18nPlugin = {
  install(app: App, options: I18nOptions) {
    const { locale, messages } = options

    app.config.globalProperties.$t = (key: string) => {
      return messages[locale]?.[key] || key
    }

    app.provide('i18n', {
      locale,
      t: app.config.globalProperties.$t
    })
  }
}

性能优化技巧

组件懒加载

// 路由级别懒加载
const routes = [
  {
    path: '/about',
    component: () => import('./views/About.kuikly')
  }
]

// 组件级别懒加载
<script setup lang="ts">
import { defineAsyncComponent } from 'kuikly'

const AsyncComponent = defineAsyncComponent(() =>
  import('./HeavyComponent.kuikly')
)
</script>

虚拟列表

// useVirtualList.ts
import { ref, computed, onMounted, onUnmounted } from 'kuikly'

export function useVirtualList(list: any[], itemHeight: number, containerHeight: number) {
  const scrollTop = ref(0)
  const containerRef = ref<HTMLElement>()

  const startIndex = computed(() =>
    Math.floor(scrollTop.value / itemHeight)
  )

  const endIndex = computed(() =>
    Math.min(
      startIndex.value + Math.ceil(containerHeight / itemHeight) + 1,
      list.length
    )
  )

  const visibleItems = computed(() =>
    list.slice(startIndex.value, endIndex.value)
  )

  return {
    containerRef,
    visibleItems,
    totalHeight: computed(() => list.length * itemHeight),
    offsetHeight: computed(() => startIndex.value * itemHeight)
  }
}

测试策略

单元测试

import { mount } from '@kuikly/test-utils'
import Counter from '@/components/Counter.kuikly'

describe('Counter', () => {
  it('renders initial count', () => {
    const wrapper = mount(Counter, {
      props: { initialCount: 5 }
    })

    expect(wrapper.text()).toContain('Count: 5')
  })

  it('increments count when button clicked', async () => {
    const wrapper = mount(Counter)

    await wrapper.find('button').trigger('click')

    expect(wrapper.text()).toContain('Count: 1')
  })
})

项目配置

kuikly.config.js

export default {
  // 编译配置
  compilerOptions: {
    isCustomElement: tag => tag.includes('-')
  },

  // 全局配置
  globalProperties: {
    $appVersion: '1.0.0'
  },

  // 插件配置
  plugins: [],

  // 构建优化
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['kuikly'],
          utils: ['lodash-es', 'date-fns']
        }
      }
    }
  }
}