制定自己团队的前端开发规范

640?wx_fmt=gif

篇幅可能会比较长,但是我感觉有一套规范对于一个团队其实还是很重要的,这样在维护起来也会很方便,如果接下来的规范感觉对你们团队有帮助,希望可以在团队中进行实践或者推荐给你的leader,代码规范参考自:腾讯alloyteam团队,希望大家可以跟着看一遍,各取所需。

后续的文章我也补充齐全了,一共有两篇,都是实战篇,一篇是制定自己团队的前端开发规范之 eslint,另外一篇是手摸手带你实践标准的前端开发规范,希望大家可以去看一下,然后把这套规范实践起来,让自己的开发存在更少的bug。

如果可以的话,实践过程中有用的不舒服的,麻烦给我进行反馈,这样才能知道这套规则适不适合大部分人去用,根据大家的意见,取其精华去其糟粕让这套规范变得更实用。

命名规范

项目命名

全部采用小写方式, 以下划线分隔。例:my_project_name

目录命名

参照项目命名规则;

有复数结构时,要采用复数命名法。

例:scriptsstylesimagesdata_models

vue的项目中,components下的组件目录名,使用大驼峰命令

例:LeftBar

JS文件命名

参照项目命名规则。

例:account_model.js

CSS, SCSS文件命名

参照项目命名规则。

例:retina_sprites.css

HTML文件命名

参照项目命名规则。

例:error_log.html

HTML规范

语法:

  • 缩进使用tab(2个空格);

  • 嵌套的节点应该缩进;

  • 在属性上,使用双引号,不要使用单引号;

  • 属性名全小写,用中划线(-)做分隔符;

  • 要在自动闭合标签结尾处使用斜线,为了适应 react(通过留言区反馈进行修改);

 
 
  1. <!DOCTYPE html>

  2. <html>

  3. <head>

  4. <title>Page title</title>

  5. </head>

  6. <body>

  7. <img src="images/company_logo.png" alt="Company" />


  8. <!-- 属性名全小写,用中划线(-)做分隔符 -->

  9. <h1 class="hello-world">Hello, world!</h1>

  10. </body>

  11. </html>

标准模式

在开头规定doctype,来启动标准模式,doctype要大写。

 
 
  1. <!DOCTYPE html>

  2. <html>

  3. ...

  4. </html>

规定字符编码

通过声明一个明确的字符编码,让浏览器轻松、快速的确定适合网页内容的渲染方式,通常指定为'UTF-8'。

 
 
  1. <!DOCTYPE html>

  2. <html>

  3. <head>

  4. <meta charset="UTF-8">

  5. </head>

  6. ...

  7. </html>

IE兼容模式

用meta标签指定页面应该使用什么版本的IE来渲染。

 
 
  1. <!DOCTYPE html>

  2. <html>

  3. <head>

  4. <meta http-equiv="X-UA-Compatible" content="IE=Edge">

  5. </head>

  6. ...

  7. </html>

减少标签数量

在编写HTML代码时,需要尽量避免多余的父节点;

 
 
  1. <!-- bad -->

  2. <span class="avatar">

  3. <img src="...">

  4. </span>


  5. <!-- good -->

  6. <img class="avatar" src="...">

语义化标签

html的标签能使用语义化的,尽量使用语义化标签,避免一个页面都是div或者p标签

 
 
  1. <!-- bad -->

  2. <div>

  3. <p></p>

  4. </div>


  5. <!-- good -->

  6. <header></header>

  7. <footer></footer>

CSS 规范

缩进

使用tab缩进(2个空格)

 
 
  1. .element {

  2. border-radius: 10px;

  3. width: 50px;

  4. height: 50px;

  5. }

分号

每个声明结束都要加分号

 
 
  1. .element {

  2. border-radius: 10px;

  3. width: 50px;

  4. height: 50px;

  5. }

注释

注释统一使用 /* */

 
 
  1. .element {

  2. /* border-radius: 10px; */

  3. width: 50px;

  4. height: 50px;

  5. }

