文章目录
? 前端代码规范? 一、前端代码规范Vue篇?1、Vue编码基础?1.1、组件规范?1.2、模板中使用简单的表达式?1.3、指令都使用缩写形式?1.4、 标签顺序保持一致?1.5、必须为 v-for 设置键值 key?1.6、v-show 与 v-if 选择?1.7、script 标签内部结构顺序?1.8、Vue Router 规范 ?2、Vue 项目目录规范?2.1、基础?2.2、使用 Vue-cli 脚手架?2.3、 目录说明?2.4、注释说明?2.5、其他 ✒️总结
? 前端代码规范
规范的目的是为了编写高质量的代码,让你的团队成员每天得心情都是愉悦的,大家在一起是快乐的。
 引自《阿里规约》的开头片段:
 …现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有红绿灯,谁还敢上路行驶。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。
? 一、前端代码规范Vue篇

?1、Vue编码基础
Vue 项目规范以 Vue 官方规范https://v2.cn.vuejs.org/v2/style-guide/中的A规范为基础,在其上面进行项目开发,故所有代码均遵守该规范。
请仔仔细细阅读 Vue官方规范,切记,此为第一步。
?1.1、组件规范
组件名为多个单词组件名应该始终是多个单词组成(大于等于 2),且命名规范为KebabCase格式。
这样做可以避免跟现有的以及未来的 HTML 元素相冲突,因为所有的 HTML 元素名称都是单个单词的。
正例:
export default {  name: 'TodoItem',  // ...}反例:
export default {  name: 'Todo',  // ...}export default {  name: 'todo-item',  // ...}正例:
components/|- my-component.vue反例:
components/|- myCoaponent.vue|- MyCoaponent.vue正例:
components/|-base-button.vue|-base-table.vue|-base-icon.vue反例:
components/|- MySutton.vue|- VueTable.vue|- Icon.vue正例:
components/|- todo-list.vue|- todo-list-item.vue|- todo-list-item-button.vue|- user-profi1e-options.vue(完整单词)反例:
components/|- TodoList.vue|- TodoItem. vue|- TodoButton.vue|- UProfopts.vue(使用了缩写)正例:
<1--在单文件组件、字符串模板和JSX中--><myComponent /><Rom><table :colum="data"/></Rom>反例:
<my-component /><row><table :column="data"/></row>当在组件中使用 data 属性的时候 (除了 new Vue 外的任何地方),它的值必须是返回一个对象的函数。 因为如果直按是一个对象的话,子组件之间的属性值会互相影响,
正例:
export default {  name: 'App',  data(){    return{      title:'我是一个标题',    }  },}反例:
export default {  name: 'App',  data:{    title:'我是一个标题',  },}正例:
export default {  name: "HelloWorld",  props: {    //组件状态,用于控制组件的颜色    status: {      type: String,      required: true,      validator: function (value) {        return ["succ", "info", "error"].indexof(value) !== -1;      },    },    // 用户级别,用于显示皇冠个效    userLevel: {      type: String,      required: true,    },  },};正例:
<template>  <div class="hello">      HelloWorld  </div></template><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped>.hello {  color: white;  font-size: 22px;  margin: 10px 0 0;}</style>反例:
<template>  <div class="hello">      HelloWorld  </div></template><!-- 没有scoped 特性--><style >.hello {  color: white;  font-size: 22px;  margin: 10px 0 0;}</style>正例:
      <MyComponent         foo="a"         bar="b"         baz="c">      </MyComponent>反例:
     <MyComponent foo="a" bar="b" baz="c"></MyComponent>?1.2、模板中使用简单的表达式
组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模极变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。
 正例:
<template>  <div >    {{ normalizedFullName }}  </div></template><script>export default {  name: "HelloWorld",  computed:{    normalizedFullName:function(){      return this.fullName.split(' ').map((word)=>{        return word[0].toUpperCase()+word.split(1)      }).join(' ')    }  }};</script>反例:
<template>  <div >    {{ fullName.split(' ').map((word)=>{        return word[0].toUpperCase()+word.split(1)      }).join(' ')}}  </div></template>?1.3、指令都使用缩写形式
指令推荐都使用缩写形式,(用 : 表示v·bind: ,用 @ 表示 v-on, 用#表示 v-slot:)
 正例:
   <input   @input="onInput"   @focus="onFocus">反例:
   <input  v-on:input="onInput"   @focus="onFocus">?1.4、 标签顺序保持一致
单文件组件应该总是让标签顺序保持为
 正例:
<template></template><script></script><style scoped></style>反例:
<template></template><style scoped></style><script></script>?1.5、必须为 v-for 设置键值 key
?1.6、v-show 与 v-if 选择
如果运行时,需要非常颜繁地切换,使用v·show;如果在运行时,条件很少改变,使用v-if。
?1.7、script 标签内部结构顺序
components>props>data>compued>watch>filter>钩子函数(钩子函数按其执行顺序)>methods
?1.8、Vue Router 规范
页面跳转数据传递使用路由参数页面跳转,例如A页面跳转到B页面,需要将A页面的数据传递到B页面,推使用路由参数进行传参,而不是将需要传递的数据保存 vuex,然后在 B页面取出 vuex的数据,因为如果在 B页面刚新会导致 vuex 数据丢失
正例:
let id='1113'this.$router.push({name:'userDetail',query:{  id:id}}){    path: "/Login",    name: "Login",    // 登录页    component: () => import('@/components/Login/Login.vue'),}, 3.router 中的命名规范
 path、childrenPoints命名规范采用kebab-case命名规范(尽量vue文件的目录结构保持一致,因为目录、文件名都是kebab-case,这样很方便找到对应的文件)
 {        path:'/system/system-list',        // 系统列表        name:'SystemList',        component:()=>import('../components/system/system-list.vue')    }4.router 中的 path 命名规范
 path除了采用kebab-case命名规范以外,必须以/开头,即使是children里的path也要以/开头。如下示例
 目的:
 经常有这样的场景:某个页面有问题,要立刻找到这个文件,如果不用以/开头,path为parent和children组成的,可能经常需要在router文件里搜索多次才能找到,而如用以/开头,则能立刻搜索到对应的组件
{    path: '/',    // 首页    name: 'home',    component: () => import('../components/home/home.vue'),    redirect: '/panel',    // 重定向到看板页    children:[        {            path:'/panel',            // 大屏面板            name:'Panel',            component:()=>import('../components/panel/panel.vue'),            meta: {                bg: 'bg'            },            // 背景图        },        {        path:'/system',        // 系统设置        name:'System',        component:()=>import('../components/system/system.vue')    }]}?2、Vue 项目目录规范
?2.1、基础
vue 项目中的所有命名一定要与后端命名统一。
 比如权限:后端 privilege,前端无论 router,store,api等都必须使用 privielege 单词!
?2.2、使用 Vue-cli 脚手架
使用 vue·cli3 来初始化项目,项目名按照上面的命名规范
?2.3、 目录说明
目录名按照上面的命名规范,其中components 组件用大写驼峰,其余除components 组件目录外的所有目录均便用 kebab-case 合名。
src源码目录
 |-- api 所有api接口 |-- assets 静志资源,images,icons,styles等 |-- components公用组件 |-- config配置信息 |-- constants常量信息,项目所有Enun,全局常量等 |-- directives自定义指令 |-- filters过滤器,全局工具 |-- datas模拟教据,临时存放 |-- lib外部引用的插件存放及修改文件 |-- mock模拟接口,临时存放 |-- plugins插件,全局使用 |-- router路由,统一管理 |-- storevuex,统一管理 |-- themes自定义样式主题 |-- views视图目录 |  |-- rolerole模块名 |  |-- role-list.vuerole列表页面 |  |-- role-add. vuerole新建页面 |  |-- role-update.vuerole更新页面 |  |-- index.lessrole模块样式 |  |-- componentsrole模块通用组件文件夹 |  |-- employeeemployee模块1. api 目录
文件、变量命名要与后端保持一致。此目录对应后端 API 接口,按照后端一个controller 一个api.js文件。若项目较大时,可以按照业务划分子目录,并与后端保持一致。api中的方法名字要与后端 api url 尽量保持语义高度一致性。对于 api中的每个方法要添加注释,注释与后端swagger 接口文档保持一致。正例:
后端ulr:EmployeeController.java
/employee/add/employee/delete/id/employee/update前端:employee.js
//添加员工addEmployee:(data)=>{rerutn postAxios('/employee/add',data)}//更新员工updateEmployee:(data)=>{rerutn postAxios('/employee/update',data)}//删除员工deleteEmployee:(employeeId)=>{rerutn postAxios('/employee/delete/'+employeeId)}2. assets目录
 assels 为静态资源,里面存放 images,styles,icons等静态资源,静态资源命名格式为 kebab-case
|-- assets|-- images|  |-- background-color.png|  |-- upload-header.png|-- styles3.components目录
 此目录应按照组件进行目录划分,目录命名为KebabCase,组件命名规则也为KebabCase
|--  error-log|  |--index.vue|  |-- index.less|-- markdow-editor|  |--index.vue|  |--index.js|-- kebab-case4.constants 目录
 此目录存放项目所有常量,如果常量在vue 中使用,请使用vue-enum 插件(https://gitee.com/lab1024/vue-enum)
 vue-enum
 目录结构:
|--  index.js|--  role.js|--  employee.js例子:index.js
export let enumInfo = {    SOURCE_IN_TYPE: {        PURCHASE_IN: {            value: 1,            desc: '采购入库'        },        REFUND_IN: {            value: 2,            desc: '退货入库'        },        CHECK_IN: {            value: 3,            desc: '盘点入库'        },        CONFIRM_IN: {            value: 4,            desc: '取消订单入库'        }    }}5.router与store 目录
这两个目录一定要将业务进行拆分,不能放到一个文件里。
 router 尽量按照 views 中的结构保持一致
 srore 按照业务进行拆分不同的正文件
6.views 目录
命名要与后端、router、api等保持一致components 中组件要使用 Pascalcase 规则|-- views视图目录|  |-- rolerole模块名|  |-- role-list.vuerole列表页面|  |-- role-add. vuerole新建页面|  |-- role-update.vuerole更新页面|  |-- index.lessrole模块样式|  |-- componentsrole模块通用组件文件夹|  |  |-- role-header.vuerole头部组件|  |  |-- role-modal.vuerole弹出窗组件|  |-- employeeemployee模块|  |-- behavior-log行为日志log模块|  |-- code-generator代码生成器模块?2.4、注释说明
整理必须加注释的地方
公共组件使用说明api 目录的接口js 文件必须加注释store 中的 state,mutation, action等必须加注释vue 文件中的template 必须加注释,若文件较大添加 slart end 注释vue 文件的 methods,每个method 必须添加注释vue 文件的 data,非常见单词要加注释?2.5、其他
尽量不要手动操作 DOM因使用 vue 框架,所以在项目开发中尽量使用 vue 的数据驱动更新 DOM,尽量(不到万不得已)不要手动操作DOM,包括:增删改 dom 元素、以及更改样式、添加事件等删除无用代码
因使用了 git/svn 等代码版本工具,对于无用代码必须及时删除,例如:一些调试的console 语句、无用的弃用功能代码.
✒️总结
如果这篇【文章】有帮助到你?,希望可以给我点个赞?,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注???,咱们一起探讨和努力!!!
 ?? 个人主页 : 前端初见