精簡(jiǎn)版嚴(yán)格代碼規(guī)范

最佳原則

堅(jiān)持制定好的代碼規(guī)范泰讽。

無(wú)論團(tuán)隊(duì)人數(shù)多少手蝎,代碼應(yīng)該同出一門(mén)显熏。

以下為精簡(jiǎn)且必須堅(jiān)持的代碼規(guī)范雄嚣。精簡(jiǎn)版從綜合目前小鯨的代碼習(xí)慣在騰訊團(tuán)隊(duì)的規(guī)范文檔中進(jìn)行了提取和修改。更多詳細(xì)內(nèi)容請(qǐng)參看
Code Guide by @AlloyTeam喘蟆。


命名規(guī)范

文件命名

全部采用駝峰方式。

例:myProjectName.js myProjectName.css

git分支命名

新需求開(kāi)發(fā)以 feature/{關(guān)鍵詞}_{擬發(fā)布日期}開(kāi)頭

bug修復(fù)以 hotfix/{關(guān)鍵詞}_{擬發(fā)布日期}開(kāi)頭

關(guān)鍵詞全部為小寫(xiě)鼓鲁,以下劃線(xiàn)分割

日期格式為20200306

例:feature/update_coupons_20200306 hotfix/image_change_type_20200306


HTML

語(yǔ)法
  • 縮進(jìn)使用soft tab(4個(gè)空格)蕴轨;
  • 在屬性上,使用雙引號(hào)骇吭,不要使用單引號(hào)橙弱;
  • 不要在自動(dòng)閉合標(biāo)簽結(jié)尾處使用斜線(xiàn)(HTML5 規(guī)范 指出他們是可選的);
<!DOCTYPE html>
<html>
    <head>
        <title>Page title</title>
    </head>
    <body>
        <img src="images/company_logo.png" alt="Company">

        <h1 class="hello-world">Hello, world!</h1>
    </body>
</html>
lang屬性

根據(jù)HTML5規(guī)范:

應(yīng)在html標(biāo)簽上加上lang屬性燥狰。這會(huì)給語(yǔ)音工具和翻譯工具幫助棘脐,告訴它們應(yīng)當(dāng)怎么去發(fā)音和翻譯。

但sitepoint只是給出了語(yǔ)言的大類(lèi)龙致,例如中文只給出了zh蛀缝,但是沒(méi)有區(qū)分香港,臺(tái)灣目代,大陸屈梁。而微軟給出了一份更加詳細(xì)的語(yǔ)言列表,其中細(xì)分了zh-cn, zh-hk, zh-tw榛了。

<!DOCTYPE html>
<html lang="en-us">
    ...
</html>
字符編碼

通過(guò)聲明一個(gè)明確的字符編碼在讶,讓瀏覽器輕松、快速的確定適合網(wǎng)頁(yè)內(nèi)容的渲染方式霜大,通常指定為'UTF-8'构哺。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    ...
</html>

IE兼容模式

用 <meta> 標(biāo)簽可以指定頁(yè)面應(yīng)該用什么版本的IE來(lái)渲染;

如果你想要了解更多战坤,請(qǐng)點(diǎn)擊這里曙强;

不同doctype在不同瀏覽器下會(huì)觸發(fā)不同的渲染模式(這篇文章總結(jié)的很到位)。


css&scss

主要注意命名湖笨,其他格式問(wèn)題旗扑,按照編輯器格式化,就可以慈省。

縮進(jìn)

使用soft tab(4個(gè)空格)臀防。

命名

  • 類(lèi)名使用小寫(xiě)字母眠菇,以中劃線(xiàn)分隔
  • id采用駝峰式命名
  • scss中的變量、函數(shù)袱衷、混合捎废、placeholder采用駝峰式命名
/* class */
.element-content {
    ...
}

/* id */
#myDialog {
    ...
}

/* 變量 */
$colorBlack: #000;

/* 函數(shù) */
@function pxToRem($px) {
    ...
}

/* 混合 */
@mixin centerBlock {
    ...
}

/* placeholder */
%myDialog {
    ...
}

顏色

顏色16進(jìn)制用小寫(xiě)字母;

顏色16進(jìn)制盡量用簡(jiǎn)寫(xiě)致燥。

