前两天发了一篇用mingw编译Javascript v8,讲述我为了在Windows下给Javascript做lint检查,费劲去编译google的Javascript引擎v8。但昨天在网上搜来搜去,找到一个非常简单的方案: jshint。它采用了 jsdb 这个解释器程序,jsdb 提供了linux/windows/mac下预编译好的二进制包,而且有读取文件的Javascript api,所以可以用来做lint工具。
安装方法:
- 下载 jsdb 可执行程序: http://www.jsdb.org;
- 下载 jshint 和jshint.js https://github.com/spytheman/jshint-cli-with-jsdb ;
- 然后就可以调用 jsdb jshint your_file.js 来检查你的Javascript代码文件是否有问题(如果你在Linux下,可以直接给 jshint 添加可执行权限(Linux会根据第一行的声明 #!/usr/bin/env jsdb 自动找 jsdb 来执行自己),然后用jshint your_file.js就可以啦)
不过有个小地方要注意: jshint这个文件里会在当前目录加载jslint.js,找不到就无法完成lint工作,所以你要么将jshint.js放到一个固定的位置,修改一下jshint这个文件,要么将jshint.js的代码干脆拼到jshint的头部去。
这个jsdb是个Javascript解释器,基于mozilla的SpiderMonkey引擎,所以速度不错,也支持新的JS语法。
怎么样,对比一下jslint-v8的安装,够简单吧。
不过如果你只在Windows下工作,并且不会用到Javascript 1.5以后的那些语言特性,这里有个更简单的工具:http://www.Javascriptlint.com/ 下载下来,用jsl -conf yourconf.conf your_file.js 就可以了(你可以为每个项目配置一个yourconf.conf,这个工具提供了很多选项)。
下面又要发扬我的啰嗦风格了,补充一些不太重要的内容,有兴趣的可以看看:
1. 这个jshint 相对jslint-v8而言,还是有一点功能缺失:这个jshint 并没有像jslint-v8那样,将Douglas Crockford 在jslint.js里面提供的那些配置项暴露出来(比如使用jslint-v8是可以这样 jslint --predef gBrowser,command,util keysnail.js 来检查keysnail的配置文件,而它不会反复抱怨gBrowser,command这些对象未定义。到 Douglas 的在线jslint网站看一下,就知道有很多选项是很有用的,要每次修改jshint还是比较麻烦,最好要能象jslint-v8一样通过命令行传入。
2. 为什么Javascript的 lint 工具都这么麻烦呢?Douglas不都已经提供了检查错误的代码,直接使用一下不就行了? 其实主要的问题在于Javascript 解释器,这个语言以前一直不是一个独立的语言,而是一种纯粹的脚本语言,它是生活在一个宿主里面的,自己没有任何I/O接口,加上它主要是用在浏览器里面,安全性要求又比较高,所以各个 Javascript 解释器都没有把I/O等功能放在里面。即使有的 Javascript 解释器有load()函数加载一个js文件,但这里还是有一个问题,怎么读入被检查的代码?
所以jslint-v8和jsdb都是将自己做成了一个Javascript的host,利用引擎的API添加了读文件的JS API(比如jsdb提供的Stream.read()函数)。其实以前网上很多都说用mozilla rhino来做jslint工具(Douglas原本在网站上就提供了一份rhino版的jslint),也是因为它基于JVM已经有了读文件的接口。但Rhino比较慢(主要是启动慢),还得装JRE,我是不太感冒。