引号

  • url的内容要用引号

  • 属性选择器中的属性值需要引号

 
 
  1. .element:after {

  2. content: "";

  3. background-image: url("logo.png");

  4. }


  5. li[data-type="single"] {

  6. ...

  7. }

命名

  • 类名使用小写字母,以中划线分隔

  • id采用驼峰式命名

  • scss中的变量、函数、混合、placeholder采用驼峰式命名

 
 
  1. /* class */

  2. .element-content {

  3. ...

  4. }


  5. /* id */

  6. #myDialog {

  7. ...

  8. }


  9. /* 变量 */

  10. $colorBlack: #000;


  11. /* 混合 */

  12. @mixin centerBlock {

  13. ...

  14. }

JavaScript 规范

缩进

使用tab缩进(2个空格)

 
 
  1. if (x < y) {

  2. x += 10;

  3. } else {

  4. x += 1;

  5. }

变量命名

  • 标准变量采用驼峰式命名

  • 'ID'在变量名中全大写

  • 'URL'在变量名中全大写

  • 'Android'在变量名中大写第一个字母

  • 'iOS'在变量名中小写第一个,大写后两个字母

  • 常量全大写,用下划线连接

  • 构造函数,大写第一个字母

  • jquery对象必须以'$'开头命名

 
 
  1. var thisIsMyName;


  2. var goodID;


  3. var reportURL;


  4. var AndroidVersion;


  5. var iOSVersion;


  6. var MAX_COUNT = 10;


  7. function Person(name) {

  8. this.name = name;

  9. }


  10. // not good

  11. var body = $('body');


  12. // good

  13. var $body = $('body');

变量声明

一个函数作用域中所有的变量声明尽量提到函数首部,用一个var声明,不允许出现两个连续的var声明。如果可以使用let和const的,要使用let和const。

 
 
  1. function doSomethingWithItems(items) {

  2. // use one var

  3. let value = 10,

  4. result = value + 10,

  5. i,

  6. len;


  7. for (i = 0, len = items.length; i < len; i++) {

  8. result += 10;

  9. }

  10. }

单行长度

不要超过80,但如果编辑器开启word wrap可以不考虑单行长度。

分号

统一要加分号。

空格

以下几种情况不用写空格:

  • 对象的属性名后

  • 函数调用括号前

  • 无论是函数声明还是函数表达式,'('前不要空格

  • 数组的'['后和']'前

  • 对象的'{'后和'}'前

  • 运算符'('后和')'前

以下几种情况一定要写空格:

  • 三元运算符'?:'前后

  • 代码块'{'前

  • 下列关键字前:else, while, catch, finally

  • 下列关键字后:if, else, for, while, do, switch, case, try,catch, finally, with, return, typeof

  • 单行注释'//'后(若单行注释和代码同行,则'//'前也需要),多行注释'*'后

  • 对象的属性值前

  • for循环,分号后留有一个空格,前置条件如果有多个,逗号后留一个空格

  • 无论是函数声明还是函数表达式,'{'前一定要有空格

  • 函数的参数之间

例:

 
 
  1. // not good

  2. var a = {

  3. b :1

  4. };


  5. // good

  6. var a = {

  7. b: 1

  8. };


  9. // not good

  10. ++ x;

  11. y ++;

  12. z = x?1:2;


  13. // good

  14. ++x;

  15. y++;

  16. z = x ? 1 : 2;


  17. // not good

  18. var a = [ 1, 2 ];


  19. // good

  20. var a = [1, 2];


  21. // not good

  22. var a = ( 1+2 )*3;


  23. // good

  24. var a = (1 + 2) * 3;


  25. // good

  26. var doSomething = function(a, b, c) {

  27. // do something

  28. };


  29. // good

  30. doSomething(item);


  31. // not good

  32. for(i=0;i<6;i++){

  33. x++;

  34. }


  35. // good

  36. for (i = 0; i < 6; i++) {

  37. x++;

  38. }

空行

