静态代码检查是开发工作中不可缺少的一环,毕竟对于程序化的工作人的眼睛是不可靠的,更何况是自己的眼睛看自己的代码。即使最后的运行结果通过,但可能存在一些未定义的变量、定义了但最后没用过的变量、分号有没有加(看团队规则)以及其他的问题。给力的工具必不可缺。

在本文要介绍的JSHint之前还有JSLint,道格拉斯的作品,应该是JavaScript精粹的附属产物。。。要求你必须使用它的规则,对于JavaScript这样一个灵活的语言,还是要用一个灵活的工具,JSHint就是就是这样。

安装

首先需要安装了Nodejs和npm,然后 npm install -g jshint 就好了。

这样你就可以使用命令行使用JSHint了。

当然他也提供了巨多的编辑器插件,比如Sublime Text 3

以及Grunt或者Gulp之类的插件。

配置

安装完了就可以使用了。

命令行下直接: jshint myfile.js 就ok,命令行里就可以显示错误或者警告。

编辑器下一般直接显示在出错或者警告的行数处。比如Sublime3 下,在当前文件下,快捷键 Ctrl+Alt+J 就会显示信息( Ctrl+Alt+C 关闭信息显示):

更多快捷键看插件的设置,可以自定义。

不过这些显示都是JSHint默认的配置,我们可以自定义配置更好的满足需求。

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

(windows下建立前面带点的文件会不让建立,一种方法直接在Sublime Text里建立,另一种方法在文件名后加个点即可)

JSHint的配置分为四类:

1、Enforcing:如果这些属性设置为true,表明这个代码风格够严格的,比如是否使用严格(strict)模式、变量驼峰式命名、是不是for-in循环里必须得有hasOwnProperty等等

2、Relaxing:比如是否使用分号,是否支持下一代ES语法等等。

3、Environments:你的代码所在的环境(Nodejs、浏览器、jQuery。。)

4、自定义的全局属性,比如我司的NEJ和Regular,这两个全局变量JSHint是不知道的,放在这里JSHint不会报出错误信息。

默认的JSHint的配置看这里:JSHint默认配置(Sublime插件自定义了默认的配置,你可以在插件的配置里看到,甚至可以直接修改它)

对这些配置的讲解:配置详解

都是英文的,不过配合着四六级的水平和有道翻译,基本木有问题。下面是一个简单的配置示例。

{
"strict" : false,
"undef" : true,
"unused" : true, "asi" : true,
"evil" : false, "browser": true,
"devel": true, "globals" : {
"NEJ": true,
"Regular": true
}
}

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

build/
src/**/tmp.js

自定义Reporter

JSHint源码里有一个reporter.js,定义错误提示信息改怎样输出,同样可以自定义。默认的是这样的:

"use strict";

module.exports = {
reporter: function (res) {
var len = res.length;
var str = ""; res.forEach(function (r) {
var file = r.file;
var err = r.error; str += file + ": line " + err.line + ", col " +
err.character + ", " + err.reason + "\n";
}); if (str) {
process.stdout.write(str + "\n" + len + " error" +
((len === 1) ? "" : "s") + "\n");
}
}
};

基本的格式就是:

module.exports = {
reporter: function (reporter) {
//....
}
};

每个reporter都符合一定的格式:

{
file: [string, filename]
error: {
id: [string, usually '(error)'],
code: [string, error/warning code],
reason: [string, error/warning message],
evidence: [string, a piece of code that generated this error]
line: [number]
character: [number]
scope: [string, message scope;
usually '(main)' unless the code was eval'ed] [+ a few other legacy fields that you don't need to worry about.]
}
}

比如你可以让他不输出到控制台而是打印到txt文件里(不知为何异步写入文件一直不成功,最后只好用同步函数):

'use strict';

var fs = require('fs');

module.exports = {
reporter: function (res) {
var len = res.length;
var str = '';
var filename = ''; res.forEach(function (r, i) {
filename = r.file;
var err = r.error; if(i === 0) str += filename + '\n'; str += 'line ' + err.line + ', col ' +
err.character + ', ' + err.reason + '\n';
}); if (str) {
var output = str + '\n\n';
fs.writeFileSync('message.txt', output);
}
}
};

命令行执行:

jshint --reporter=myreporter.js myfile.js

同样可以更近一步,如果你想一下把所有该检查的文件全都检查了,然后将检查结果保存到txt里:

// code-check.js
var fs = require('fs');
var path = require('path');
var exec = require('child_process').exec; var curPath = path.join(process.cwd(), 'src', 'javascript'); function travelDir(dir, callback) {
fs.readdirSync(dir).forEach(function(file) {
var pathname = path.join(dir, file); if(fs.statSync(pathname).isDirectory()) {
travelDir(pathname, callback);
} else {
callback(pathname);
}
});
} fs.writeFileSync('message.txt', '');
travelDir(curPath, function(file) {
exec('jshint --reporter=reporter.js ' + file);
});
// reporter.js
'use strict'; var fs = require('fs'); module.exports = {
reporter: function (res) {
var len = res.length;
var str = '';
var filename = ''; res.forEach(function (r, i) {
filename = r.file;
var err = r.error; if(i === 0) str += filename + '\n'; str += 'line ' + err.line + ', col ' +
err.character + ', ' + err.reason + '\n';
}); if (str) {
var output = str + '\n\n';
fs.appendFileSync('message.txt', output);
}
}
};

