前面的话

  Douglas Crockford大神根据自己的理念用JavaScript写了一个JavaScript代码规范检查工具,这就是JSLint。后来非常流行,也的确帮助了广大的JavaScript程序员。但是,大神对于自己的代码规范不做丝毫的妥协,对开源社区的反馈的回应也不礼貌。于是,JSLint从一个帮助程序员规范代码,避免Bug的工具,变成了一个让代码像Crockford的工具。在最不信神的IT界,这当然不能忍了

  2011年,一个叫Anton Kovalyov的前端程序员借助开源社区的力量弄出来了JSHint,该工具的思想基本上和JSLint是一致的,但具有以下几点优势:1、可配置规则。2、社区支持度高。3、可定制结果报表

  相对应地,CSS的代码检查工具是csslint。本文将详细介绍jshint和csslint

安装

  JSHint的官方地址是http://jshint.com/,GitHub 地址:https://github.com/jshint/jshint

  一般地,使用npm来安装jshint。所以,首先需要安装nodejs,然后使用npm install jshint -g命令来安装jshint

  然后就可以通过命令'jshint xx.js'来检测代码

【sublime插件】

  在sublime编辑器中也可以使用jshint插件。使用快捷键 Ctrl+Shift+P 呼出Sublime命令面板;然后键入install,并选择Package Control:Install Package;然后再键入jshint,并选择JSHint Gutter

  安装完成后,一般需要将'node_path'设置为正确的路径

  然后在当前文件下,使用快捷键Ctrl+Alt+J 就会显示信息

配置

  在项目根目录下建立一个 .jshintrc 文件,这个文件就是JSHint的配置文件,JSHint会自动识别这个文件,根据这里面的规则对文件进行检查

  [注意]windows下并不允许新建文件名前面带点的文件,解决办法一种是直接在Sublime Text里建立;另一种是使用命令行touch命令建立

  JSHint的配置分为四类:

  1、Enforcing(增强):如果这些属性设置为true,JSHint会对代码进行更严格的检查,比如是否使用严格(strict)模式、变量驼峰式命名、是不是for-in循环里必须得有hasOwnProperty等等

  2、Relaxing(松弛):如果这些属性设置为true,JSHint会容忍规则中定义的情况出现。比如是否使用分号,是否支持下一代ES语法等等。

  3、Environments(环境):如果这些属性设置为true,表示代码所处的环境

  4、globals(全局变量):自定义的一些全局变量

【增强】

bitwise               禁用位运算符
camelcase 使用驼峰命名(camelCase)或全大写下划线命名(UPPER_CASE)
curly 在条件或循环语句中使用{}来明确代码块
eqeqeq 使用===和!==替代==和!=
es3 强制使用ECMAScript 3规范
es5 强制使用ECMAScript 5规范
forin 在for in循环中使用Object.prototype.hasOwnProperty()来过滤原型链中的属性
freeze 禁止复写原生对象(如Array, Date)的原型
immed 匿名函数调用必须(function() {}());而不是(function() {})();
indent 代码缩进宽度
latedef 变量定义前禁止使用
newcap 构造函数名首字母必须大写
noarg 禁止使用arguments.caller和arguments.callee
noempty 禁止出现空的代码块
nonew 禁止使用构造器
plusplus 禁止使用++和–-
quotemark 统一使用单引号或双引号
undef 禁止使用不在全局变量列表中的未定义的变量
unused 禁止定义变量却不使用
strict 强制使用ES5的严格模式
trailing 禁止行尾空格
maxparams 函数可以接受的最大参数数量
maxdepth 代码块中可以嵌入{}的最大深度
maxstatement 函数中最大语句数
maxcomplexity 函数的最大圈复杂度
maxlen 一行中最大字符数

【松弛】