/* not good */
.element {
    color: #ABCDEF;
    background-color: #001122;
}

/* good */
.element {
    color: #abcdef;
    background-color: #012;
}

雜項(xiàng)
  • 不允許有空的規(guī)則登疗;
/* not good */
.element {
}
  • 元素選擇器用小寫(xiě)字母;
/* not good */
LI {
    ...
}
  • 去掉小數(shù)點(diǎn)前面的0嫌蚤;
/* not good */
.element {
    color: rgba(0, 0, 0, 0.5);
}

/* good */
.element {
    color: rgba(0, 0, 0, .5);
}
  • 屬性值'0'后面不要加單位辐益;
/* not good */
.element {
    width: 0px;
}

/* good */
.element {
    width: 0;
}
  • 不要在同個(gè)規(guī)則里出現(xiàn)重復(fù)的屬性,如果重復(fù)的屬性是連續(xù)的則沒(méi)關(guān)系脱吱;
/* not good */
.element {
    color: rgb(0, 0, 0);
    width: 50px;
    color: rgba(0, 0, 0, .5);
}

/* good */
.element {
    color: rgb(0, 0, 0);
    color: rgba(0, 0, 0, .5);
}
  • 不要在一個(gè)文件里出現(xiàn)兩個(gè)相同的規(guī)則智政;

  • 用 border: 0; 代替 border: none;;

  • 選擇器不要超過(guò)4層(在scss中如果超過(guò)4層應(yīng)該考慮用嵌套的方式來(lái)寫(xiě))箱蝠;

  • 發(fā)布的代碼中不要有 @import续捂;

  • 盡量少用'*'選擇器。


JavaScript

變量命名
  • 標(biāo)準(zhǔn)變量采用駝峰式命名(除了對(duì)象的屬性外宦搬,主要是考慮到cgi返回的數(shù)據(jù))
  • 'ID'在變量名中全大寫(xiě)
  • 'URL'在變量名中全大寫(xiě)
  • 'Android'在變量名中大寫(xiě)第一個(gè)字母
  • 'iOS'在變量名中小寫(xiě)第一個(gè)牙瓢,大寫(xiě)后兩個(gè)字母
  • 常量全大寫(xiě),用下劃線(xiàn)連接
  • 構(gòu)造函數(shù)间校,大寫(xiě)第一個(gè)字母
  • jquery對(duì)象必須以'$'開(kāi)頭命名
var thisIsMyName;

var goodID;

var reportURL;

var AndroidVersion;

var iOSVersion;

var MAX_COUNT = 10;

function Person(name) {
    this.name = name;
}

// not good
var body = $('body');

// good
var $body = $('body');

變量聲明

一個(gè)函數(shù)作用域中所有的變量聲明盡量提到函數(shù)首部矾克,用一個(gè)var聲明,不允許出現(xiàn)兩個(gè)連續(xù)的var聲明撇簿。

function doSomethingWithItems(items) {
    // use one var
    var value = 10,
        result = value + 10,
        i,
        len;

    for (i = 0, len = items.length; i < len; i++) {
        result += 10;
    }
}

縮進(jìn)

使用soft tab(4個(gè)空格)聂渊。

分號(hào)

以下幾種情況后需加分號(hào):

  • 變量聲明
  • 表達(dá)式
  • return
  • throw
  • break
  • continue
  • do-while
/* var declaration */
var x = 1;

/* expression statement */
x++;

/* do-while */
do {
    x++;
} while (x < 10);

空格

書(shū)寫(xiě)時(shí)多注意,盡量保持代碼的美觀(guān)整潔四瘫,不做過(guò)分要求汉嗽。

空行

以下幾種情況需要空行:

  • 變量聲明后(當(dāng)變量聲明在代碼塊的最后一行時(shí),則無(wú)需空行)
  • 注釋前(當(dāng)注釋在代碼塊的第一行時(shí)找蜜,則無(wú)需空行)
  • 代碼塊后(在函數(shù)調(diào)用饼暑、數(shù)組、對(duì)象中則無(wú)需空行)
  • 文件最后保留一個(gè)空行
// need blank line after variable declaration
var x = 1;

// not need blank line when variable declaration is last expression in the current block
if (x >= 1) {
    var y = x + 1;
}

var a = 2;

// need blank line before line comment
a++;

