前端開發(fā)必備小技巧之前端代碼規(guī)范Vue篇
前端代碼規(guī)范
規(guī)范的目的是為了編寫高質(zhì)量的代碼,讓你的團(tuán)隊(duì)成員每天得心情都是愉悅的,大家在一起是快樂的。
引自《阿里規(guī)約》的開頭片段:
…現(xiàn)代軟件架構(gòu)的復(fù)雜性需要協(xié)同開發(fā)完成,如何高效地協(xié)同呢?無(wú)規(guī)矩不成方圓,無(wú)規(guī)范難以協(xié)同,比如,制訂交通法規(guī)表面上是要限制行車權(quán),實(shí)際上是保障公眾的人身安全,試想如果沒有限速,沒有紅綠燈,誰(shuí)還敢上路行駛。對(duì)軟件來(lái)說(shuō),適當(dāng)?shù)囊?guī)范和標(biāo)準(zhǔn)絕不是消滅代碼內(nèi)容的創(chuàng)造性、優(yōu)雅性,而是限制過(guò)度個(gè)性化,以一種普遍認(rèn)可的統(tǒng)一方式一起做事,提升協(xié)作效率,降低溝通成本。代碼的字里行間流淌的是軟件系統(tǒng)的血液,質(zhì)量的提升是盡可能少踩坑,杜絕踩重復(fù)的坑,切實(shí)提升系統(tǒng)穩(wěn)定性,碼出質(zhì)量。
一、前端代碼規(guī)范Vue篇
1、Vue編碼基礎(chǔ)
Vue 項(xiàng)目規(guī)范以 Vue 官方規(guī)范https://v2.cn.vuejs.org/v2/style-guide/中的A規(guī)范為基礎(chǔ),在其上面進(jìn)行項(xiàng)目開發(fā),故所有代碼均遵守該規(guī)范。
請(qǐng)仔仔細(xì)細(xì)閱讀 Vue官方規(guī)范,切記,此為第一步。
1.1、組件規(guī)范
- 組件名為多個(gè)單詞
組件名應(yīng)該始終是多個(gè)單詞組成(大于等于 2),且命名規(guī)范為KebabCase格式。
這樣做可以避免跟現(xiàn)有的以及未來(lái)的 HTML 元素相沖突,因?yàn)樗械?HTML 元素名稱都是單個(gè)單詞的。
正例:
export default { name: 'TodoItem', // ... }
反例:
export default { name: 'Todo', // ... } export default { name: 'todo-item', // ... }
- 組件文件名為 pascal-case 格式
正例:
components/ |- my-component.vue
反例:
components/ |- myCoaponent.vue |- MyCoaponent.vue
- 基礎(chǔ)組件文件名為 base 開頭,使用完整單詞而不是縮寫
正例:
components/ |-base-button.vue |-base-table.vue |-base-icon.vue
反例:
components/ |- MySutton.vue |- VueTable.vue |- Icon.vue
- 和父組件緊密屬合的子組件應(yīng)該以父組件名作為前綴命名
正例:
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(使用了縮寫)
- 在Template 模版中使用組件,應(yīng)使用 PascalCase 模式,并且使用自閉合組件。
正例:
<1--在單文件組件、字符串模板和JSX中--> <myComponent /> <Rom><table :colum="data"/></Rom>
反例:
<my-component /><row><table :column="data"/></row>
- 組件的 data 必須是一個(gè)函致
當(dāng)在組件中使用 data 屬性的時(shí)候 (除了 new Vue 外的任何地方),它的值必須是返回一個(gè)對(duì)象的函數(shù)。 因?yàn)槿绻卑词且粋€(gè)對(duì)象的話,子組件之間的屬性值會(huì)互相影響,
正例:
export default { name: 'App', data(){ return{ title:'我是一個(gè)標(biāo)題', } }, }
反例:
export default { name: 'App', data:{ title:'我是一個(gè)標(biāo)題', }, }
- Prop 定義應(yīng)該盡量詳細(xì)
- 必須使用 camelCase 駝峰命名
- 必須指定類型
- 必須加上注釋,表明其含義
- 必須加上 required 或者 default,兩者二選其一
- 如果有業(yè)務(wù)需要,必須加上 validator 驗(yàn)證
正例:
export default { name: "HelloWorld", props: { //組件狀態(tài),用于控制組件的顏色 status: { type: String, required: true, validator: function (value) { return ["succ", "info", "error"].indexof(value) !== -1; }, }, // 用戶級(jí)別,用于顯示皇冠個(gè)效 userLevel: { type: String, required: true, }, }, };
- 為組件樣式設(shè)置作用域
正例:
<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>
- 如果特性元素較多,應(yīng)該主動(dòng)換行
正例:
<MyComponent foo="a" bar="b" baz="c"> </MyComponent>
反例:
<MyComponent foo="a" bar="b" baz="c"></MyComponent>
1.2、模板中使用簡(jiǎn)單的表達(dá)式
組件模板應(yīng)該只包含簡(jiǎn)單的表達(dá)式,復(fù)雜的表達(dá)式則應(yīng)該重構(gòu)為計(jì)算屬性或方法。復(fù)雜表達(dá)式會(huì)讓你的模極變得不那么聲明式。我們應(yīng)該盡量描述應(yīng)該出現(xiàn)的是什么,而非如何計(jì)算那個(gè)值。而且計(jì)算屬性和方法使得代碼可以重用。
正例:
<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、 標(biāo)簽順序保持一致
單文件組件應(yīng)該總是讓標(biāo)簽順序保持為
正例:
<template> </template> <script> </script> <style scoped> </style>
反例:
<template> </template> <style scoped> </style> <script> </script>
1.5、必須為 v-for 設(shè)置鍵值 key
1.6、v-show 與 v-if 選擇
如果運(yùn)行時(shí),需要非常顏繁地切換,使用v·show;如果在運(yùn)行時(shí),條件很少改變,使用v-if。
1.7、script 標(biāo)簽內(nèi)部結(jié)構(gòu)順序
components>props>data>compued>watch>filter>鉤子函數(shù)(鉤子函數(shù)按其執(zhí)行順序)>methods
1.8、Vue Router 規(guī)范
- 頁(yè)面跳轉(zhuǎn)數(shù)據(jù)傳遞使用路由參數(shù)
頁(yè)面跳轉(zhuǎn),例如A頁(yè)面跳轉(zhuǎn)到B頁(yè)面,需要將A頁(yè)面的數(shù)據(jù)傳遞到B頁(yè)面,推使用路由參數(shù)進(jìn)行傳參,而不是將需要傳遞的數(shù)據(jù)保存 vuex,然后在 B頁(yè)面取出 vuex的數(shù)據(jù),因?yàn)槿绻?B頁(yè)面剛新會(huì)導(dǎo)致 vuex 數(shù)據(jù)丟失
正例:
let id='1113' this.$router.push({name:'userDetail', query:{ id:id } })
- 使用路由懶加載(延遲加載)機(jī)制
{ path: "/Login", name: "Login", // 登錄頁(yè) component: () => import('@/components/Login/Login.vue'), },
3.router 中的命名規(guī)范
path、childrenPoints命名規(guī)范采用kebab-case命名規(guī)范(盡量vue文件的目錄結(jié)構(gòu)保持一致,因?yàn)槟夸?、文件名都是kebab-case,這樣很方便找到對(duì)應(yīng)的文件)
{ path:'/system/system-list', // 系統(tǒng)列表 name:'SystemList', component:()=>import('../components/system/system-list.vue') }
4.router 中的 path 命名規(guī)范
path除了采用kebab-case命名規(guī)范以外,必須以/開頭,即使是children里的path也要以/開頭。如下示例
目的:
經(jīng)常有這樣的場(chǎng)景:某個(gè)頁(yè)面有問題,要立刻找到這個(gè)文件,如果不用以/開頭,path為parent和children組成的,可能經(jīng)常需要在router文件里搜索多次才能找到,而如用以/開頭,則能立刻搜索到對(duì)應(yīng)的組件
{ path: '/', // 首頁(yè) name: 'home', component: () => import('../components/home/home.vue'), redirect: '/panel', // 重定向到看板頁(yè) children:[ { path:'/panel', // 大屏面板 name:'Panel', component:()=>import('../components/panel/panel.vue'), meta: { bg: 'bg' }, // 背景圖 }, { path:'/system', // 系統(tǒng)設(shè)置 name:'System', component:()=>import('../components/system/system.vue') }] }
2、Vue 項(xiàng)目目錄規(guī)范
2.1、基礎(chǔ)
vue 項(xiàng)目中的所有命名一定要與后端命名統(tǒng)一。
比如權(quán)限:后端 privilege,前端無(wú)論 router,store,api等都必須使用 privielege 單詞!
2.2、使用 Vue-cli 腳手架
使用 vue·cli3 來(lái)初始化項(xiàng)目,項(xiàng)目名按照上面的命名規(guī)范
2.3、 目錄說(shuō)明
目錄名按照上面的命名規(guī)范,其中components 組件用大寫駝峰,其余除components 組件目錄外的所有目錄均便用 kebab-case 合名。
src源碼目錄
|-- api 所有api接口 |-- assets 靜志資源,images,icons,styles等 |-- components 公用組件 |-- config 配置信息 |-- constants 常量信息,項(xiàng)目所有Enun,全局常量等 |-- directives 自定義指令 |-- filters 過(guò)濾器,全局工具 |-- datas 模擬教據(jù),臨時(shí)存放 |-- lib 外部引用的插件存放及修改文件 |-- mock 模擬接口,臨時(shí)存放 |-- plugins 插件,全局使用 |-- router 路由,統(tǒng)一管理 |-- store vuex,統(tǒng)一管理 |-- themes 自定義樣式主題 |-- views 視圖目錄 | |-- role role模塊名 | |-- role-list.vue role列表頁(yè)面 | |-- role-add. vue role新建頁(yè)面 | |-- role-update.vue role更新頁(yè)面 | |-- index.less role模塊樣式 | |-- components role模塊通用組件文件夾 | |-- employee employee模塊
1. api 目錄
- 文件、變量命名要與后端保持一致。
- 此目錄對(duì)應(yīng)后端 API 接口,按照后端一個(gè)controller 一個(gè)api.js文件。若項(xiàng)目較大時(shí),可以按照業(yè)務(wù)劃分子目錄,并與后端保持一致。
- api中的方法名字要與后端 api url 盡量保持語(yǔ)義高度一致性。
- 對(duì)于 api中的每個(gè)方法要添加注釋,注釋與后端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 為靜態(tài)資源,里面存放 images,styles,icons等靜態(tài)資源,靜態(tài)資源命名格式為 kebab-case
|-- assets |-- images | |-- background-color.png | |-- upload-header.png |-- styles
3.components目錄此目錄應(yīng)按照組件進(jìn)行目錄劃分,目錄命名為KebabCase,組件命名規(guī)則也為KebabCase
|-- error-log | |--index.vue | |-- index.less |-- markdow-editor | |--index.vue | |--index.js |-- kebab-case
4.constants 目錄此目錄存放項(xiàng)目所有常量,如果常量在vue 中使用,請(qǐng)使用vue-enum 插件(https://gitee.com/lab1024/vue-enum)
vue-enum目錄結(jié)構(gòu):
|-- index.js |-- role.js |-- employee.js
例子:index.js
export let enumInfo = { SOURCE_IN_TYPE: { PURCHASE_IN: { value: 1, desc: '采購(gòu)入庫(kù)' }, REFUND_IN: { value: 2, desc: '退貨入庫(kù)' }, CHECK_IN: { value: 3, desc: '盤點(diǎn)入庫(kù)' }, CONFIRM_IN: { value: 4, desc: '取消訂單入庫(kù)' } } }
5.router與store 目錄
這兩個(gè)目錄一定要將業(yè)務(wù)進(jìn)行拆分,不能放到一個(gè)文件里。
router 盡量按照 views 中的結(jié)構(gòu)保持一致
srore 按照業(yè)務(wù)進(jìn)行拆分不同的正文件
6.views 目錄
- 命名要與后端、router、api等保持一致
- components 中組件要使用 Pascalcase 規(guī)則
|-- views 視圖目錄 | |-- role role模塊名 | |-- role-list.vue role列表頁(yè)面 | |-- role-add. vue role新建頁(yè)面 | |-- role-update.vue role更新頁(yè)面 | |-- index.less role模塊樣式 | |-- components role模塊通用組件文件夾 | | |-- role-header.vue role頭部組件 | | |-- role-modal.vue role彈出窗組件 | |-- employee employee模塊 | |-- behavior-log 行為日志log模塊 | |-- code-generator 代碼生成器模塊
2.4、注釋說(shuō)明
整理必須加注釋的地方
- 公共組件使用說(shuō)明
- api 目錄的接口js 文件必須加注釋
- store 中的 state,mutation, action等必須加注釋
- vue 文件中的template 必須加注釋,若文件較大添加 slart end 注釋
- vue 文件的 methods,每個(gè)method 必須添加注釋
- vue 文件的 data,非常見單詞要加注釋
2.5、其他
- 盡量不要手動(dòng)操作 DOM
因使用 vue 框架,所以在項(xiàng)目開發(fā)中盡量使用 vue 的數(shù)據(jù)驅(qū)動(dòng)更新 DOM,盡量(不到萬(wàn)不得已)不要手動(dòng)操作DOM,包括:增刪改 dom 元素、以及更改樣式、添加事件等 - 刪除無(wú)用代碼
因使用了 git/svn 等代碼版本工具,對(duì)于無(wú)用代碼必須及時(shí)刪除,例如:一些調(diào)試的console 語(yǔ)句、無(wú)用的棄用功能代碼.
總結(jié)
到此這篇關(guān)于前端開發(fā)必備小技巧之前端代碼規(guī)范Vue篇的文章就介紹到這了,更多相關(guān)前端代碼規(guī)范Vue篇內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
純javascript實(shí)現(xiàn)選擇框的全選與反選功能
這篇文章主要介紹了純javascript實(shí)現(xiàn)選擇框的全選與反選 ,需要的朋友可以參考下2019-04-04關(guān)于promise和async用法以及區(qū)別詳解
Promise是一個(gè)構(gòu)造函數(shù),我們就可以new Promise()得到一個(gè) Promise的實(shí)例,下面這篇文章主要給大家介紹了關(guān)于promise和async用法以及區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-01-01javascript事件函數(shù)中獲得事件源的兩種不錯(cuò)方法
許多情況我們需要獲得事件源對(duì)象來(lái)對(duì)其屬性進(jìn)行更改,在事件響應(yīng)函數(shù)中獲得事件源的方法有如下兩種2014-03-03JS中的算法與數(shù)據(jù)結(jié)構(gòu)之二叉查找樹(Binary Sort Tree)實(shí)例詳解
這篇文章主要介紹了JS中的算法與數(shù)據(jù)結(jié)構(gòu)之二叉查找樹(Binary Sort Tree),結(jié)合實(shí)例形式詳細(xì)分析了二叉查找樹(Binary Sort Tree)的原理、定義、遍歷、查找、插入、刪除等常見操作技巧,需要的朋友可以參考下2019-08-08