asi               允许省略分号
boss       允许在if,for,while语句中使用赋值
debug      允许debugger语句
eqnull      允许==null
esnext      允许使用ECMAScript 6
evil     允许使用eval
expr 允许应该出现赋值或函数调用的地方使用表达式
funcscope 允许在控制体内定义变量而在外部使用
globalstrict 允许全局严格模式
iterator   允许__iterator__
lastsemic 允许单行控制块省略分号
laxbreak 允许不安全的行中断
laxcomma     允许逗号开头的编码样式
loopfunc 允许循环中定义函数
maxerr      JSHint中断扫描前允许的最大错误数
multistr    允许多行字符串
notypeof     允许非法的typeof操作
proto 允许 proto
smarttabs    允许混合tab和space排版
shadow    允许变量shadow
sub      允许使用person[‘name’]
supernew     允许使用new function() {…}和new Object
validthis    允许严格模式下在非构造函数中使用this
noyield     允许发生器中没有yield语句

【环境】

browser              Web Browser (window, document, etc)
browserify Browserify (node.js code in the browser)
jquery jQuery
node Node.js
qunit QUnit
typed Globals for typed array constructions
worker Web Workers
wsh Windows Scripting Host

【全局变量】

globals: {
jQuery: true,
console: true,
module: true
}

  JSHint的默认配置如下所示

{
// JSHint Default Configuration File (as on JSHint website)
// See http://jshint.com/docs/ for more details "maxerr" : 50, // {int} Maximum error before stopping // Enforcing
"bitwise" : true, //Prohibit bitwise operators (&, |, ^, etc.)
"camelcase" : false, //Identifiers must be in camelCase
"curly" : true, //Require {} for every new block or scope
"eqeqeq" : true, //Require triple equals (===) for comparison
"forin" : true, //Require filtering for in loops with obj.hasOwnProperty()
"freeze" : true, //prohibits overwriting prototypes of native objects
"immed" : false, //Require immediate invocations to be wrapped in parens
"latedef" : false, //Require variables/functions to be defined before being used
"newcap" : false, //Require capitalization of all constructor functions
"noarg" : true, //Prohibit use of `arguments.caller` and `arguments.callee`
"noempty" : true, //Prohibit use of empty blocks
"nonbsp" : true, //Prohibit "non-breaking whitespace" characters.
"nonew" : false, //Prohibit use of constructors for side-effects
"plusplus" : false, //Prohibit use of `++` and `--`
"quotmark" : false,
"undef" : true, //Require all non-global variables to be declared
"unused" : true,
"strict" : true, //Requires all functions run in ES5 Strict Mode
"maxparams" : false, // {int} Max number of formal params allowed per function
"maxdepth" : false, // {int} Max depth of nested blocks (within functions)
"maxstatements" : false, // {int} Max number statements per function
"maxcomplexity" : false, // {int} Max cyclomatic complexity per function
"maxlen" : false, // {int} Max number of characters per line
"varstmt" : false, // Relaxing
"asi" : false, //Tolerate Automatic Semicolon Insertion (no semicolons)
"boss" : false, //Tolerate assignments where comparisons would be expected
"debug" : false, //Allow debugger statements e.g. browser breakpoints.
"eqnull" : false, //Tolerate use of `== null`
"esversion" : 5,
"moz" : false, //Allow Mozilla specific syntax
"evil" : false, //Tolerate use of `eval` and `new Function()`
"expr" : false, //Tolerate `ExpressionStatement` as Programs
"funcscope" : false, //Tolerate defining variables inside control statements
"globalstrict" : false, //Allow global "use strict" (also enables 'strict')
"iterator" : false, //Tolerate using the `__iterator__` property
"lastsemic" : false,
"laxbreak" : false, //Tolerate possibly unsafe line breakings
"laxcomma" : false, //Tolerate comma-first style coding
"loopfunc" : false, //Tolerate functions being defined in loops
"multistr" : false, //Tolerate multi-line strings
"noyield" : false, //Tolerate generator functions with no yield statement
"notypeof" : false, //Tolerate invalid typeof operator values
"proto" : false, //Tolerate using the `__proto__` property
"scripturl" : false, //Tolerate script-targeted URLs
"shadow" : false, //Allows re-define variables later in code
"sub" : false,
"supernew" : false, //Tolerate `new function () { ... };` and `new Object;`
"validthis" : false, //Tolerate using this in a non-constructor function // Environments
"browser" : true, // Web Browser (window, document, etc)
"browserify" : false, // Browserify (node.js code in the browser)
"couch" : false, // CouchDB
"devel" : true, // Development/debugging (alert, confirm, etc)
"dojo" : false, // Dojo Toolkit
"jasmine" : false, // Jasmine
"jquery" : false, // jQuery
"mocha" : true, // Mocha
"mootools" : false, // MooTools
"node" : false, // Node.js
"nonstandard" : false, // Widely adopted globals (escape, unescape, etc)
"phantom" : false, // PhantomJS
"prototypejs" : false, // Prototype and Scriptaculous
"qunit" : false, // QUnit
"rhino" : false, // Rhino
"shelljs" : false, // ShellJS
"typed" : false, // Globals for typed array constructions
"worker" : false, // Web Workers
"wsh" : false, // Windows Scripting Host
"yui" : false, // Yahoo User Interface // Custom Globals
"globals" : {} // additional predefined global variables
}

  有时候,我们不希望它检查一些文件(比如一些库文件),这时候可以新建一个 .jshintignore 文件,把需要忽略的文件名写在里面(支持通配符),同样放到项目根目录下即可

