最后更新時(shí)間:2017-06-25
原始文章鏈接:https://github.com/bxm0927/web-code-standards
此項(xiàng)目用于記錄規(guī)范的、高可維護(hù)性的前端代碼,這是通過(guò)分析 Github 眾多前端代碼庫(kù),總結(jié)出來(lái)的前端代碼書(shū)寫(xiě)規(guī)范。
目錄
License
public domain, Just take it.
Thanks
@Ruan YiFeng: https://github.com/ruanyf
@materliu:https://materliu.github.io/code-guide
@hzlzh: https://github.com/hzlzh/Front-End-Standards
@tguide: http://tguide.qq.com/main/base.htm
前端普適性規(guī)范
黃金定律
永遠(yuǎn)遵循同一套編碼規(guī)范,可以是這里列出的,也可以是你自己總結(jié)的。如果你發(fā)現(xiàn)本
規(guī)范中有任何錯(cuò)誤,敬請(qǐng)指正。
不管有多少人共同參與同一項(xiàng)目,一定要確保每一行代碼都像是同一個(gè)人編寫(xiě)的。
項(xiàng)目命名
項(xiàng)目名全部采用小寫(xiě)方式,以中劃線分隔,禁止駝峰式命名。比如:my-project-name
文件命名
文件命名參照上一條規(guī)則,多個(gè)單詞組成時(shí),采用中劃線連接方式,比如說(shuō): error-report.html
有復(fù)數(shù)結(jié)構(gòu)時(shí),要采用復(fù)數(shù)命名法,比如說(shuō): scripts, styles, images, data-models
文件名中只可由小寫(xiě)英文字母a~z、排序數(shù)字0~9或間隔符-組成,禁止包含特殊符號(hào),比如空格、$等
為更好的表達(dá)語(yǔ)義,文件名使用英文名詞命名,或英文簡(jiǎn)寫(xiě)。
不允許命名帶有廣告等英文的單詞,例如ad,adv,adver,advertising,防止該模塊被瀏覽器當(dāng)成垃圾廣告過(guò)濾掉。任何文件的命名均如此。
index.shtml 引導(dǎo)頁(yè)&首頁(yè)
main.shtml 首頁(yè)
download.shtml 下載頁(yè)面
act.html 活動(dòng)列表頁(yè)面
video.html 視頻
cdkey.html CDKEY頁(yè)面
base.css 基本樣式
layout.css 框架布局
module.css 模塊樣式
global.css 全局樣式
font.css 字體樣式
index.css 首頁(yè)樣式
link.css 鏈接樣式
print.css 打印樣式
HTML 規(guī)范
語(yǔ)法
使用四個(gè)空格的縮進(jìn),這是保證代碼在各種環(huán)境下顯示一致的唯一方式。
嵌套的節(jié)點(diǎn)應(yīng)該縮進(jìn)(四個(gè)空格)。
在屬性上,使用雙引號(hào),不要使用單引號(hào)。
不要在自動(dòng)閉合標(biāo)簽結(jié)尾處使用斜線 - HTML5 規(guī)范 指出他們是可選的。
不要忽略可選的關(guān)閉標(biāo)簽(例如, 和 </body>)。
![](images/logo.png)
HTML5 doctype
在每個(gè) HTML 頁(yè)面開(kāi)頭使用這個(gè)簡(jiǎn)單地 doctype 來(lái)啟用標(biāo)準(zhǔn)模式,使其每個(gè)瀏覽器中盡可能一致的展現(xiàn)。
雖然doctype不區(qū)分大小寫(xiě),但是按照慣例,doctype大寫(xiě)
<!DOCTYPE html>
語(yǔ)言屬性
<html lang="en"> </html>
字符編碼
通過(guò)明確聲明字符編碼,能夠確保瀏覽器快速并容易的判斷頁(yè)面內(nèi)容的渲染方式。這樣
做的好處是,可以避免在 HTML 中使用字符實(shí)體標(biāo)記(character entity),從而全部與
文檔編碼一致(一般采用 UTF-8 編碼)。
<meta charset="UTF-8">
IE 兼容模式
IE 支持通過(guò)特定的 <meta> 標(biāo)簽來(lái)確定繪制當(dāng)前頁(yè)面所應(yīng)該采用的 IE 版本。除非有強(qiáng)烈
的特殊需求,否則最好是設(shè)置為 edge mode,從而通知 IE 采用其所支持的最新的模
式。
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
響應(yīng)式
<meta name="viewport" content="width=device-width, initial-scale=1">
引入 CSS 和 JavaScript
根據(jù) HTML5 規(guī)范, 通常在引入 CSS 和 JavaScript 時(shí)不需要指明 type,因?yàn)?text/css 和 text/javascript 分別是他們的默認(rèn)值。
<!-- External CSS --> <link rel="stylesheet" href="code-guide.css"> <!-- In-document CSS --> <style> /* ... */ </style> <!-- JavaScript --> <script src="code-guide.js"></script>
實(shí)用高于完美
盡量遵循 HTML 標(biāo)準(zhǔn)和語(yǔ)義,但是不應(yīng)該以浪費(fèi)實(shí)用性作為代價(jià)。任何時(shí)候都要用盡量小的復(fù)雜度和盡量少的標(biāo)簽來(lái)解決問(wèn)題。
減少標(biāo)簽數(shù)量
在編寫(xiě) HTML 代碼時(shí),需要盡量避免多余的父節(jié)點(diǎn)。很多時(shí)候,需要通過(guò)迭代和重構(gòu)來(lái)使 HTML 變得更少。 參考下面的示例:
<!-- Not so great --> <span class="avatar"> ![](...) </span> <!-- Better --> ![](...)
屬性順序
HTML 屬性應(yīng)該按照特定的順序出現(xiàn)以保證易讀性。
class
id
name
data-*
src, for, type, href, value , max-length, max, min, pattern
placeholder, title, alt
aria-*, role
required, readonly, disabled
class 是為高可復(fù)用組件設(shè)計(jì)的,理論上他們應(yīng)處在第一位。id 更加具體而且應(yīng)該盡量少使用(例如, 頁(yè)內(nèi)書(shū)簽),所以他們處在第二位。
Boolean 屬性
Boolean 屬性指不需要聲明取值的屬性。XHTML 需要每個(gè)屬性聲明取值,但是 HTML5 并不需要。
一個(gè)元素中 Boolean 屬性的存在表示取值 true,不存在則表示取值 false。
簡(jiǎn)而言之,不要為 Boolean 屬性添加取值。
<input type="text" disabled>
JavaScript 生成標(biāo)簽
在 JavaScript 文件中生成標(biāo)簽讓內(nèi)容變得更難查找,更難編輯,性能更差。應(yīng)該盡量避免這種情況的出現(xiàn)。
CSS 規(guī)范
語(yǔ)法
使用四個(gè)空格的縮進(jìn),這是保證代碼在各種環(huán)境下顯示一致的唯一方式。
使用組合選擇器時(shí),保持每個(gè)獨(dú)立的選擇器占用一行。
為了代碼的易讀性,在每個(gè)聲明的左括號(hào)前增加一個(gè)空格。
聲明塊的右括號(hào)應(yīng)該另起一行。
每條聲明 : 后應(yīng)該插入一個(gè)空格。
每條聲明應(yīng)該只占用一行來(lái)保證錯(cuò)誤報(bào)告更加準(zhǔn)確。
所有聲明應(yīng)該以分號(hào)結(jié)尾。雖然最后一條聲明后的分號(hào)是可選的,但是如果沒(méi)有他,你的代碼會(huì)更容易出錯(cuò)。
逗號(hào)分隔的取值,都應(yīng)該在逗號(hào)之后增加一個(gè)空格。
不要在顏色值 rgb() rgba() hsl() hsla()和 rect() 中增加空格,并且不要帶有取值前面不必要的 0 (比如,使用 .5 替代 0.5)。
所有的十六進(jìn)制值都應(yīng)該使用小寫(xiě)字母,例如 #fff。因?yàn)樾?xiě)字母有更多樣的外形,在瀏覽文檔時(shí),他們能夠更輕松的被區(qū)分開(kāi)來(lái)。
盡可能使用短的十六進(jìn)制數(shù)值,例如使用 #fff 替代 #ffffff。
為選擇器中的屬性取值添加引號(hào),例如 input[type="text"]。 他們只在某些情況下可有可無(wú),所以都使用引號(hào)可以增加一致性。
不要為 0 指明單位,比如使用 margin: 0; 而不是 margin: 0px;。
/* Bad CSS */ .selector, .selector-secondary, .selector[type=text] { margin: 0px 0px 15px; background-color: rgba(0, 0, 0, 0.5); box-shadow: 0 1px 2px #CCC, inset 0 1px 0 #FFFFFF } /* Good CSS */ .selector, .selector-secondary, .selector[type="text"] { margin-bottom: 15px; background-color: rgba(0,0,0,.5); box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff; }
聲明順序
相關(guān)的屬性聲明應(yīng)該以下面的順序分組處理:
Positioning
Box model 盒模型
Typographic 排版
Visual 外觀
Positioning 處在第一位,因?yàn)樗梢允挂粋€(gè)元素脫離正常文本流,并且覆蓋盒模型相關(guān)的樣式。盒模型緊跟其后,因?yàn)樗麤Q定了一個(gè)組件的大小和位置。
其他屬性只在組件內(nèi)部起作用或者不會(huì)對(duì)前面兩種情況的結(jié)果產(chǎn)生影響,所以他們排在后面。
.declaration-order { /* Positioning */ position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 100; /* Box-model */ display: block; float: right; width: 100px; height: 100px; /* Typography */ font: normal 13px "Helvetica Neue", sans-serif; line-height: 1.5; color: #333; text-align: center; /* Visual */ background-color: #f5f5f5; border: 1px solid #e5e5e5; border-radius: 3px; /* Misc */ opacity: 1; }
Don't use @import
與<link>
相比,@import
較慢,增加額外的頁(yè)面請(qǐng)求,并可能導(dǎo)致其他不可預(yù)見(jiàn)的問(wèn)題。
<!-- Use link elements --> <link rel="stylesheet" href="core.css"> <!-- Avoid @imports --> <style> @import url("more.css"); </style>
媒體查詢位置
盡量將媒體查詢的位置靠近他們相關(guān)的規(guī)則。不要將他們一起放到一個(gè)獨(dú)立的樣式文件中,或者丟在文檔的最底部。這樣做只會(huì)讓大家以后更容易忘記他們。這里是一個(gè)典型的案例。
.element { ... } .element-avatar { ... } .element-selected { ... } @media (min-width: 480px) { .element { ...} .element-avatar { ... } .element-selected { ... } }
前綴屬性
當(dāng)使用廠商前綴屬性時(shí),通過(guò)縮進(jìn)使取值垂直對(duì)齊以便多行編輯。
/* Prefixed properties */ .selector { -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15); box-shadow: 0 1px 2px rgba(0,0,0,.15); }
單條聲明的聲明塊
在一個(gè)聲明塊中只包含一條聲明的情況下,為了易讀性和快速編輯可以考慮移除其中的換行。所有包含多條聲明的聲明塊應(yīng)該分為多行。
這樣做的關(guān)鍵因素是錯(cuò)誤檢測(cè) - 例如,一個(gè) CSS 驗(yàn)證程序顯示你在 183 行有一個(gè)語(yǔ)法錯(cuò)誤,如果是一個(gè)單條聲明的行,那就是他了。在多個(gè)聲明的情況下,你必須為哪里出錯(cuò)了費(fèi)下腦子。
.span1 { width: 60px; } .span2 { width: 140px; } .span3 { width: 220px; }
屬性簡(jiǎn)寫(xiě)
盡量不使用屬性簡(jiǎn)寫(xiě)的方式,屬性簡(jiǎn)寫(xiě)需要你必須顯式設(shè)置所有取值。常見(jiàn)的屬性簡(jiǎn)寫(xiě)濫用包括:
padding
margin
font
background
-border
-border-radius
大多數(shù)情況下,我們并不需要設(shè)置屬性簡(jiǎn)寫(xiě)中包含的所有值。例如,HTML 頭部只設(shè)置上下的 margin,所以如果需要,只設(shè)置這兩個(gè)值。過(guò)度使用屬性簡(jiǎn)寫(xiě)往往會(huì)導(dǎo)致更混亂的代碼,其中包含不必要的重寫(xiě)和意想不到的副作用。
/* Bad example */ .element { margin: 0 0 10px; background: red; background: url("image.jpg"); border-radius: 3px 3px 0 0; } /* Good example */ .element { margin-bottom: 10px; background-color: red; background-image: url("image.jpg"); border-top-left-radius: 3px; border-top-right-radius: 3px; }
Less 和 Sass 中的嵌套
避免不必要的嵌套??梢赃M(jìn)行嵌套,不意味著你應(yīng)該這樣做。只有在需要給父元素增加樣式并且同時(shí)存在多個(gè)子元素時(shí)才需要考慮嵌套。
// Without nesting .table > thead > tr > th { … } .table > thead > tr > td { … } // With nesting .table > thead > tr { > th { … } > td { … } }
代碼注釋
代碼是由人來(lái)編寫(xiě)和維護(hù)的。保證你的代碼是描述性的,包含好的注釋,并且容易被他人理解。好的代碼注釋傳達(dá)上下文和目標(biāo)。不要簡(jiǎn)單地重申組件或者 class 名稱。
class 命名
保持 class 命名為全小寫(xiě),可以使用短劃線(不要使用下劃線和 camelCase 命名)。短劃線應(yīng)該作為相關(guān)類的自然間斷。(例如,.btn 和 .btn-danger)。
避免過(guò)度使用簡(jiǎn)寫(xiě)。.btn 可以很好地描述 button,但是 .s 不能代表任何元素。
class 的命名應(yīng)該盡量短,也要盡量明確。
使用有意義的名稱;使用結(jié)構(gòu)化或者作用目標(biāo)相關(guān),而不是抽象的名稱。
命名時(shí)使用最近的父節(jié)點(diǎn)或者父 class 作為前綴。
使用 .js-* 來(lái)表示行為(相對(duì)于樣式),但是不要在 CSS 中包含這些 class。
選擇器
使用 class 而不是通用元素標(biāo)簽來(lái)優(yōu)化渲染性能。
避免在經(jīng)常出現(xiàn)的組件中使用一些屬性選擇器 (例如,[class^="..."])。瀏覽器性能會(huì)受到這些情況的影響。
減少選擇器的長(zhǎng)度,每個(gè)組合選擇器選擇器的條目應(yīng)該盡量控制在 3 個(gè)以內(nèi)。
只在必要的情況下使用后代選擇器 (例如,沒(méi)有使用帶前綴 classes 的情況).
代碼組織
以組件為單位組織代碼。
制定一個(gè)一致的注釋層級(jí)結(jié)構(gòu)。
使用一致的空白來(lái)分割代碼塊,這樣做在查看大的文檔時(shí)更有優(yōu)勢(shì)。
當(dāng)使用多個(gè) CSS 文件時(shí),通過(guò)組件而不是頁(yè)面來(lái)區(qū)分他們。頁(yè)面會(huì)被重新排列,而組件移動(dòng)就可以了。
編輯器配置
根據(jù)以下的設(shè)置來(lái)配置你的編輯器,將這些設(shè)置應(yīng)用到項(xiàng)目的 .editorconfig 文件,來(lái)避免常見(jiàn)的代碼不一致和丑陋的 diffs。
使用四個(gè)空格的縮進(jìn)。
在保存時(shí)刪除尾部的空白字符。
設(shè)置文件編碼為 UTF-8。
在文件結(jié)尾添加一個(gè)空白行。
JS 規(guī)范
語(yǔ)法
使用四個(gè)空格的縮進(jìn),這是保證代碼在各種環(huán)境下顯示一致的唯一方式。
聲明之后一律以分號(hào)結(jié)束, 不可以省略
完全避免 == != 的使用, 用嚴(yán)格比較條件 === !==
eval 非特殊情況, 禁用!?。?/p>
with 非特殊情況, 禁用?。?!
單行長(zhǎng)度,理論上不要超過(guò)80列,不過(guò)如果編輯器開(kāi)啟"自動(dòng)換行"的話可以不考慮單行長(zhǎng)度
接上一條,如果需要換行,存在操作符的情況,一定在操作符后換行,然后換的行縮進(jìn)4個(gè)空格
這里要注意,如果是多次換行的話就沒(méi)有必要繼續(xù)縮進(jìn)了,比如說(shuō)下面這種就是最佳格式。
if (typeof qqfind === "undefined" || typeof qqfind.cdnrejected === "undefined" || qqfind.cdnrejected !== true) { url = "http://pub.idqqimg.com/qqfind/js/location4.js"; } else { url = "http://find.qq.com/js/location4.js"; }
空行
方法之間加
單行或多行注釋前加
邏輯塊之間加空行增加可讀性
變量命名
標(biāo)準(zhǔn)變量采用駝峰標(biāo)識(shí)
使用的ID的地方一定全大寫(xiě)
使用的URL的地方一定全大寫(xiě), 比如說(shuō) reportURL
涉及Android的,一律大寫(xiě)第一個(gè)字母
涉及iOS的,一律小寫(xiě)第一個(gè),大寫(xiě)后兩個(gè)字母
常量采用大寫(xiě)字母,下劃線連接的方式
構(gòu)造函數(shù),大寫(xiě)第一個(gè)字母
var thisIsMyName; var goodID; var AndroidVersion; var iOSVersion; var MAX_COUNT = 10; function Person(name) { this.name = name }
字符常量
一般情況下統(tǒng)一使用單引號(hào)
null的使用場(chǎng)景
初始化可能以后分配對(duì)象值的變量
與一個(gè)可能或可能沒(méi)有對(duì)象值的初始化變量進(jìn)行比較
傳入一個(gè)預(yù)期對(duì)象的函數(shù)
從預(yù)期對(duì)象的函數(shù)返回
不適合null的使用場(chǎng)景
不要使用null來(lái)測(cè)試是否提供參數(shù)
不要測(cè)試值為null的未初始化變量
undefined使用場(chǎng)景
永遠(yuǎn)不要直接使用undefined進(jìn)行變量判斷
使用字符串 "undefined" 對(duì)變量進(jìn)行判斷
// Bad var person; console.log(person === undefined); //true // Good console.log(typeof person); // "undefined"
對(duì)象字面量
// Bad var team = new Team(); team.title = "AlloyTeam"; team.count = 25; // Good var team = { title: "AlloyTeam", count: 25 };
數(shù)組聲明
// Bad var colors = new Array("red", "green", "blue"); var numbers = new Array(1, 2, 3, 4); // Good var colors = [ "red", "green", "blue" ]; var numbers = [ 1, 2, 3, 4 ];
單行注釋
雙斜線后,必須跟注釋內(nèi)容保留一個(gè)空格
與下一行代碼縮進(jìn)保持一致
可位于一個(gè)代碼行的末尾,雙斜線距離分號(hào)四個(gè)空格
// Good if (condition) { // if you made it here, then all security checks passed allowed(); } var zhangsan = "zhangsan"; // 雙斜線距離分號(hào)四個(gè)空格,雙斜線后始終保留一個(gè)空格
多行注釋格式
最少三行
前邊留空一行
/** * 注釋內(nèi)容與星標(biāo)前保留一個(gè)空格 */
何時(shí)使用多行注釋格式
難于理解的代碼段
可能存在錯(cuò)誤的代碼段
瀏覽器特殊的HACK代碼
業(yè)務(wù)邏輯強(qiáng)相關(guān)的代碼
想吐槽的產(chǎn)品邏輯, 合作同事
文檔注釋
各類標(biāo)簽 @param @method 等 參考 http://usejsdoc.org/
用于:方法、構(gòu)造函數(shù)、對(duì)象
/** * here boy, look here , here is girl * @method lookGril * @param {Object} balabalabala * @return {Object} balabalabala */
括號(hào)對(duì)齊
標(biāo)準(zhǔn)示例 括號(hào)前后有空格,花括號(hào)起始不另?yè)Q行,結(jié)尾新起一行
花括號(hào)必須要,即使內(nèi)容只有一行
涉及 if for while do...while try...catch...finally 的地方都必須使用花括號(hào),即使內(nèi)容只有一行
if else 前后留有空格
if (condition) { doSomething(); } else { doSomethingElse(); }
switch
switch和括號(hào)之間有空格,case需要縮進(jìn),break之后跟下一個(gè)case中間留一個(gè)空白行
花括號(hào)必須要, 即使內(nèi)容只有一行。
switch 的 falling through 一定要有注釋特別說(shuō)明,no default 的情況也需要注釋特別說(shuō)明況
switch (condition) { case "first": // code break; case "second": // code break; default: // code }
for
普通for循環(huán), 分號(hào)后留有一個(gè)空格, 判斷條件等內(nèi)的操作符兩邊不留空格
前置條件如果有多個(gè),逗號(hào)后留一個(gè)空格
for-in 一定要有 hasOwnProperty 的判斷, 否則 JSLint 或者 JSHint 都會(huì)有一個(gè) warn
for (i=0, len=values.length; i<len; i++) { pr
http://www.cnblogs.com/bxm0927/p/7077075.html