以下几种情况一定要有空行

  • 变量声明后(当变量声明在代码块的最后一行时,则无需空行)

  • 注释前(当注释在代码块的第一行时,则无需空行)

  • 文件最后保留一个空行

 
 
  1. var x = 1;


  2. // 注释前要有空行

  3. if (x >= 1) {

  4. var y = x + 1;

  5. }

换行

换行的地方,行末必须有','或者运算符;

以下几种情况不需要换行:

  • 下列关键字后:else, catch, finally

  • 代码块'{'前

以下几种情况需要换行:

  • 代码块'{'后和'}'前

  • 变量赋值后

 
 
  1. // not good

  2. var a = {

  3. b: 1

  4. , c: 2

  5. };


  6. x = y

  7. ? 1 : 2;


  8. // good

  9. var a = {

  10. b: 1,

  11. c: 2

  12. };


  13. x = y ? 1 : 2;


  14. // good

  15. if (condition) {

  16. ...

  17. } else {

  18. ...

  19. }


  20. try {

  21. ...

  22. } catch (e) {

  23. ...

  24. } finally {

  25. ...

  26. }


  27. // not good

  28. function test()

  29. {

  30. ...

  31. }


  32. // good

  33. function test() {

  34. ...

  35. }


  36. // not good

  37. var a, foo = 7, b,

  38. c, bar = 8;


  39. // good

  40. var a,

  41. foo = 7,

  42. b, c, bar = 8;

注释

单行注释
  • 注释单独一行的情况下,注释的//后面要跟一个空格

  • 注释如果和代码同一行,代码分号结束后,要跟一个空格,注释的//后也要跟一个空格

例:

 
 
  1. // 调用函数

  2. foo()


  3. var maxCount= 10; // 这是一个变量

多行注释

多行注释使用下面这种形式:

 
 
  1. /**

  2. * 代码注释1

  3. * 代码注释2

  4. */

建议在以下几种情况使用:

  • 难于理解的代码段

  • 可能存在错误的代码段

  • 浏览器特殊的HACK代码

  • 业务逻辑强相关的代码

函数注释

复杂的函数,所有类,都必须进行函数注释,函数注释使用业界统一的规范,方便后续使用jsdoc生成文档。

例:

 
 
  1. /**

  2. * 获取任务的名称

  3. * @param id {Number} 传入需要获取名称的人物id

  4. * @return {String} 返回的姓名

  5. * @author shi 2015/07/21 可以不写

  6. * @version 1.1.0 可以不写

  7. * @example 示例代码,可以不写

  8. */

  9. function getTaskName(id) {

  10. let name = 'test';

  11. return name;

  12. }

引号

最外层统一使用单引号

 
 
  1. // not good

  2. var x = "test";


  3. // good

  4. var y = 'foo',

  5. z = '<div id="test"></div>';

对象,数组


  • 对象属性名不需要加引号;



  • 对象以缩进的形式书写,不要写在一行;



  • 数组、对象最后不要有逗号。


 
 
  1. // not good

  2. var a = {

  3. 'b': 1

  4. };


  5. var a = {b: 1};


  6. var a = {

  7. b: 1,

  8. c: 2,

  9. };


  10. // good

  11. var a = {

  12. b: 1,

  13. c: 2

  14. };

括号

下列关键字后必须有大括号(即使代码块的内容只有一行):if, else, for, while, do, switch, try, catch, finally, with

 
 
  1. // not good

  2. if (condition)

  3. doSomething();


  4. // good

  5. if (condition) {

  6. doSomething();

  7. }

undefined

永远不要直接使用undefined进行变量判断;

使用typeof和字符串'undefined'对变量进行判断。

 
 
  1. // not good

  2. if (person === undefined) {

  3. ...

  4. }


  5. // good

  6. if (typeof person === 'undefined') {

  7. ...

  8. }

不允许存在多层嵌套的条件判断和循环(最多三层)

条件判断能使用三目运算符和逻辑运算符解决的,就不要使用条件判断,但是谨记不要写太长的三目运算符。