build/
src/**/tmp.js

CSSLint

  CSSLint的安装比较简单,使用npm install csslint -g安装即可

  安装sublime插件的方式也类似于jshint

  在项目根目录下建立一个 .csslintrc 文件,这个文件就是CSSLint的配置文件,CSSLint会自动识别这个文件,根据这里面的规则对文件进行检查

【规则】

  就CSSLint而言,最重要的规则是确保CSS中不存在解析错误。解析错误通常意味着错误地输入字符,并导致代码变为无效的CSS。这些错误可能导致浏览器删除属性或整个规则

  CSSLint的规则主要包括以下6种

  1、潜在错误

box-model              设置width或height的同时,还设置为border或padding,则必须设置box-sizing
display-property-grouping 设置display属性时,不能包含其他不必要的代码,如display:inline,又设置height值
duplicate-properties  不允许包含重复的样式属性
empty-rules   不允许包含空样式规则
known-properties    不允许使用不识别的样式属性

  2、兼容性

adjoining-classes           不要使用相邻选择器,如.a.b{}
box-sizing       box-sizing不要与相关属性同用
compatible-vendor-prefixes 需要兼容第三方前缀
gradients          需要所有的渐变定义
text-indent           不能使用负值
vendor-prefix          第三方前缀和标准属性一起使用
fallback-colors         需要指定备用颜色
star-property-hack      不能使用'*'hack
underscore-property-hack 不能使用'_'hack
bulletproof-font-face 需要使用备用字体

  3、性能

font-faces                 不能使用超过5个web字体
import            禁止使用@import
regex-selectors      禁止使用属性选择器中的正则表达式选择器
universal-selector       禁止使用通用选择器*
unqualified-attributes    禁止使用不规范的属性选择器
zero-units       0后面不要加单位
overqualified-elements    使用相邻选择器时,不要使用不必要的选择器
shorthand          简写样式属性
duplicate-background-images 相同的url在样式表中不超过一次

  4、可维护性

floats       不使用超过10次的浮动
font-sizes 不使用超过10次的font-size
ids   不使用id选择器
important 不使用!important

  5、可访问性

outline-none    禁用outline:none

  6、OOCSS

qualified-headings    <h1-h6>应该被设置为顶级样式,所以.box h3{}会提示警告;而h3{}则不会
unique-headings 当多个规则定义针对同一标题的属性时,会出现警告

  CSSLint的常用配置如下

{
"adjoining-classes":false,
"box-sizing":false,
"box-model":false,
"compatible-vendor-prefixes": false,
"floats":false,
"font-sizes":false,
"grandients":false,
"important":false,
"known-properties":false,
"outline-none":false,
"qualified-headings":false,
"regex-selectors":false,
"shorthand":false,
"text-indent":false,
"unique-headings":false,
"universal-selector":false,
"unqualified-attributes":false
}