function b() {
    // not need blank line when comment is first line of block
    return a;
}

// need blank line after blocks
for (var i = 0; i < 2; i++) {
    if (true) {
        return false;
    }

    continue;
}

var obj = {
    foo: function() {
        return 1;
    },

    bar: function() {
        return 2;
    }
};
換行

換行的地方洗做,行末必須有','或者運(yùn)算符弓叛;

// not good
var a = {
    b: 1
    , c: 2
};

x = y
    ? 1 : 2;

// good
var a = {
    b: 1,
    c: 2
};

x = y ? 1 : 2;
x = y ?
    1 : 2;

以下幾種情況不需要換行:

  • 下列關(guān)鍵字后:else, catch, finally
  • 代碼塊'{'前
// no need line break with 'else', 'catch', 'finally'
if (condition) {
    ...
} else {
    ...
}

try {
    ...
} catch (e) {
    ...
} finally {
    ...
}

以下幾種情況需要換行:

  • 代碼塊'{'后和'}'前
  • 變量賦值后
數(shù)組、對(duì)象

對(duì)象屬性名不需要加引號(hào)诚纸;

對(duì)象以縮進(jìn)的形式書(shū)寫(xiě)撰筷,不要寫(xiě)在一行;

數(shù)組畦徘、對(duì)象最后不要有逗號(hào)毕籽。

// not good
var a = {
    'b': 1
};

var a = {b: 1};

var a = {
    b: 1,
    c: 2,
};

// good
var a = {
    b: 1,
    c: 2
};

單行注釋?zhuān)?=重點(diǎn)==)

雙斜線(xiàn)后抬闯,必須跟一個(gè)空格;

縮進(jìn)與下一行代碼保持一致关筒;

可位于一個(gè)代碼行的末尾溶握,與代碼間隔一個(gè)空格。


if (condition) {
    // if you made it here, then all security checks passed
    allowed();
}

var zhangsan = 'zhangsan'; // one space after code

多行注釋?zhuān)?=重點(diǎn)==)

最少三行, '*'后跟一個(gè)空格蒸播,具體參照右邊的寫(xiě)法睡榆;

建議在以下情況下使用:

  • 難于理解的代碼段
  • 可能存在錯(cuò)誤的代碼段
  • 瀏覽器特殊的HACK代碼
  • 業(yè)務(wù)邏輯強(qiáng)相關(guān)的代碼
文檔注釋?zhuān)?=重點(diǎn)==)

各類(lèi)標(biāo)簽@param, @method等請(qǐng)參考usejsdoc和JSDoc Guide;

建議在以下情況下使用:

  • 所有常量
  • 所有函數(shù)
  • 所有類(lèi)
/**
 * @desc 一個(gè)帶參數(shù)的函數(shù)
 * @builder lixuepeng
 * @update lixuepeng [20200306]
 * @param {string} a - 參數(shù)a
 * @param {number} b=1 - 參數(shù)b默認(rèn)值為1
 * @param {string} c=1 - 參數(shù)c有兩種支持的取值</br>1—表示x</br>2—表示xx
 * @param {object} d - 參數(shù)d為一個(gè)對(duì)象
 * @param {string} d.e - 參數(shù)d的e屬性
 * @param {string} d.f - 參數(shù)d的f屬性
 * @param {object[]} g - 參數(shù)g為一個(gè)對(duì)象數(shù)組
 * @param {string} g.h - 參數(shù)g數(shù)組中一項(xiàng)的h屬性
 * @param {string} g.i - 參數(shù)g數(shù)組中一項(xiàng)的i屬性
 * @param {string} [j] - 參數(shù)j是一個(gè)可選參數(shù)
 */
function foo(a, b, c, d, g, j) {
    ...
}

引號(hào)

最外層統(tǒng)一使用單引號(hào)袍榆。

// not good
var x = "test";

// good
var y = 'foo',
    z = '<div id="test"></div>';
括號(hào)

下列關(guān)鍵字后必須有大括號(hào)(即使代碼塊的內(nèi)容只有一行):if, else, for, while, do, switch, try, catch, finally, with胀屿。

// not good
if (condition)
    doSomething();

// good
if (condition) {
    doSomething();
}
jshint
  • 用'===', '!=='代替'==', '!=';
  • for-in里一定要有hasOwnProperty的判斷蜡塌;
