摘要:從而輔助整個團(tuán)隊提高代碼質(zhì)量統(tǒng)一代碼規(guī)范。如果你的團(tuán)隊還沒有這么一份代碼評審清單,也許這正是你需要的如果你的團(tuán)隊已經(jīng)有了代碼評審參照標(biāo)準(zhǔn),這份清單也許能起到錦上添花的效果。如果違反這個規(guī)則,那么代碼會很難被測試或者重用。
前言
? 前端團(tuán)隊有評審代碼的要求,但由于每個開發(fā)人員的水平不同,技術(shù)關(guān)注點不同,所以對代碼評審的關(guān)注點不同,為了保證代碼質(zhì)量,團(tuán)隊代碼風(fēng)格統(tǒng)一,特此擬定一份《前端團(tuán)隊代碼評審 CheckList 清單》,這樣代碼評審人員在評審代碼時,可以參照這份清單,對代碼進(jìn)行評審。從而輔助整個團(tuán)隊提高代碼質(zhì)量、統(tǒng)一代碼規(guī)范。如果你的團(tuán)隊還沒有這么一份代碼評審 CheckList 清單,也許這正是你需要的;如果你的團(tuán)隊已經(jīng)有了代碼評審參照標(biāo)準(zhǔn),這份清單也許能起到錦上添花的效果。
辛苦整理良久,還望手動 Star 鼓勵~
github地址為:https://github.com/fengshi123...,如果喜歡或者有所啟發(fā),請幫忙給個 star ~,對作者也是一種鼓勵。
? eslint 檢查的規(guī)范繼承自 eslint-config-standard 檢驗規(guī)則,具體的規(guī)則介紹參照鏈接:https://cn.eslint.org/docs/ru... ,這里及以下部分不再重復(fù)介紹這些檢驗規(guī)則。
1.2、使用 stylelint 工具對 css 樣式代碼進(jìn)行檢查? stylelint 檢查的規(guī)范繼承自 stylelint-config-standard 檢驗規(guī)則,具體的規(guī)則介紹參照鏈接:https://www.npmjs.com/package... ,這里及以下部分不再重復(fù)介紹這些檢驗規(guī)則。
二、命名 2.1、JS 采用 Camel Case 小駝峰式命名推薦:
?? studentInfot2.2、避免名稱冗余
推薦:
const Car = { make: "Honda", model: "Accord", color: "Blue" };
不推薦:
const Car = { carMake: "Honda", carModel: "Accord", carColor: "Blue" };2.3、CSS 類名采用 BEM 命名規(guī)范
推薦:
.block__element{} .block--modifier{}2.4、命名符合語義化
命名需要符合語義化,如果函數(shù)命名,可以采用加上動詞前綴:
動詞 | 含義 |
---|---|
can | 判斷是否可執(zhí)行某個動作 |
has | 判斷是否含有某個值 |
is | 判斷是否為某個值 |
get | 獲取某個值 |
set | 設(shè)置某個值 |
推薦:
//是否可閱讀 function canRead(){ return true; } //獲取姓名 function getName{ return this.name }三、JS 推薦寫法 3.1、每個常量都需命名
每個常量應(yīng)該命名,不然看代碼的人不知道這個常量表示什么意思。
推薦:
const COL_NUM = 10; let row = Math.ceil(num/COL_NUM);
不推薦:
let row = Math.ceil(num/10);3.2、推薦使用字面量
創(chuàng)建對象和數(shù)組推薦使用字面量,因為這不僅是性能最優(yōu)也有助于節(jié)省代碼量。
推薦:
let obj = { name:"tom", age:15, sex:"男" }
不推薦:
let obj = {}; obj.name = "tom"; obj.age = 15; obj.sex = "男";3.3、對象設(shè)置默認(rèn)屬性的推薦寫法
推薦:
const menuConfig = { title: "Order", // User did not include "body" key buttonText: "Send", cancellable: true }; function createMenu(config) { config = Object.assign( { title: "Foo", body: "Bar", buttonText: "Baz", cancellable: true }, config ); // config now equals: {title: "Order", body: "Bar", buttonText: "Send", cancellable: true} // ... } createMenu(menuConfig);
不推薦:
const menuConfig = { title: null, body: "Bar", buttonText: null, cancellable: true }; function createMenu(config) { config.title = config.title || "Foo"; config.body = config.body || "Bar"; config.buttonText = config.buttonText || "Baz"; config.cancellable = config.cancellable !== undefined ? config.cancellable : true; } createMenu(menuConfig);3.4、將對象的屬性值保存為局部變量
對象成員嵌套越深,讀取速度也就越慢。所以好的經(jīng)驗法則是:如果在函數(shù)中需要多次讀取一個對象屬性,最佳做法是將該屬性值保存在局部變量中,避免多次查找?guī)淼男阅荛_銷。
推薦:
let person = { info:{ sex:"男" } } function getMaleSex(){ let sex = person.info.sex; if(sex === "男"){ console.log(sex) } }
不推薦:
let person = { info:{ sex:"男" } } function getMaleSex(){ if(person.info.sex === "男"){ console.log(person.info.sex) } }3.5、字符串轉(zhuǎn)為整型
當(dāng)需要將浮點數(shù)轉(zhuǎn)換成整型時,應(yīng)該使用Math.floor()或者Math.round(),而不是使用parseInt()將字符串轉(zhuǎn)換成數(shù)字。Math是內(nèi)部對象,所以Math.floor()`其實并沒有多少查詢方法和調(diào)用時間,速度是最快的。
推薦:
let num = Math.floor("1.6");
不推薦:
let num = parseInt("1.6");3.6、函數(shù)參數(shù)
函數(shù)參數(shù)越少越好,如果參數(shù)超過兩個,要使用 ES6的解構(gòu)語法,不用考慮參數(shù)的順序。
推薦:
function createMenu({ title, body, buttonText, cancellable }) { // ... } createMenu({ title: "Foo", body: "Bar", buttonText: "Baz", cancellable: true });
不推薦:
function createMenu(title, body, buttonText, cancellable) { // ... }3.7、使用參數(shù)默認(rèn)值
使用參數(shù)默認(rèn)值 替代 使用條件語句進(jìn)行賦值。
推薦:
function createMicrobrewery(name = "Hipster Brew Co.") { // ... }
不推薦:
function createMicrobrewery(name) { const breweryName = name || "Hipster Brew Co."; // ... }3.8、最小函數(shù)準(zhǔn)則
這是一條在軟件工程領(lǐng)域流傳久遠(yuǎn)的規(guī)則。嚴(yán)格遵守這條規(guī)則會讓你的代碼可讀性更好,也更容易重構(gòu)。如果違反這個規(guī)則,那么代碼會很難被測試或者重用 。
3.9、不要寫全局方法在 JavaScript 中,永遠(yuǎn)不要污染全局,會在生產(chǎn)環(huán)境中產(chǎn)生難以預(yù)料的 bug。舉個例子,比如你在 Array.prototype 上新增一個 diff 方法來判斷兩個數(shù)組的不同。而你同事也打算做類似的事情,不過他的 diff 方法是用來判斷兩個數(shù)組首位元素的不同。很明顯你們方法會產(chǎn)生沖突,遇到這類問題我們可以用 ES2015/ES6 的語法來對 Array 進(jìn)行擴展。
推薦:
class SuperArray extends Array { diff(comparisonArray) { const hash = new Set(comparisonArray); return this.filter(elem => !hash.has(elem)); } }
不推薦:
Array.prototype.diff = function diff(comparisonArray) { const hash = new Set(comparisonArray); return this.filter(elem => !hash.has(elem)); };3.10、推薦函數(shù)式編程
函數(shù)式變編程可以讓代碼的邏輯更清晰更優(yōu)雅,方便測試。
推薦:
const programmerOutput = [ { name: "Uncle Bobby", linesOfCode: 500 }, { name: "Suzie Q", linesOfCode: 1500 }, { name: "Jimmy Gosling", linesOfCode: 150 }, { name: "Gracie Hopper", linesOfCode: 1000 } ]; let totalOutput = programmerOutput .map(output => output.linesOfCode) .reduce((totalLines, lines) => totalLines + lines, 0)
不推薦:
const programmerOutput = [ { name: "Uncle Bobby", linesOfCode: 500 }, { name: "Suzie Q", linesOfCode: 1500 }, { name: "Jimmy Gosling", linesOfCode: 150 }, { name: "Gracie Hopper", linesOfCode: 1000 } ]; let totalOutput = 0; for (let i = 0; i < programmerOutput.length; i++) { totalOutput += programmerOutput[i].linesOfCode; }3.11、使用多態(tài)替換條件語句
為了讓代碼更簡潔易讀,如果你的函數(shù)中出現(xiàn)了條件判斷,那么說明你的函數(shù)不止干了一件事情,違反了函數(shù)單一原則 ;并且絕大數(shù)場景可以使用多態(tài)替代
推薦:
class Airplane { // ... } // 波音777 class Boeing777 extends Airplane { // ... getCruisingAltitude() { return this.getMaxAltitude() - this.getPassengerCount(); } } // 空軍一號 class AirForceOne extends Airplane { // ... getCruisingAltitude() { return this.getMaxAltitude(); } } // 賽納斯飛機 class Cessna extends Airplane { // ... getCruisingAltitude() { return this.getMaxAltitude() - this.getFuelExpenditure(); } }
不推薦:
class Airplane { // ... // 獲取巡航高度 getCruisingAltitude() { switch (this.type) { case "777": return this.getMaxAltitude() - this.getPassengerCount(); case "Air Force One": return this.getMaxAltitude(); case "Cessna": return this.getMaxAltitude() - this.getFuelExpenditure(); } } }3.12、定時器是否清除
代碼中使用了定時器 setTimeout 和 setInterval,需要在不使用時進(jìn)行清除。
四、SCSS 推薦寫法 4.1、變量 $ 使用利用scss中的變量配置,可以進(jìn)行項目的顏色、字體大小統(tǒng)一更改(換膚),有利于后期項目的維護(hù)。
推薦:
$--color-success: #67C23A; $--color-warning: #E6A23C; $--color-danger: #F56C6C; $--color-info: #909399;4.2、@import 導(dǎo)入樣式文件
scss中的@import規(guī)則在生成css文件時就把相關(guān)文件導(dǎo)入進(jìn)來。這意味著所有相關(guān)的樣式被歸納到了同一個css文件中,而無需發(fā)起額外的下載請求,在構(gòu)建我們自己的組件庫時推薦使用。
@import "./base.scss"; @import "./pagination.scss"; @import "./dialog.scss"; @import "./autocomplete.scss"; @import "./dropdown.scss"; @import "./dropdown-menu.scss";4.3、局部文件命名的使用
scss局部文件的文件名以下劃線開頭。這樣,scss就不會在編譯時多帶帶編譯這個文件輸出css,而只把這個文件用作導(dǎo)入。
推薦:
不推薦:
5.7、模板中簡單的表達(dá)式
組件模板應(yīng)該只包含簡單的表達(dá)式,復(fù)雜的表達(dá)式則應(yīng)該重構(gòu)為計算屬性或方法。復(fù)雜表達(dá)式會讓你的模板變得不那么聲明式。我們應(yīng)該盡量描述應(yīng)該出現(xiàn)的是什么,而非如何計算那個值。而且計算屬性和方法使得代碼可以重用。
推薦:
{{ normalizedFullName }} // 復(fù)雜表達(dá)式已經(jīng)移入一個計算屬性 computed: { normalizedFullName: function () { return this.fullName.split(" ").map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(" ") } }
不推薦:
{{ fullName.split(" ").map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(" ") }}5.8、簡單的計算屬性
應(yīng)該把復(fù)雜計算屬性分割為盡可能多的更簡單的屬性。
推薦:
computed: { basePrice: function () { return this.manufactureCost / (1 - this.profitMargin) }, discount: function () { return this.basePrice * (this.discountPercent || 0) }, finalPrice: function () { return this.basePrice - this.discount } }
不推薦:
computed: { price: function () { var basePrice = this.manufactureCost / (1 - this.profitMargin) return ( basePrice - basePrice * (this.discountPercent || 0) ) } }5.9、指令縮寫
指令推薦都使用縮寫形式,(用 : 表示 v-bind: 、用 @ 表示 v-on: 和用 # 表示 v-slot:)。
推薦:
不推薦:
5.10、標(biāo)簽順序保持一致單文件組件應(yīng)該總是讓標(biāo)簽順序保持為 、
不推薦: 父子組件的通信推薦使用 prop和 emit ,而不是this.$parent或改變 prop; 兄弟組件之間的通信推薦使用 EventBus($emit /?$on),而不是濫用 vuex; 祖孫組件之間的通信推薦使用 $attrs /?$listeners 或 provide / inject(依賴注入) ,而不是濫用 vuex; 頁面跳轉(zhuǎn),例如 A 頁面跳轉(zhuǎn)到 B 頁面,需要將 A 頁面的數(shù)據(jù)傳遞到 B 頁面,推薦使用 路由參數(shù)進(jìn)行傳參,而不是將需要傳遞的數(shù)據(jù)保存 vuex,然后在 B 頁面取出 vuex的數(shù)據(jù),因為如果在 B 頁面刷新會導(dǎo)致 vuex 數(shù)據(jù)丟失,導(dǎo)致 B 頁面無法正常顯示數(shù)據(jù)。 推薦: script 標(biāo)簽內(nèi)部的聲明順序如下: data > prop > components > filter > computed > watch > 鉤子函數(shù)(鉤子函數(shù)按其執(zhí)行順序) > methods (1)推薦使用計算屬性:計算屬性基于響應(yīng)式依賴進(jìn)行緩存,只在相關(guān)響應(yīng)式依賴發(fā)生改變時它們才會重新求值;相比之下,每次調(diào)用方法都會再次執(zhí)行方法; (2)推薦使用計算屬性:而不是根據(jù) Watch 偵聽屬性,進(jìn)行回調(diào); 但是有計算屬性做不到的:當(dāng)需要在數(shù)據(jù)變化時執(zhí)行異步或開銷較大的操作時,偵聽器是最有用的。 v-if 是“真正”的條件渲染,因為它會確保在切換過程中條件塊內(nèi)的事件監(jiān)聽器和子組件適當(dāng)?shù)乇讳N毀和重建。 v-if 也是惰性的:如果在初始渲染時條件為假,則什么也不做——直到條件第一次變?yōu)檎鏁r,才會開始渲染條件塊。 相比之下,v-show 就簡單得多——不管初始條件是什么,元素總是會被渲染,并且只是簡單地基于 CSS 的屬性 display 進(jìn)行切換。 推薦: 如果運行時,需要非常頻繁地切換,推薦使用 v-show 比較好;如果在運行時,條件很少改變,則推薦使用 v-if 比較好。 因為團(tuán)隊現(xiàn)在使用 vue 框架,所以在項目開發(fā)中盡量使用 vue 的特性去滿足我們的需求,盡量(不到萬不得已)不要手動操作DOM,包括:增刪改dom元素、以及更改樣式、添加事件等。 很多時候有些代碼已經(jīng)沒有用了,但是沒有及時去刪除,這樣導(dǎo)致代碼里面包括很多注釋的代碼塊,好的習(xí)慣是提交代碼前記得刪除已經(jīng)確認(rèn)棄用的代碼,例如:一些調(diào)試的console語句、無用的棄用代碼。 代碼注釋不是越多越好,保持必要的業(yè)務(wù)邏輯注釋,至于函數(shù)的用途、代碼邏輯等,要通過語義化的命令、簡單明了的代碼邏輯,來讓閱讀代碼的人快速看懂。 辛苦整理良久,還望手動 Star 鼓勵~
...
5.11、組件之間通信
let id = " 123";
this.$router.push({name: "homeworkinfo", query: {id:id}});
5.13、script 標(biāo)簽內(nèi)部聲明順序
github地址為:https://github.com/fengshi123...,如果喜歡或者有所啟發(fā),請幫忙給個 star ~,對作者也是一種鼓勵。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105435.html
摘要:它基于前端開發(fā)人員多年的經(jīng)驗沉淀,以及其他優(yōu)秀的開源清單。在上投票或推薦來幫助前端清單的推廣。跨站點請求偽造防范清單跨站腳本攻擊頁面或網(wǎng)站沒有攻擊的可能性。 原文地址:Front-End-Checklist 原文作者:David Dias 譯者:JohnsenZhou 文章地址:https://github.com/JohnsenZhou/Front-End-Checklist...
摘要:它基于前端開發(fā)人員多年的經(jīng)驗沉淀,以及其他優(yōu)秀的開源清單。在上投票或推薦來幫助前端清單的推廣。跨站點請求偽造防范清單跨站腳本攻擊頁面或網(wǎng)站沒有攻擊的可能性。 原文地址:Front-End-Checklist 原文作者:David Dias 譯者:JohnsenZhou 文章地址:https://github.com/JohnsenZhou/Front-End-Checklist...
摘要:它基于前端開發(fā)人員多年的經(jīng)驗沉淀,以及其他優(yōu)秀的開源清單。在上投票或推薦來幫助前端清單的推廣。跨站點請求偽造防范清單跨站腳本攻擊頁面或網(wǎng)站沒有攻擊的可能性。 原文地址:Front-End-Checklist 原文作者:David Dias 譯者:JohnsenZhou 文章地址:https://github.com/JohnsenZhou/Front-End-Checklist...
本文收集學(xué)習(xí)過程中使用到的資源。 持續(xù)更新中…… 項目地址 https://github.com/abc-club/f... 目錄 vue react react-native Weex typescript Taro nodejs 常用庫 css js es6 移動端 微信公眾號 小程序 webpack GraphQL 性能與監(jiān)控 高質(zhì)文章 趨勢 動效 數(shù)據(jù)結(jié)構(gòu)與算法 js core 代碼規(guī)范...
閱讀 2928·2021-10-14 09:42
閱讀 3694·2021-08-11 11:19
閱讀 3542·2019-08-30 13:57
閱讀 3120·2019-08-30 13:49
閱讀 1534·2019-08-29 18:38
閱讀 898·2019-08-29 13:16
閱讀 1850·2019-08-26 13:25
閱讀 3230·2019-08-26 13:24