代码检查工具jshint和csslint的更多相关文章

  1. JavaScript代码检查工具 — JSHint

    静态代码检查是开发工作中不可缺少的一环,毕竟对于程序化的工作人的眼睛是不可靠的,更何况是自己的眼睛看自己的代码.即使最后的运行结果通过,但可能存在一些未定义的变量.定义了但最后没用过的变量.分号有没有 ...

  2. [原创]Java静态代码检查工具介绍

    [原创]Java静态代码检查工具介绍 一  什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...

  3. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)

    PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...

  4. Android 代码检查工具SonarQube

    http://blog.csdn.net/rain_butterfly/article/details/42170601 代码检查工具能帮我们检查一些隐藏的bug,代码检查工具中sonar是比较好的一 ...

  5. 【FLYabroad 】微软内部代码检查工具 (Microsoft Source Analysis for C#)[转]

    SourceAnalysis (StyleCop)的终极目标是让所有人都能写出优雅和一致的代码,因此这些代码具有很高的可读性. 早就听说了微软内部的静态代码检查和代码强制格式美化工具 StyleCop ...

  6. 静态代码检查工具 cppcheck 的使用

      CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们 ...

  7. 静态代码检查工具 cppcheck 的使用(可分别集成到VS和QT Creator里)

    CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们写的 ...

  8. CSS代码检查工具stylelint

    前面的话 CSS不能算是严格意义的编程语言,但是在前端体系中却不能小觑. CSS 是以描述为主的样式表,如果描述得混乱.没有规则,对于其他开发者一定是一个定时炸弹,特别是有强迫症的人群.CSS 看似简 ...

  9. C#静态代码检查工具StyleCode

    C#静态代码检查工具StyleCode -- 初探 最近我们Advent Data Service (ADS) 在项目上需要按照代码规范进行代码的编写工作,以方便将来代码的阅读与维护. 但是人工检查起 ...

随机推荐

  1. RHEL7对比RHEL6的主要变化

    RHEL7和RHEL6的主要变化 RHEL7和RHEL6的主要变化   RHEL7 RHEL6 文件系统 XFS EXT4 内核版本 3.10.x-x系列 2.6.x-x系列 内核名称 Maipo S ...

  2. SpringMVC文件上传下载

    不多说,代码: Spring-config.xml<!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件, 如果扫描到有Spring的相关注解的类,则把这些类注 ...

  3. Html5-audio标签简介及手机端不自动播放问题

    1.audio:html5音频标签 <audio loop src="/photo/aa.mp3" id="audio" autoplay preload ...

  4. MySQL之使用DDL语句创建表

    一.使用DDL语句创建表 DDL语言全面数据定义语言(Data Define Language) 主要的DDL动词: CREATE(创建).DROP(删除).ALTER(修改) TRUNCATE(截断 ...

  5. [内存管理]linux内存管理 之 内存节点和内存分区

    Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理.为此,Linux有了内存节点.内存区.页框的概念,这些概念也是一目了然的. 内存节点:主要依据CPU访 ...

  6. 随机Prim法创建随机迷宫(C#实现)

    因为这两天想参加一个比赛,所以就在上网找素材,刚好看到了迷宫生成,就决定拿这个开刀了. 参考的原文地址为(来源页面) 源地址中是使用AS实现的,没学过AS,所以直接不会运行,于是就自己根据原文的概念进 ...

  7. Linux下Hadoop2.7.1集群环境的搭建(超详细版)

                                本文旨在提供最基本的,可以用于在生产环境进行Hadoop.HDFS分布式环境的搭建,对自己是个总结和整理,也能方便新人学习使用. 一.基础环境 ...

  8. Spring Boot Dubbo applications.properties 配置清单

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 与其纠结,不如行动学习.Innovate ,And out execute ! 』 本文 ...

  9. 新手上路---Java学习知识梳理

    我随笔 我相信也有那么一些人跟我一样,脱下军装后对未来感到迷茫,不知所措甚至怀疑起自己的能力,自身体会的经历过才能明白其中的辛酸!归咎一切:心态,信心,自信!再穷不过乞讨,不死终将出头.好了,闲言碎语 ...

  10. Mysql求百分比

    根据相应条件抽出相应count数(myCount) 抽出总count数(totalCount) 计算百分比:myCount / totalCount * 100 四舍五入:使用ROUND函数ROUND ...