例:

 
 
  1. // bad

  2. if(x === 10) {

  3. return 'valid';

  4. } else {

  5. return 'invalid';

  6. }


  7. // good

  8. return x === 10 ? 'valid' : 'invalid'


  9. // bad

  10. if(!x) {

  11. if(!y) {

  12. x = 1;

  13. } else {

  14. x = y;

  15. }

  16. }


  17. // good

  18. x = x || y || 1

简单解释一下逻辑运算符,逻辑运算符主要有两种,一个是 || 逻辑或,一个是 && 逻辑与。

  • 逻辑或 ||:当前一个为真时,返回前一个值,前一个为假时返回后一个值。

 
 
  1. var x = 1;

  2. console.log(x || 2); // 1


  3. var y = 0;

  4. console.log(y || 2); // 2

  • 逻辑与 &&:当前一个为真时,返回后一个值,前一个为假时返回前一个值。

 
 
  1. var x = 1;

  2. console.log(x && 2); // 2


  3. var y = 0;

  4. console.log(y && 2); // 0

其他ESlint

  • for-in里一定要有hasOwnProperty的判断;

  • 用'===', '!=='代替'==', '!=',null 除外;

  • 不要在内置对象的原型上添加方法,如Array, Date;

  • 变量不要先使用后声明;

  • 不要在一句代码中单单使用构造函数,记得将其赋值给某个变量;

  • 不要在同个作用域下声明同名变量;

  • 不要在一些不需要的地方加括号,例:delete(a.b);

  • 不要使用未声明的变量;

  • debugger不要出现在提交的代码里;

  • 数组中不要存在空元素;

  • 不要在循环内部声明函数;

  • 不要像这样使用构造函数;

  • 不要声明了变量却不使用;

 
 
  1. // good

  2. for (key in obj) {

  3. if (obj.hasOwnProperty(key)) {

  4. // be sure that obj[key] belongs to the object and was not inherited

  5. console.log(obj[key]);

  6. }

  7. }


  8. // not good

  9. Array.prototype.count = function(value) {

  10. return 4;

  11. };


  12. // not good

  13. function test() {

  14. console.log(x);


  15. var x = 1;

  16. }


  17. // not good

  18. new Person();


  19. // good

  20. var person = new Person();


  21. // not good

  22. delete(obj.attr);


  23. // good

  24. delete obj.attr;


  25. // not good

  26. var a = [1, , , 2, 3];


  27. // not good

  28. var nums = [];


  29. // not good

  30. for (var i = 0; i < 10; i++) {

  31. (function(i) {

  32. nums[i] = function(j) {

  33. return i + j;

  34. };

  35. }(i));

  36. }

其他

  • 换行符统一用'LF';

  • 对上下文this的引用只能使用'_this', 'that', 'self'其中一个来命名;

  • 行尾不要有空白字符;

  • 不允许有空的代码块。

 
 
  1. // not good

  2. function Person() {

  3. // not good

  4. var me = this;


  5. // good

  6. var _this = this;


  7. // good

  8. var that = this;


  9. // good

  10. var self = this;

  11. }


  12. if (condition) {


  13. }

这一套规范我用 vuepress 做了一个网站进行存档,欢迎大家查看。https://www.shiyanping.top/coderule,主要依附 github page 进行部署,也欢迎大家 star 我的 git 项目 https://github.com/Shiyanping/coderule。

相关链接


  • 制定自己团队的前端开发规范之 eslint



  • 手摸手带你实践标准的前端开发规范


阅读完后两部曲

非常感谢各位花时间阅读完,衷心希望各位小伙伴可以花少量的时间帮忙做两件事:


  • 动动你的手指,帮忙点个 star 吧,你的点赞是对我最大的动力。


  • 希望各位关注一下我的公众号,新的文章第一时间发到公众号,公众号主要发一些个人随笔、读书笔记、还有一些技术热点和实时热点~


640?wx_fmt=png


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值