篇幅可能會比較長,可是我感受有一套規範對於一個團隊其實仍是很重要的,這樣在維護起來也會很方便,若是接下來的規範感受對大家團隊有幫助,但願能夠在團隊中進行實踐或者推薦給你的leader,代碼規範參考自:騰訊alloyteam團隊,但願你們能夠跟着看一遍,各取所需。css
後續的文章我也補充齊全了,一共有兩篇,都是實戰篇,一篇是制定本身團隊的前端開發規範之 eslint,另一篇是手摸手帶你實踐標準的前端開發規範,但願你們能夠去看一下,而後把這套規範實踐起來,讓本身的開發存在更少的bug。html
若是能夠的話,實踐過程當中有用的不舒服的,麻煩給我進行反饋,這樣才能知道這套規則適不適合大部分人去用,根據你們的意見,取其精華去其糟粕讓這套規範變得更實用。前端
所有采用小寫方式, 如下劃線分隔。 例:my_project_name
vue
參照項目命名規則;jquery
有複數結構時,要採用複數命名法。git
例:scripts
,styles
,images
,data_models
es6
vue的項目中,components下的組件目錄名,使用大駝峯命令github
例:LeftBar
數組
參照項目命名規則。瀏覽器
例:account_model.js
參照項目命名規則。
例:retina_sprites.css
參照項目命名規則。
例:error_log.html
<!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>
複製代碼
在開頭規定 doctype,來啓動標準模式,doctype 要大寫。
<!DOCTYPE html>
<html>
...
</html>
複製代碼
經過聲明一個明確的字符編碼,讓瀏覽器輕鬆、快速的肯定適合網頁內容的渲染方式,一般指定爲'UTF-8'。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
...
</html>
複製代碼
用 meta 標籤指定頁面應該使用什麼版本的 IE 來渲染。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
</head>
...
</html>
複製代碼
在編寫 HTML 代碼時,須要儘可能避免多餘的父節點;
<!-- bad -->
<span class="avatar">
<img src="..." />
</span>
<!-- good -->
<img class="avatar" src="..." />
複製代碼
html 的標籤能使用語義化的,儘可能使用語義化標籤,避免一個頁面都是 div 或者 p 標籤
<!-- bad -->
<div>
<p></p>
</div>
<!-- good -->
<header></header>
<footer></footer>
複製代碼
使用 tab 縮進(2 個空格)
.element {
border-radius: 10px;
width: 50px;
height: 50px;
}
複製代碼
每一個聲明結束都要加分號
.element {
border-radius: 10px;
width: 50px;
height: 50px;
}
複製代碼
註釋統一使用 /* */
.element {
/* border-radius: 10px; */
width: 50px;
height: 50px;
}
複製代碼
.element:after {
content: "";
background-image: url("logo.png");
}
li[data-type="single"] {
...;
}
複製代碼
/* class */
.element-content {
...;
}
/* id */
#myDialog {
...;
}
/* 變量 */
$colorBlack: #000;
/* 混合 */
@mixin centerBlock {
...;
}
複製代碼
使用 tab 縮進(2 個空格)
if (x < y) {
x += 10;
} else {
x += 1;
}
複製代碼
var thisIsMyName;
var AndroidVersion;
var iOSVersion;
var MAX_COUNT = 10;
function Person(name) {
this.name = name;
}
// not good
var body = $("body");
// good
var $body = $("body");
複製代碼
一個函數做用域中全部的變量聲明儘可能提到函數首部。若是可使用 let 和 const 的,要使用 let 和 const。
function doSomethingWithItems(items) {
// use one var
let value = 10,
result = value + 10,
i,
len;
for (i = 0, len = items.length; i < len; i++) {
result += 10;
}
}
複製代碼
不要超過 100,但若是編輯器開啓 word wrap 能夠不考慮單行長度。
統一要加分號。
如下幾種狀況不用寫空格:
如下幾種狀況必定要寫空格:
這些後續會用 eslint 和 prettier 進行格式化
例:
// not good
var a = {
b : 1
};
// good
var a = {
b: 1
};
// not good
++x;
y++;
z = x ? 1:2;
// good
++x;
y++;
z = x ? 1 : 2;
// not good
var a = [ 1, 2 ];
// good
var a = [1, 2];
// good
var doSomething = function(a, b, c) {
// do something
};
// good
doSomething(item);
// not good
for (let i = 0;i < 6;i++) {
x++;
}
// good
for (let i = 0; i < 6; i++) {
x++;
}
複製代碼
如下幾種狀況必定要有空行
var x = 1;
// 註釋前要有空行
if (x >= 1) {
var y = x + 1;
}
複製代碼
換行的地方,行末必須有','或者運算符;
如下幾種狀況不須要換行:
如下幾種狀況須要換行:
// not good
var a = {
b: 1
, c: 2
};
x = y
? 1 : 2;
// good
var a = {
b: 1,
c: 2
};
x = y ? 1 : 2;
// good
if (condition) {
...
} else {
...
}
try {
...
} catch (e) {
...
} finally {
...
}
// not good
function test() {
...
}
// good
function test() {
...
}
// not good
var a, foo = 7, b,
c, bar = 8;
// good
var a,
foo = 7,
b, c, bar = 8;
複製代碼
例:
// 調用函數
foo();
var maxCount = 10; // 這是一個變量
複製代碼
多行註釋使用下面這種形式:
/** * 代碼註釋1 * 代碼註釋2 */
複製代碼
多行註釋建議在如下幾種狀況使用:
複雜的函數,全部類,都必須進行函數註釋,函數註釋使用業界統一的規範,方便後續使用 jsdoc 生成文檔。
例:
/** * 獲取任務的名稱 * @param id {Number} 傳入須要獲取名稱的人物id * @return {String} 返回的姓名 * @author shi 2015/07/21 能夠不寫 * @version 1.1.0 能夠不寫 * @example 示例代碼,能夠不寫 */
function getTaskName(id) {
let name = "test";
return name;
}
複製代碼
最外層統一使用單引號,除非字符串嵌套的狀況。
// not good
var x = "test";
// good
var y = 'foo',
z = '<div id="test"></div>';
複製代碼
對象屬性名不須要加引號,如對象屬性名是中劃線命名的須要加引號(eslint 的 rules)
對象以縮進的形式書寫,不要寫在一行(單個屬性能夠寫一行,es6 導入方法時可使用單行);
數組、對象最後不要有逗號。
// good
var a = {
b: 1,
c: 2
};
複製代碼
下列關鍵字後必須有大括號(即便代碼塊的內容只有一行):if
, else
, for
, while
, do
, switch
, try
, catch
, finally
, with
。
// not good
if (condition) doSomething();
// good
if (condition) {
doSomething();
}
複製代碼
永遠不要直接使用 undefined 進行變量判斷;
使用 typeof 和字符串'undefined'對變量進行判斷。
// not good
if (person === undefined) {
...
}
// good
if (typeof person === 'undefined') {
...
}
複製代碼
條件判斷能使用三目運算符和邏輯運算符解決的,就不要使用條件判斷,可是謹記不要寫太長的三目運算符。
例:
// bad
if (x === 10) {
return 'valid';
} else {
return 'invalid';
}
// good
return x === 10 ? 'valid' : 'invalid';
// bad
if (!x) {
if (!y) {
x = 1;
} else {
x = y;
}
}
// good
x = x || y || 1;
複製代碼
簡單解釋一下邏輯運算符,邏輯運算符主要有兩種,一個是 ||
邏輯或,一個是 &&
邏輯與。
var x = 1;
console.log(x || 2); // 1
var y = 0;
console.log(y || 2); // 2
複製代碼
var x = 1;
console.log(x && 2); // 2
var y = 0;
console.log(y && 2); // 0
複製代碼
這些均可以參考 eslint-config-alloy,有詳細的 JS、TS、React、Vue 的規範,咱們後續配置 eslint 時也是引入騰訊的 eslint 規範。
// 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]);
}
}
// not good
Array.prototype.count = function(value) {
return 4;
};
// not good
function test() {
console.log(x);
var x = 1;
}
// not good
new Person();
// good
var person = new Person();
// not good
delete (obj.attr);
// good
delete obj.attr;
// not good
var a = [1, , , 2, 3];
// not good
var nums = [];
// not good
for (var i = 0; i < 10; i++) {
(function(i) {
nums[i] = function(j) {
return i + j;
};
})(i);
}
複製代碼
// not good
function Person() {
// not good
var me = this;
// good
var _this = this;
// good
var that = this;
// good
var self = this;
}
if (condition) {
}
複製代碼
這一套規範我用 vuepress 作了一個網站進行存檔,歡迎你們查看。www.shiyanping.top/code_rule,主要依附 github page 進行部署,也歡迎你們 star 個人 git 項目 github.com/Shiyanping/…。
很是感謝各位花時間閱讀完,衷心但願各位小夥伴能夠花少許的時間幫忙作兩件事:
動動你的手指,幫忙點個贊吧,你的點贊是對我最大的動力。
但願各位關注一下個人公衆號,新的文章第一時間發到公衆號,公衆號主要發一些我的隨筆、讀書筆記、還有一些技術熱點和實時熱點,而且還有很是吸引人的我我的自費抽獎活動哦~