1. 程式人生 > 其它 >如何編寫可維護、健壯的前端程式碼?——前端編碼規範制定

如何編寫可維護、健壯的前端程式碼?——前端編碼規範制定

技術標籤:自學前端

前言

我認為程式碼不只是為了實現某個需求,更是給別的人看的。團隊制定一個好的編碼規範,能讓大家更清晰的去理解程式碼。只有高質量的程式碼,才能有優化的可行性。更利於專案的版本迭代和拓展。前段時間為公司制定了編碼規範,在這裡分享一下

如果感覺文章對你有幫助的話,留個贊再走吧~
js(vue)寫法推薦

變數和普通使用camelCase小駝峰式命名(tableData,isVisible),建構函式使用大駝峰式命名

vue檔案命名

對於展示類的、無邏輯的或無狀態的基礎元件可以單獨放在一個資料夾中管理,和父元件緊密耦合的子元件應該以父元件名作為字首命名。編輯器通常會按字母順序組織檔案,而自動補全讓長命名的代價非常之低,儘量使元件命名完整。

components/
base
BaseButton.vue
BaseTable.vue
BaseIcon.vue
todoList
TodoList.vue
TodoListItem.vue
TodoListItemButton.vue
searchSidebar
SearchSidebar.vue
SearchSidebarNavigation.vue

函數語言程式設計,通過語義就知道程式碼大概要幹些什麼。

// 獲取年齡大於20學生的姓名
const students = [{
age: 21,
sex: 2,
name: ‘李小花’
},
{
age: 18,
sex: 1,
name: ‘李二蛋’

},
{
age: 22,
sex: 1,
name: ‘王強強’
},
]
// 推薦
let studentNames_1 = students.filter(student => student.age > 20).map(student => student.name)
// 不推薦
let studentNames_2 = []
for (let i = 0; i < students.length; i++) {
if (students[i].age > 20) {
newStudents.push(students[i].name)
}
}

最小函式準則,即一個函式只做一件事情。複用性強,拓展性高。

面向物件的思想。例如在對一張表的增刪改查,而那個表就是一個物件。以及合理的運用解構賦值,閱讀性強且效率更高(不推薦:row.name,row.price…)

let book = {
isAdd: false,
isModalShow: false,
name: “”,
count: 0,
price: 0,
}
function editBookModalShow(row) {
const { name, counts: count, salePrice: price} = row
book = {
isAdd: false,
isModalShow: true,
name,
count,
price,
}
}
editBookModalShow({
name: ‘紅樓夢’,
counts: 42,
salePrice: 60
})

var,let和const的選擇

var因為變數提升,重複定義等問題不推薦使用。而任何語言定義常量的開銷總是比變數小的。所以,在不需要更改值的情況下只推薦使用const

props是子父元件傳遞資料的通道。資料的準確性可以說是尤為重要

// 推薦
props: {
type: {
type: String,
default: “primary”,
validator: value => [“primary”, “success”,“danger”].includes(value) // 甚至可以這樣去限制引數值
},
size: {
type: String,
default: “large”
}
},
// 不推薦
props: [“size”,“type”]

如何設計一個元件這篇文章講的非常好

元件通訊及狀態管理
    該怎麼通訊就怎麼通訊,千萬不要去濫用vuex,甚至可以不用
    遵守單向資料流,不要使用parent,children

    子父元件:props emit 兄弟元件:eventBus 祖孫元件:provide / inject,attrs/$listeners
    多元件共享狀態:vuex
    本地持久化:localStorage sessionStorage

v-for的key值

使用item的 id 來作為key值,而不是index。在陣列插入中間值時會出現bug

永遠不要把 v-if 和 v-for 同時用在同一個元素上

因為v-for 比 v-if 具有更高的優先順序

<ul>
  <li>
    {{ user.name }}
  </li>
</ul>
// 將會經過如下運算:
this.users.map(function (user) {
  if (user.isActive) {
    return user.name
  }
})
// 這樣會造成不必要的遍歷 我們可以將users通過計算屬性filter出avtiveUsers,再提供給v-for渲染

儘量不要使用watch

