AlloyTeam CodeGuide 前端编码规范
命名规则
项目命名
全部采用小写方式, 以下划线分隔。
例:my_project_name
目录命名
参照项目命名规则;
有复数结构时,要采用复数命名法。
例:scripts, styles, images, data_models
JS文件命名
参照项目命名规则。
例:account_model.js
CSS, SCSS文件命名
参照项目命名规则。
例:retina_sprites.scss
HTML文件命名
参照项目命名规则。
例:error_report.html
HTML
语法
- 缩进使用soft tab(4个空格);
- 嵌套的节点应该缩进;
- 在属性上,使用双引号,不要使用单引号;
- 属性名全小写,用中划线做分隔符;
- 不要在自动闭合标签结尾处使用斜线(HTML5 规范 指出他们是可选的);
- 不要忽略可选的关闭标签,例: 和 。
|
|
HTML5 doctype
在页面开头使用这个简单地doctype来启用标准模式,使其在每个浏览器中尽可能一致的展现;
虽然doctype不区分大小写,但是按照惯例,doctype大写 (关于html属性,大写还是小写)。
|
|
lang属性
根据HTML5规范:
应在html标签上加上lang属性。这会给语音工具和翻译工具帮助,告诉它们应当怎么去发音和翻译。
更多关于 lang
属性的说明在这里;
在sitepoint上可以查到语言列表;
但sitepoint只是给出了语言的大类,例如中文只给出了zh,但是没有区分香港,台湾,大陆。而微软给出了一份更加详细的语言列表.aspx),其中细分了zh-cn, zh-hk, zh-tw。
|
|
字符编码
通过声明一个明确的字符编码,让浏览器轻松、快速的确定适合网页内容的渲染方式,通常指定为’UTF-8’。
|
|
IE兼容模式
用 <meta>
标签可以指定页面应该用什么版本的IE来渲染;
如果你想要了解更多,请点击这里;
不同doctype在不同浏览器下会触发不同的渲染模式(这篇文章总结的很到位)。
|
|
引入CSS, JS
根据HTML5规范, 通常在引入CSS和JS时不需要指明 type
,因为 text/css
和 text/javascript
分别是他们的默认值。
HTML5 规范链接
|
|
属性顺序
属性应该按照特定的顺序出现以保证易读性;
class
id
name
data-*
src
,for
,type
,href
,value
,max-length
,max
,min
,pattern
placeholder
,title
,alt
aria-*
,role
required
,readonly
,disabled
class是为高可复用组件设计的,所以应处在第一位;
id更加具体且应该尽量少使用,所以将它放在第二位。
|
|
boolean属性
boolean属性指不需要声明取值的属性,XHTML需要每个属性声明取值,但是HTML5并不需要;
更多内容可以参考 WhatWG section on boolean attributes:
boolean属性的存在表示取值为true,不存在则表示取值为false。
|
|
JS生成标签
在JS文件中生成标签让内容变得更难查找,更难编辑,性能更差。应该尽量避免这种情况的出现。
减少标签数量
在编写HTML代码时,需要尽量避免多余的父节点;
很多时候,需要通过迭代和重构来使HTML变得更少。
|
|
实用高于完美
尽量遵循HTML标准和语义,但是不应该以浪费实用性作为代价;
任何时候都要用尽量小的复杂度和尽量少的标签来解决问题。
CSS, SCSS
缩进
使用soft tab(4个空格)。
|
|
分号
每个属性声明末尾都要加分号。
|
|
空格
以下几种情况不需要空格:
- 属性名后
- 多个规则的分隔符’,’前
!important
‘!’后- 属性值中’(‘后和’)’前
- 行末不要有多余的空格
以下几种情况需要空格:
- 属性值前
- 选择器’>’, ‘+’, ‘~’前后
- ‘{‘前
!important
‘!’前@else
前后- 属性值中的’,’后
- 注释’/‘后和’/‘前
|
|
空行
以下几种情况需要空行:
- 文件最后保留一个空行
- ‘}’后最好跟一个空行,包括scss中嵌套的规则
- 属性之间需要适当的空行,具体见属性声明顺序
|
|
换行
以下几种情况不需要换行:
- ‘{‘前
以下几种情况需要换行:
- ‘{‘后和’}’前
- 每个属性独占一行
- 多个规则的分隔符’,’后
|
|
注释
注释统一用’/ /‘(scss中也不要用’//‘),具体参照右边的写法;
缩进与下一行代码保持一致;
可位于一个代码行的末尾,与代码间隔一个空格。
|
|
引号
最外层统一使用双引号;
url的内容要用引号;
属性选择器中的属性值需要引号。
|
|
命名
- 类名使用小写字母,以中划线分隔
- id采用驼峰式命名
- scss中的变量、函数、混合、placeholder采用驼峰式命名
|
|
属性声明顺序
相关的属性声明按右边的顺序做分组处理,组之间需要有一个空行。
|
|
颜色
颜色16进制用小写字母;
颜色16进制尽量用简写。
|
|
属性简写
属性简写需要你非常清楚属性值的正确顺序,而且在大多数情况下并不需要设置属性简写中包含的所有值,所以建议尽量分开声明会更加清晰;
margin
和 padding
相反,需要使用简写;
常见的属性简写包括:
font
background
transition
animation
|
|
媒体查询
尽量将媒体查询的规则靠近与他们相关的规则,不要将他们一起放到一个独立的样式文件中,或者丢在文档的最底部,这样做只会让大家以后更容易忘记他们。
|
|
SCSS相关
提交的代码中不要有 @debug
;
声明顺序:
@extend
- 不包含
@content
的@include
- 包含
@content
的@include
- 自身属性
- 嵌套规则
@import
引入的文件不需要开头的’_’和结尾的’.scss’;
嵌套最多不能超过5层;
@extend
中使用placeholder选择器;
去掉不必要的父级引用符号’&’。
|
|
杂项
不允许有空的规则;
元素选择器用小写字母;
去掉小数点前面的0;
去掉数字中不必要的小数点和末尾的0;
属性值’0’后面不要加单位;
同个属性不同前缀的写法需要在垂直方向保持对齐,具体参照右边的写法;
无前缀的标准属性应该写在有前缀的属性后面;
不要在同个规则里出现重复的属性,如果重复的属性是连续的则没关系;
不要在一个文件里出现两个相同的规则;
用 border: 0;
代替 border: none;
;
选择器不要超过4层(在scss中如果超过4层应该考虑用嵌套的方式来写);
发布的代码中不要有 @import
;
尽量少用’*’选择器。
|
|
JavaScript
缩进
使用soft tab(4个空格)。
|
|
单行长度
不要超过80,但如果编辑器开启word wrap可以不考虑单行长度。
分号
以下几种情况后需加分号:
- 变量声明
- 表达式
- return
- throw
- break
- continue
- do-while
|
|
空格
以下几种情况不需要空格:
- 对象的属性名后
- 前缀一元运算符后
- 后缀一元运算符前
- 函数调用括号前
- 无论是函数声明还是函数表达式,’(‘前不要空格
- 数组的’[‘后和’]’前
- 对象的’{‘后和’}’前
- 运算符’(‘后和’)’前
以下几种情况需要空格:
- 二元运算符前后
- 三元运算符’?:’前后
- 代码块’{‘前
- 下列关键字前:else, while, catch, finally
- 下列关键字后:if, else, for, while, do, switch, case, try, catch, finally, with, return, typeof
- 单行注释’//‘后(若单行注释和代码同行,则’//‘前也需要),多行注释’*’后
- 对象的属性值前
- for循环,分号后留有一个空格,前置条件如果有多个,逗号后留一个空格
- 无论是函数声明还是函数表达式,’{‘前一定要有空格
- 函数的参数之间
|
|
空行
以下几种情况需要空行:
- 变量声明后(当变量声明在代码块的最后一行时,则无需空行)
- 注释前(当注释在代码块的第一行时,则无需空行)
- 代码块后(在函数调用、数组、对象中则无需空行)
- 文件最后保留一个空行
|
|
换行
换行的地方,行末必须有’,’或者运算符;
以下几种情况不需要换行:
- 下列关键字后:
else
,catch
,finally
- 代码块’{‘前
以下几种情况需要换行:
- 代码块’{‘后和’}’前
- 变量赋值后
|
|
单行注释
双斜线后,必须跟一个空格;
缩进与下一行代码保持一致;
可位于一个代码行的末尾,与代码间隔一个空格。
|
|
多行注释
最少三行, ‘*’后跟一个空格,具体参照右边的写法;
建议在以下情况下使用:
- 难于理解的代码段
- 可能存在错误的代码段
- 浏览器特殊的HACK代码
- 业务逻辑强相关的代码
|
|
文档注释
各类标签@param
, @method
等请参考usejsdoc和JSDoc Guide;
建议在以下情况下使用:
- 所有常量
- 所有函数
- 所有类
|
|
变量命名
- 标准变量采用驼峰式命名(除了对象的属性外,主要是考虑到cgi返回的数据)
- ‘ID’在变量名中全大写
- ‘URL’在变量名中全大写
- ‘Android’在变量名中大写第一个字母
- ‘iOS’在变量名中小写第一个,大写后两个字母
- 常量全大写,用下划线连接
- 构造函数,大写第一个字母
- jquery对象必须以’$’开头命名
|
|
变量声明
一个函数作用域中所有的变量声明尽量提到函数首部,用一个var声明,不允许出现两个连续的var声明。
|
|
函数
无论是函数声明还是函数表达式,’(‘前不要空格,但’{‘前一定要有空格;
函数调用括号前不需要空格;
立即执行函数外必须包一层括号;
不要给inline function命名;
参数之间用’, ‘分隔,注意逗号后有一个空格。
|
|
数组、对象
对象属性名不需要加引号;
对象以缩进的形式书写,不要写在一行;
数组、对象最后不要有逗号。
|
|
括号
下列关键字后必须有大括号(即使代码块的内容只有一行):if
, else
, for
, while
, do
, switch
, try
, catch
, finally
, with
。
|
|
null
适用场景:
- 初始化一个将来可能被赋值为对象的变量
- 与已经初始化的变量做比较
- 作为一个参数为对象的函数的调用传参
- 作为一个返回对象的函数的返回值
不适用场景:
- 不要用null来判断函数调用时有无传参
- 不要与未初始化的变量做比较
|
|
undefined
永远不要直接使用undefined进行变量判断;
使用typeof和字符串’undefined’对变量进行判断。
|
|
jshint
用’===’, ‘!==’代替’==’, ‘!=’;
for-in里一定要有hasOwnProperty的判断;
不要在内置对象的原型上添加方法,如Array, Date;
不要在内层作用域的代码里声明了变量,之后却访问到了外层作用域的同名变量;
变量不要先使用后声明;
不要在一句代码中单单使用构造函数,记得将其赋值给某个变量;
不要在同个作用域下声明同名变量;
不要在一些不需要的地方加括号,例:delete(a.b);
不要使用未声明的变量(全局变量需要加到.jshintrc文件的globals属性里面);
不要声明了变量却不使用;
不要在应该做比较的地方做赋值;
debugger不要出现在提交的代码里;
数组中不要存在空元素;
不要在循环内部声明函数;
不要像这样使用构造函数,例:new function () { ... }, new Object
;
|
|
杂项
不要混用tab和space;
不要在一处使用多个tab或space;
换行符统一用’LF’;
对上下文this的引用只能使用’_this’, ‘that’, ‘self’其中一个来命名;
行尾不要有空白字符;
switch的falling through和no default的情况一定要有注释特别说明;
不允许有空的代码块。
|
|
编辑器配置和构建检查
sublime3插件
1.安装node包
- jscs
npm install jscs -g
- jshint
npm install jshint -g
- csscomb
npm install csscomb -g
- csslint
npm install csslint -g
2.安装gem包
- scss-lint
gem install scss_lint
- 安装sublime3 Package Control
- 按下
ctrl+`
- 复制粘贴以下代码
import urllib.request,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
4.安装sublime3插件
按下 ctrl+shift+p
,输入’ip’(Install Package)
输入以下插件的名字,按顺序逐个进行安装:
- EditorConfig
- Sass
- SublimeLinter
- SublimeLinter-jscs
- SublimeLinter-jshint
- SublimeLinter-csslint
- SublimeLinter-contrib-scss-lint
- JSFormat
- CSScomb
5.插件的配置文件
将以下配置文件分别下载后放入项目根目录下:
- EditorConfig 配置文件
- JSCS 配置文件
JSHint 配置文件
注意:全局变量需要手动加到配置文件的globals属性里,例:12345{"globals": {"ImageHandle": true}}CSSLint 配置文件
- SCSS-Lint 配置文件
6.编辑器及插件设置
sublime3
自身
Preferences->Setting-User,增加下面两个配置:
点击右下角的Spaces->Convert Indentation to Spaces可以将文件中的所有tab转换成空格
JSFormat
Preferences->Package Settings->JSFormat->Setting-User,下载配置文件覆盖
配置好后格式化的默认快捷键是 ctrl+alt+f
SublimeLinter
右键->SublimeLinter->Lint Mode,有4种检查模式,建议选择 Load/save
右键->SublimeLinter->Mark Style,建议选择 Outline
右键->SublimeLinter->Choose Gutter Theme,建议选择 Blueberry-round
右键->SublimeLinter->Open User Settings,将linter里面jscs的args改成 ["--verbose"]
,将linter里面csslint的ignore改成 "box-model,adjoining-classes,box-sizing,compatible-vendor-prefixes,gradients,text-indent,fallback-colors,star-property-hack,underscore-property-hack,bulletproof-font-face,font-faces,import,regex-selectors,universal-selector,unqualified-attributes,overqualified-elements,duplicate-background-images,floats,font-sizes,ids,important,outline-none,qualified-headings,unique-headings"
当光标处于有错误的代码行时,详细的错误信息会显示在下面的状态栏中
右键->SublimeLinter可以看到所有的快捷键,其中 ctrl+k, a
可以列出所有错误
CSScomb
Preferences->Package Settings->CSScomb->Setting-User,下载配置文件覆盖
配置好后格式化的默认快捷键是 ctrl+shift+c
grunt插件
1.在项目中安装grunt插件
- jscs
npm install grunt-jscs --save-dev
- jshint
npm install grunt-contrib-jshint --save-dev
- csslint
npm install grunt-contrib-csslint --save-dev
- scss-lint
npm install grunt-scss-lint --save-dev
2.插件的配置文件
JSCS
123456789{options: {config: true,verbose: true},files: {src: [...]}}JSHint
12345678{options: {jshintrc: true},files: {src: [...]}}CSSLint
12345678{options: {csslintrc: '.csslintrc'},files: {src: [...]}}SCSS-Lint
12345678{options: {config: '.scss-lint.yml'},files: {src: [...]}}
前端工程化或者持续集成(CI)方式使用Linter工具
什么是JSLint和JSHint?
JSLint是一个静态代码分析工具,JSHint 是在 JSLint 代码基础上二次开发而来的。
JSLint 还是 JSHint ?
联系
- 一样的用途
- 均拥有大量的用户
- 相同的 JavaScript 代码检查和分析内核
- 均已成功用于多个知名的 JavaScript 项目
区别
- JSLint 对代码的合规要求极为严格
- JSHint 对代码的合规要求可以很宽松
- JSLint 可配置的选项很少
- JSHint 可配置的选项很多
如何使用?
1.通过主流编辑器,IDE
通过主流编辑器,IDE都有了JSHint的插件。外还有很多基于JSHint的酷炫小项目
2.通过(工程化)前端构建工具基础
前端构建工具Grunt、Gulp和Webpack等都有其对应插件
通过这种方式集成进去会方便美观很多。
这里默认npm的相关知识你都知道,不清楚的还是先去了解一下。
和Gulp集成
首先,安装JSHint的Gulp插件:npm install gulp-jshint --save-dev
然后,编写运行JSHint的任务
|
|
然后,只需要运行gulp hint
即可检查代码。
就是这么简单。
JSHint的自定义规则
通过在根目录创建文件.jshintrc
,例如
具体的含义请参考文档。你也可以在你的项目目录下添加一个.jshintrc文件,JSHint会在检测文件时从文件所在目录往上找,直到找到jshintrc文件为止。
ESLint
JSHint 不支持 JSX 语法。所以有了 ESLint 。
ESLint 主要有以下特点:
- 默认规则包含所有 JSLint、JSHint 中存在的规则,易迁移;
- 规则可配置性高:可设置「警告」、「错误」两个 error 等级,或者直接禁用;
- 包含代码风格检测的规则(可以丢掉 JSCS 了);
- 支持插件扩展、自定义规则。
使用ESLint
配置
可以通过以下三种方式配置 ESLint:
- 使用 .eslintrc 文件(支持 JSON 和 YAML 两种语法);
- 在 package.json 中添加 eslintConfig 配置块;
- 直接在代码文件中定义。
.eslintrc
文件示例:
.eslintrc
放在项目根目录,则会应用到整个项目;如果子目录中也包含 .eslintrc
文件,则子目录会忽略根目录的配置文件,应用该目录中的配置文件。这样可以方便地对不同环境的代码应用不同的规则。
package.json
示例:
文件内配置
代码文件内配置的规则会覆盖配置文件里的规则。
禁用 ESLint:
禁用一条规则:
调整规则:
工作流集成、编辑器集成等
以 WebStorm 为例,只要全局安装 ESLint 或者在项目中依赖中添加 ESLint ,然后在设置里开启 ESLint 即可。其他编辑可以从 官方文档 中获得获得具体信息。
具体可查看官方文档
构建系统集成
在 Gulp 中使用:
其他构建工具参考官方文档
自定义规则
显然,ESLint 内置的规则不可能包罗所有需求。可以通过插件实现自定义规则,这是 ESLint 最有卖点的功能。在 NPM 上以 eslintplugin 为关键词,可以搜索到很多插件,包括 eslint-plugin-react 。如果有自行开发插件的需求,可以阅读 ESLint 插件开发文档 。
以 eslint-plugin-react
为例,安装以后,需要在 ESLint 配置中开启插件,其中 eslint-plugin-
前缀可以省略:
接下来开启 ESLint JSX 支持(ESLint 内置选项):
关于auto fix
有时我们希望一些简单的错误可以工具帮助我们自动修复。
我们可以寻找一下方式,假如使用JSLint或JSHint,我们可以寻找一些编辑器插件。或者npm工具,如fixmyjs 、 gulp-fixmyjs。
假如使用 eslint ,其自带参数 -- --fix
可帮助自动修复部分错误。