只要  node code-check 就可以了。

不过,Sublime插件下不知道如何自定义。

API

JSHint暴漏了一些接口,既可以在浏览器也可以在Nodejs中使用。

浏览器下首先加载jshint.js文件:

<script src="node_modules/jshint/dist/jshint.js"></script>

首先检查js语句是否存在错误:

var result = JSHINT(source, options, predef)

source是你要检查的代码,可以是字符串,也可以是数组,数组的话每一项代表一行代码。

options也上面说过的配置项,但不包括Globals

predef是上面说过的Globals

当result返回false的时候,代表语句中有错误,这时候调用 JSHINT.data() 就会得到错误的详细信息,看下面的示例:

var source = [
'function() { console.log("a") }',
'x = 3'
]
var options = {
undef: true
}
var predef = {
x: true
}
var result = JSHINT(source, options, predef) console.log(JSHINT.data())

浏览器的控制台就会输出错误的详细信息,这样我们甚至可以做一个错误报告出来,就像公司内部的代码检查平台 一样。

不过有个问题,不可能我们把代码一行一行的敲到参数里,ajax或者服务器端请求都行,看这里

所以嘛,还是在node环境下使用最方便:

// check.js
var JSHINT = require('jshint').JSHINT,
fs = require('fs'),
files = []; process.argv.forEach(function(val) {
files.push(val)
}) console.log('-----------------------------------------') for(var i = 2; i < files.length; i++) {
fs.readFile(files[i], function(err, data) {
if(err) {
console.log('Error: ' + err)
return
} if(JSHINT(data.toString())) {
console.log('File ' + files[i] + ' has no errors!')
} else {
console.log('Errors in file ' + files[i]);
console.log('') var out = JSHINT.data(),
errors = out.errors;
for(j = 0; j < errors.length; j++) {
console.log(errors[j].line + ': ' + errors[j].character + ' -> ' +
errors[j].reason + ' -> ' + errors[j].evidence);
} console.log('')
console.log('Globals: ')
for(var j = 0; j < out.globals.length; j++) {
console.log(' ' + out.globals[j]);
}
} console.log('---------------------------------------------')
})
}

使用的时候

node check a.js b.js c.js

最后在控制台输出错误。

有时候掌握一个工具工作效率会提高很多倍,学会做一个懒人。

JavaScript代码检查工具 — JSHint的更多相关文章

  1. 代码检查工具jshint和csslint

    前面的话 Douglas Crockford大神根据自己的理念用JavaScript写了一个JavaScript代码规范检查工具,这就是JSLint.后来非常流行,也的确帮助了广大的JavaScrip ...

  2. Grunt 之 使用 JavaScript 语法检查工具 jshint

    前端开发环境准备好了,我们准备开始进行开发. 前端开发的主力语言是 JavaScript,这是一种脚本语言,没有编译器,也就没有了编译器带给我们的语法检查,怎样保证代码的质量呢?jshint 是一个强 ...

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

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

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

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

  5. Android 代码检查工具SonarQube

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

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

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

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

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

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

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

  9. CSS代码检查工具stylelint

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

随机推荐

  1. QM课程01-功能概述

    QM模块满足一个 CIQ 系统的下列功能: 一般功能 · 在物料主记录中集成QM检验数据 · 管理供应商和客户或销售部门的物料相关的质量信息 · 把质量特性和物料说明中的检验特性连接 · 管理中央凭证 ...

  2. Codeforces Round #333 (Div. 1) C. Kleofáš and the n-thlon 树状数组优化dp

    C. Kleofáš and the n-thlon Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  3. Android学习笔记(20)————利用ListView制作带竖线的多彩表格

    http://blog.csdn.net/conowen/article/details/7421805 /********************************************** ...

  4. Metadata Lock原理8

    http://www.kancloud.cn/taobaomysql/monthly/67141 MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了 ...

  5. Exploring Python Code Objects

    Exploring Python Code Objects https://late.am/post/2012/03/26/exploring-python-code-objects.html Ins ...

  6. Java元组类型之javatuples

    转载:Java元组类型之javatuples 关于方法的返回值,经常需要返回2个值或多个值的一个序列,比如数据表的一条记录,文件的一行内容等.除了使用数组Array.集合(List.Set.Map)这 ...

  7. IntellijIdea中常用的快捷键

    快速查找类:Ctrl+N 提示:Ctrl+Space 提示:Ctrl+Shift+Space 查看documentation:Ctrl+Q 查找类.方法.变量的引用:Alt+F7 定位类.方法.变量的 ...

  8. cocos2dx jsoncpp

    jsoncpp下载 http://sourceforge.net/projects/jsoncpp/ 下载解压后用到的是include\json下面的头文件跟src\lib_json下的文件. 导入头 ...

  9. 不安装oracle客户端也可以使用pl/sql developer

    通常情况下,用PL/SQL Developer连接Oracle是需要安装Oracle客户端软件的,这也就意味着你的硬盘将被占用大约1G-2G的空间,对于Windows操作系统来说,你还会多出一些开机自 ...

  10. A beginner’s guide to Cache synchronization strategies--转载

    原文地址:http://vladmihalcea.com/2015/04/20/a-beginners-guide-to-cache-synchronization-strategies/ Intro ...