watch對效能的開銷大,大部分情況computed是你更好的選擇

websocket,webwoker,定時器等在不使用的時候記得關閉

除非迫不得已不要去操作DOM元素

按需載入(利用 import() 語法進行code splitting)

在不使用懶載入,不分離業務程式碼時。webpack會把所有的程式碼打包成一個檔案。如果在進入首頁時,這個檔案過大,會極大的影響首屏載入速度。所以說,在生產環境中的code splitting是十分重要的,在對應的頁面只加載需要的程式碼。分離業務程式碼和第三方庫則需要進行webpack配置,而使用import語法在編碼時可以注意

// router.js
{
path: ‘/404’,
component: () => import("@/views/404.vue"),
}
// 註冊元件
components: {
TodoList: () => import("@/components/todoList/TodoList.vue")
TodoListItem: () => import("@/components/todoList/TodoListItem.vue"),
}

template中合理使用{{}}表示式

儘量在template只使用簡單的表示式。我們只用關心模板中{{}}需要展示的東西,而資料是如何計算出來的可以寫在computed和methods裡。在使用el-table時這樣去處理一些狀態值的欄位是不是更舒服呢
// 推薦寫法
  orderStatus: {
      0: "待發貨",
      1: "已發貨",
      2: "貨物中轉"           // 也可以將這些狀態統一放在一個檔案,方便管理
    }

  <el-table-column prop="status" label="訂單狀態">
    <template slot-scope="{row}">{{orderStatus[row.status]}}</template>
  </el-table-column>

// 糟糕的寫法
   <el-table-column prop="status" label="訂單狀態">
    <template slot-scope="{row}">
   	 {{row.status==='0'?'已發貨':row.status==='1'?'待發貨':''}}
    </template>
  </el-table-column>
使用嚴格等進行兩數比較,避免在判斷的過程中,由 JavaScript 的強制型別轉換所造成的困擾

==:運算子稱作相等,用來檢測兩個運算元是否相等,這裡的相等定義的非常寬鬆,可以允許進行型別轉換
===:用來檢測兩個運算元是否嚴格相等

儘量把函式的入參說明詳細

/**

  • @param props.dateTable 模板陣列
  • @param props.handleItemClick item點選事件
  • @param props.self 父元件作用域
    */
    const RenderDateTemplate = (props) => {
    const { dateTable, handleItemClick, self } = props;
    return (

    {
    dateTable.map((item, index) => {}
    }

    )
    }

樣式寫法推薦

為每個.vue檔案加上scoped,避免汙染全域性
遵守BEM規範(即block-name__element-name–modifier-name)

但要注意block 巢狀的層次要儘量少(一個層次能搞完的就不要巢狀).
各大元件庫(Element AntDesign)的BEM實踐,提供了很大的參考性

m-button__label, m-button__label–danger, m-button__label–success

在使用css前處理器,如scss。巢狀功能和父選擇器識別符號 & 解決BEM冗長問題

.m-button{
margin: 0px;
&__label{
font-size: 14px;
}
&–success{
background-color: #029627;
}
}

scss中變數 $ 使用

一些整個應用的會常用的顏色 大小 寬高 圖片路徑等,可以放在一個scss檔案中定義。可以做到更改一處,從而進行全域性更改,從而實現“換膚”的功能。

$color-primary: #3ecacb;
$color-success: #4fc48d;
$color-main: #f3d93f;

scss中巧用@mixin和@extend可複用一大段規則

@extend繼承屬性

.common-mod {
  height: 250px;  
  width: 50%;  
  background-color: #fff;  
  text-align: center;
}
&-mod { 
  @extend .common-mod;  
  float: right;
}
&-mod2 { 
  @extend .common-mod;
}

@mixin——可傳遞引數的繼承

@mixin paneactive($image, $level, $vertical) { 
  background: url($image) no-repeat $level $vertical;  
  height: 100px;  
  width: 30px; 
  position: relative;  
  top: 50%;
}
&--left-active {  
  @include paneactive($btn-flip, 0, 0);
}
&--right-active { 
  @include paneactive($btn-flip, 0, -105px);
}

轉載連結 http://percywang.top/#/article/80