skills/tencentblueking/bk-ci/frontend-vue-development

frontend-vue-development

SKILL.md

前端 Vue 开发

Quick Reference

技术栈:Vue 2.7 + Vuex 3.6 + Vue Router 3.6 + bk-magic-vue 2.5
文件命名:kebab-case.vue(如 group-table.vue)
缩进:4 空格 | 无分号 | 无拖尾逗号 | HTML 双引号
API 调用:vue.$ajax.get/post/put/delete

最简示例

<template>
    <div class="pipeline-list">
        <bk-table :data="pipelines" v-loading="isLoading">
            <bk-table-column prop="name" label="名称"></bk-table-column>
        </bk-table>
    </div>
</template>

<script>
export default {
    data() {
        return {
            pipelines: [],
            isLoading: false
        }
    },
    created() {
        this.fetchPipelines()
    },
    methods: {
        async fetchPipelines() {
            this.isLoading = true
            try {
                const res = await this.$ajax.get('/api/user/pipelines')
                this.pipelines = res.data || []
            } finally {
                this.isLoading = false
            }
        }
    }
}
</script>

<style lang="scss" scoped>
.pipeline-list {
    padding: 20px;
}
</style>

When to Use

  • 开发 Vue 组件
  • 管理 Vuex 状态
  • 调用后端 API
  • 处理页面交互

When NOT to Use

  • 后端 API 开发 → 使用 01-backend-microservice-development
  • 构建机 Agent → 使用 05-go-agent-development

前端应用结构

src/frontend/
├── devops-pipeline/      # 流水线应用
├── devops-atomstore/     # 研发商店应用
├── devops-manage/        # 管理应用
├── bk-pipeline/          # 流水线组件库
└── bk-permission/        # 权限组件库

ESLint 核心规则

{
    'indent': ['error', 4],                // 4 空格缩进
    'semi': ['error', 'never'],            // 禁用分号
    'comma-dangle': ['error', 'never'],    // 禁用拖尾逗号
    'vue/html-quotes': ['error', 'double'],// HTML 双引号
    'vue/no-v-html': 'error',              // 禁止 v-html(防 XSS)
    'no-console': 'error'                  // 禁止 console
}

组件选项顺序

export default {
    components: { },  // 1. 组件注册
    mixins: [ ],      // 2. 混入
    props: { },       // 3. Props
    data() { },       // 4. 响应式数据
    computed: { },    // 5. 计算属性
    watch: { },       // 6. 侦听器
    created() { },    // 7. 生命周期钩子
    mounted() { },
    methods: { }      // 8. 方法
}

Props 定义

props: {
    resourceType: {
        type: String,
        default: ''
    },
    options: {
        type: Array,
        default: () => []  // 对象/数组使用工厂函数
    }
}

API 调用模式

// GET
this.$ajax.get(`${prefix}/user/pipelines`)

// POST
this.$ajax.post(`${prefix}/user/pipelines`, data)

// 错误处理
this.$ajax.get(url)
    .then(res => this.data = res.data)
    .catch(err => {
        if ([404, 403].includes(err.code)) {
            this.errorCode = err.code
        }
    })
    .finally(() => this.isLoading = false)

Vuex 使用

// store/pipeline.js
export const actions = {
    getPipelineList({ commit }, { projectId }) {
        return vue.$ajax.get(`/api/user/projects/${projectId}/pipelines`)
    }
}

// 组件中使用
import { mapActions } from 'vuex'

methods: {
    ...mapActions('pipeline', ['getPipelineList']),
    async fetchData() {
        this.list = await this.getPipelineList({ projectId: this.projectId })
    }
}

方法命名约定

类型 命名模式 示例
事件处理 handle* handleClick()
初始化 init* initData()
格式化 *Formatter statusFormatter()

Checklist

开发组件前确认:

  • 文件命名使用 kebab-case
  • 遵循 ESLint 规则(4 空格、无分号)
  • Props 使用完整定义(type + default)
  • 对象/数组 Props 使用工厂函数
  • 禁止使用 v-html
  • 使用 scoped 样式
Weekly Installs
16
First Seen
3 days ago
Installed on
claude-code10
gemini-cli9
windsurf8
opencode8
codex8
antigravity8