规范的目的是为了编写高质量的代码,让你的团队成员每天得心情都是愉悦的,大家在一起是快乐的。
引自《阿里规约》的开头片段:
…现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有红绿灯,谁还敢上路行驶。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。
Vue 项目规范以 Vue 官方规范https://v2.cn.vuejs.org/v2/style-guide/中的A规范为基础,在其上面进行项目开发,故所有代码均遵守该规范。
请仔仔细细阅读 Vue官方规范,切记,此为第一步。
正例:
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>
正例:
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>
<style scoped>
.hello {
color: white;
font-size: 22px;
margin: 10px 0 0;
}
style>
反例:
<template>
<div class="hello">
HelloWorld
div>
template>
<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>
组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模极变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。
正例:
<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>
指令推荐都使用缩写形式,(用 : 表示v·bind: ,用 @ 表示 v-on, 用#表示 v-slot:)
正例:
<input
@input="onInput"
@focus="onFocus">
反例:
<input
v-on:input="onInput"
@focus="onFocus">
单文件组件应该总是让标签顺序保持为
正例:
<template>
template>
<script>
script>
<style scoped>
style>
反例:
<template>
template>
<style scoped>
style>
<script>
script>
如果运行时,需要非常颜繁地切换,使用v·show;如果在运行时,条件很少改变,使用v-if。
components>props>data>compued>watch>filter>钩子函数(钩子函数按其执行顺序)>methods
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')
}]
}
vue 项目中的所有命名一定要与后端命名统一。
比如权限:后端 privilege,前端无论 router,store,api等都必须使用 privielege 单词!
使用 vue·cli3 来初始化项目,项目名按照上面的命名规范
目录名按照上面的命名规范,其中components 组件用大写驼峰,其余除components 组件目录外的所有目录均便用 kebab-case 合名。
src源码目录
|-- api 所有api接口
|-- assets 静志资源,images,icons,styles等
|-- components 公用组件
|-- config 配置信息
|-- constants 常量信息,项目所有Enun,全局常量等
|-- directives 自定义指令
|-- filters 过滤器,全局工具
|-- datas 模拟教据,临时存放
|-- lib 外部引用的插件存放及修改文件
|-- mock 模拟接口,临时存放
|-- plugins 插件,全局使用
|-- router 路由,统一管理
|-- store vuex,统一管理
|-- themes 自定义样式主题
|-- views 视图目录
| |-- role role模块名
| |-- role-list.vue role列表页面
| |-- role-add. vue role新建页面
| |-- role-update.vue role更新页面
| |-- index.less role模块样式
| |-- components role模块通用组件文件夹
| |-- employee employee模块
1. api 目录
正例:
后端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
|-- styles
3.components目录
此目录应按照组件进行目录划分,目录命名为KebabCase,组件命名规则也为KebabCase
|-- error-log
| |--index.vue
| |-- index.less
|-- markdow-editor
| |--index.vue
| |--index.js
|-- kebab-case
4.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 目录
|-- views 视图目录
| |-- role role模块名
| |-- role-list.vue role列表页面
| |-- role-add. vue role新建页面
| |-- role-update.vue role更新页面
| |-- index.less role模块样式
| |-- components role模块通用组件文件夹
| | |-- role-header.vue role头部组件
| | |-- role-modal.vue role弹出窗组件
| |-- employee employee模块
| |-- behavior-log 行为日志log模块
| |-- code-generator 代码生成器模块
整理必须加注释的地方
如果这篇【文章】有帮助到你,希望可以给我点个赞,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注,咱们一起探讨和努力!!!
个人主页 : 前端初见