// good
for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        // be sure that obj[key] belongs to the object and was not inherited
        console.log(obj[key]);
    }
}
  • 不要在內(nèi)置對(duì)象的原型上添加方法碉纳,如Array, Date;
// not good
Array.prototype.count = function(value) {
    return 4;
};

  • 不要在內(nèi)層作用域的代碼里聲明了變量馏艾,之后卻訪(fǎng)問(wèn)到了外層作用域的同名變量;
// not good
var x = 1;

function test() {
    if (true) {
        var x = 0;
    }

    x += 1;
}
  • 不要在一句代碼中單單使用構(gòu)造函數(shù)奴愉,記得將其賦值給某個(gè)變量琅摩;
// not good
new Person();

// good
var person = new Person();
  • 不要在一些不需要的地方加括號(hào),例:delete(a.b)锭硼;
  • 不要聲明了變量卻不使用房资;
  • 不要在應(yīng)該做比較的地方做賦值;
// not good
if (a = 10) {
    a++;
}
  • debugger不要出現(xiàn)在提交的代碼里;
  • 數(shù)組中不要存在空元素檀头;
  • 不要在循環(huán)內(nèi)部聲明函數(shù)轰异;
// not good
var nums = [];

for (var i = 0; i < 10; i++) {
    (function(i) {
        nums[i] = function(j) {
            return i + j;
        };
    }(i));
}
  • 不要像這樣使用構(gòu)造函數(shù),例:new function () { ... }, new Object暑始;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搭独,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子廊镜,更是在濱河造成了極大的恐慌牙肝,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗤朴,死亡現(xiàn)場(chǎng)離奇詭異配椭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)雹姊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)股缸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吱雏,你說(shuō)我怎么就攤上這事敦姻●常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵替劈,是天一觀(guān)的道長(zhǎng)寄雀。 經(jīng)常有香客問(wèn)我,道長(zhǎng)陨献,這世上最難降的妖魔是什么盒犹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮眨业,結(jié)果婚禮上急膀,老公的妹妹穿的比我還像新娘。我一直安慰自己龄捡,他們只是感情好卓嫂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著聘殖,像睡著了一般晨雳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奸腺,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天餐禁,我揣著相機(jī)與錄音,去河邊找鬼突照。 笑死帮非,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讹蘑。 我是一名探鬼主播末盔,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼座慰!你這毒婦竟也來(lái)了陨舱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤角骤,失蹤者是張志新(化名)和其女友劉穎隅忿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體邦尊,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡背桐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝉揍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链峭。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖又沾,靈堂內(nèi)的尸體忽然破棺而出弊仪,到底是詐尸還是另有隱情熙卡,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布励饵,位于F島的核電站驳癌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏役听。R本人自食惡果不足惜颓鲜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望典予。 院中可真熱鬧甜滨,春花似錦、人聲如沸瘤袖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捂敌。三九已至艾扮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間占婉,已是汗流浹背栏渺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锐涯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓填物,卻偏偏與公主長(zhǎng)得像纹腌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滞磺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 推薦文章:禪與 Objective-C 編程藝 前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開(kāi)發(fā)人員編寫(xiě)出簡(jiǎn)潔升薯、可維護(hù)、...
    WolfTin閱讀 2,757評(píng)論 0 1
  • 作者:李旺成 時(shí)間:2016年4月3日 1. 前言 這份文檔參考了 Google Java 編程風(fēng)格規(guī)范和 Goo...
    diygreen閱讀 39,899評(píng)論 19 224
  • 一击困、前端編輯器 vscode 對(duì)angular涎劈、typescript有著非常友好的支持,輕便快捷阅茶,代碼統(tǒng)一蛛枚,一鍵格...
    ElliottsSu閱讀 969評(píng)論 0 2
  • [TOC] 前言 這份文檔是Google Java編程風(fēng)格規(guī)范的完整定義。當(dāng)且僅當(dāng)一個(gè)Java源文件符合此文檔中的...
    marine8888閱讀 1,947評(píng)論 0 1
  • Android 編碼規(guī)范 1. 前言 這份文檔是 Google Java Code Style 的譯文脸哀,并稍有添加...
    人失憶閱讀 445評(píng)論 0 3