1.文件命名

2.Vue 组件规范

组件结构

<template>
  <div class="user-profile">
    <!-- 模板内容 -->
  </div>
</template>

<script>
export default {
  name: 'UserProfile', // 组件名使用 PascalCase
  components: {
    // 引入的子组件
  },
  props: {
    // 定义 props
  },
  data() {
    return {
      // 组件数据
    };
  },
  computed: {
    // 计算属性
  },
  watch: {
    // 监听器
  },
  methods: {
    // 方法
  },
  created() {
    // 生命周期钩子
  },
  mounted() {
    // 生命周期钩子
  },
};
</script>

<style scoped>
.user-profile {
  /* 样式 */
}
</style>

组件命名

props: {
  userName: {
    type: String,
    required: true,
  },
  age: {
    type: Number,
    default: 18,
  },
},

3.样式规范

Scoped CSS

<style scoped>
.user-profile {
  /* 样式 */
}
</style>

CSS 预处理器

<style lang="less" scoped>
.user-profile {
  .avatar {
    width: 100px;
    height: 100px;
  }
}
</style>

路由规范

const routes = [
  {
    path: '/user-profile',
    name: 'UserProfile',
    component: UserProfile,
  },
];

路由懒加载

const UserProfile = () => import('@/views/UserProfile.vue');

4.Vuex 规范

模块化

// store/modules/user.js
const state = {
  userInfo: null,
};

const mutations = {
  SET_USER_INFO(state, userInfo) {
    state.userInfo = userInfo;
  },
};

const actions = {
  fetchUserInfo({ commit }) {
    // 异步操作
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};

命名规范

5.API 请求规范

接口封装

// api/user.js
import request from '@/utils/request';

export function fetchUserInfo(userId) {
  return request({
    url: `/user/${userId}`,
    method: 'get',
  });
}

请求方法

// utils/request.js
import axios from 'axios';

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000,
});

service.interceptors.request.use(
  config => {
    // 请求拦截
    return config;
  },
  error => {
    // 请求错误处理
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  response => {
    // 响应拦截
    return response.data;
  },
  error => {
    // 响应错误处理
    return Promise.reject(error);
  }
);

export default service;

6.代码质量规范

ESLint

{
  "extends": [
    "plugin:vue/essential",
    "eslint:recommended"
  ],
  "rules": {
    "vue/no-unused-components": "warn",
    "vue/no-unused-vars": "warn",
    "no-console": "warn"
  }
}

Prettier

{
  "singleQuote": true,
  "semi": false,
  "trailingComma": "es5"
}