my-coding-style
编程规范
代码组织
- 单一职责:每个源文件应具有清晰、聚焦的作用域/目的
- 拆分大文件:当文件过大或处理过多关注点时应拆分
- 常量抽取:将常量移动到专用的
constants.js文件 - 环境变量统一:编程时若涉及到环境变量部分的代码,必须统一从前后端各自的
.env.*中读取 - UTF-8 编码:使用
UTF-8编码,若遇到携带BOM标记的文件,则必须移除BOM以避免编码出现问题,如果文件中出现乱码,需要及时检测并修复编码问题
JavaScript
- 使用 ES6+ 特性:优先采用现代 JavaScript 语法与特性
- JSDoc 规范:严格遵守 JSDoc 注释规范,记录函数参数、返回值与复杂逻辑
TypeScript
- 显式返回类型:尽可能显式声明返回类型
- 避免复杂内联类型:将复杂类型提取为独立的
type或interface声明 - 类型分离:当使用 TypeScript 时,始终将类型与接口分离到
types.ts或types/*.ts - TSDoc 规范 :严格遵守 TSDoc 注释规范,记录函数参数、返回值与复杂逻辑
注释
- 中文注释:尽可能遵守中文注释规范,以便开发者更好地理解
- 清晰简洁:注释应当简明扼要,避免冗长
- 解释“为什么”而非“怎么做”:注释应描述理由或意图,而非代码行为
测试(Vitest)
- 测试文件命名:
foo.js→foo.test.js(同目录) - 使用
describe/itAPI(不使用test) - 对复杂输出使用
toMatchSnapshot - 对语言特定快照使用带显式路径的
toMatchFileSnapshot
前端样式(Sass、UnoCss)
- UnoCSS 优先:Sass 仅在 UnoCSS 无法满足需求时使用
- BEM 命名:当使用 Sass 时,采用 BEM 命名约定
包管理器(pnpm)
- 统一使用 pnpm:前后端项目均使用 pnpm 作为包管理器
- 独立的依赖管理:前后端项目应维护自己的依赖列表,避免全局依赖冲突
- 禁止使用 .pnpm-store:禁止在项目中生成和使用 pnpm 的全局存储目录
.pnpm-store
应用开发
框架选择
| 使用场景 | 选择 |
|---|---|
| 前端 | Vite + Vue3 |
| 后端 | Nestjs + Prisma ORM v7 + PostgreSQL |
Vue 约定
| 约定 | 偏好 |
|---|---|
| Script 语法 | 始终使用 <script setup> |
| JavaScript | 优先使用现代 JavaScript 语法,而非 TypeScript |
| 状态 | 优先 shallowRef() 而非 ref() |
| 对象 | 使用 ref(),避免 reactive() |
| Vue 路由 | Vue Router |
| UI 组件库 | Element Plus |
| 样式 | UnoCSS, Sass |
| 工具库 | VueUse, Lodash |
| 仓库状态管理 | Pinia, pinia-plugin-persistedstate(持久化插件) |
| Ajax 请求 | Axios |
Vue 设计原则
- 模块化/组件化:优先使用模块化和组件化的方式组织代码,避免单一文件过大或过于复杂
- 单一职责:每个模块或组件应专注于一个功能或职责,避免过多关注点混杂在一起
- 单页面专用组件:当某个页面需要设计专用组件时,可以在该页面目录下创建
components文件夹,例如:src/views/<page-name>/components/<ComponentName>.vue,存放该页面专用组件,避免在全局组件目录下创建仅供单页面使用的组件
Vue 页面结构约定
生成新的 Vue 页面时,必须使用按页面分文件夹的结构:
src/views/<page-name>/index.vue
规则:
<page-name>必须为 kebab-case- 绝不在
src/views下直接创建单文件页面(禁止:src/views/home.vue) - 若用户仅提供页面名称(未含路径),应自动推断并创建文件夹结构
- 需要时将相关文件放在同一文件夹中(例如
index.ts、types.ts、style.scss、__tests__)
示例:
- 请求:“Create Home page” 或 “Create AboutMe page”
- 输出路径:
src/views/home/index.vue或src/views/about-me/index.vue - 禁止:
src/views/home.vue或src/views/about-me.vue
Vue 组件结构约定
生成新的 Vue 组件时,必须使用按组件分文件夹的结构:
src/components/<ComponentName>/<ComponentName>.vue
规则:
<ComponentName>必须为 PascalCase- 绝不在
src/components下直接创建单文件组件(禁止:src/components/HelloWorld.vue) - 若用户仅提供组件名称(未含路径),应自动推断并创建文件夹结构
- 需要时将相关文件放在同一文件夹中(例如
index.ts、types.ts、style.scss、__tests__)
示例:
- 请求:“Create HelloWorld component”
- 输出路径:
src/components/HelloWorld/HelloWorld.vue - 禁止:
src/components/HelloWorld.vue
Vue 文件模板
严格按照 <template> 在上,<script setup> 在中,<style> 在下的结构生成 Vue 文件,如下:
<template></template>
<script setup></script>
<style lang="scss" scoped></style>
前端 API 接口文件路径规范
src/api/ # 接口层:按业务模块组织 API 请求与请求封装
├── modules/ # API 请求文件
└── request/ # Axios 封装与配置(请求拦截器和响应拦截器等)
⚠ 注意:api 接口文件禁止直接放在
src/api下
- 违规的 api 接口文件路径:
src/api/user.js - 合法的 api 接口文件路径:
src/api/modules/system/user.js、src/api/modules/menu/index.js、src/api/modules/login.js
前端本地持久化缓存
- Pinia 持久化:使用
pinia-plugin-persistedstate插件将 Pinia 状态持久化到localStorage
图标 icons
当前端需要使用 图标/字体图标/icons 时,必须遵循以下约定:
优先级:iconfont 图标 > Element Plus 图标 > UnoCSS 图标 > SVG 图标
- iconfont 图标:高优先级,先查询项目中
src/assets/iconfont下有无引入iconfont资源,优先使用iconfont的字体图标,文档链接:iconfont - Element Plus 图标:中优先级,使用 Element Plus 内置图标,满足常规 UI 需求,文档链接:Element Plus Icon
- UnoCSS 图标:次优先级,使用 UnoCSS 的图标功能,它支持多种图标集,文档链接:UnoCSS Icons
- SVG 图标:最低优先级,当其他图标无法满足需求时,才能使用 SVG 图标,并将 SVG 文件放在
src/assets/svgs目录下,使用vite-svg-loader加载器进行处理 - 图标命名:SVG 图标文件命名应使用 kebab-case,例如:
user-profile.svg、home.svg
More from sonvee/ai-skills
fullstack-init
初始化前后端分离全栈项目的脚手架和配置,并在日常开发中遵守用户固定的技术栈选型。当用户提到"初始化项目"、"新建全栈项目"、"搭建前后端分离项目"、"创建一个新项目"、"帮我建个项目"等意图时,主动触发此 skill。即使用户没有明确说"全栈",只要上下文涉及同时需要前端和后端的新项目,也应触发。日常讨论技术方案、写代码时也应遵守本 skill 中的技术栈约定。
8vue
Vue 3 Composition API, script setup macros, reactivity system, and built-in components. Use when writing Vue SFCs, defineProps/defineEmits/defineModel, watchers, or using Transition/Teleport/Suspense/KeepAlive.
8vueuse-functions
Apply VueUse composables where appropriate to build concise, maintainable Vue.js / Nuxt features.
7vue-best-practices
MUST be used for Vue.js tasks. Strongly recommends Composition API with `<script setup>` and TypeScript as the standard approach. Covers Vue 3, SSR, Volar, vue-tsc. Load for any Vue, .vue files, Vue Router, Pinia, or Vite with Vue work. ALWAYS use Composition API unless the project explicitly requires Options API.
7vite
Vite build tool configuration, plugin API, SSR, and Vite 8 Rolldown migration. Use when working with Vite projects, vite.config.ts, Vite plugins, or building libraries/SSR apps with Vite.
7vitest
Vitest fast unit testing framework powered by Vite with Jest-compatible API. Use when writing tests, mocking, configuring coverage, or working with test filtering and fixtures.
7