grunt 中配置 jshint 测试 javascrpt 脚本代码质量

2019-05-1714:43:56WEB前端开发Comments2,886 views字数 6272阅读模式

前端开发的主力语言是 JavaScript,这是一种脚本语言,没有编译器,也就没有了编译器带给我们的语法检查,怎样保证代码的质量呢?jshint 是一个强大的工具。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

1. 概要说明

grunt 中配置 jshint 测试 javascrpt 脚本代码质量文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

官方地址:http://jshint.com/文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

GitHub 地址:https://github.com/jshint/jshint文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

JSHint 是一个使用 JavaScript 编写的 JavaScript 的代码质量检查工具,主要用来检查代码质量以及找出一些潜在的代码缺陷。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

2. 下载 jshint

使用 NPM 下载一个 jshint 让我们测试一下。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

npm install grunt-contrib-jshint --save-dev

看到如下的输出文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

PS C:\Study\framework> npm install grunt-contrib-jshint --save-dev
npm WARN peerDependencies The peer dependency grunt@>=0.4.0 included from grunt-contrib-jshint will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
grunt@ node_modules\grunt
├── dateformat@
├── which@
├── eventemitter2@
├── getobject@
├── colors@
├── rimraf@
├── async@
├── hooker@
├── grunt-legacy-util@
├── exit@
├── minimatch@ (sigmund@1.0.1, lru-cache@2.6.5)
├── lodash@
├── coffee-script@
├── 
├── iconv-lite@
├── nopt@ (abbrev@)
├── findup-sync@ (glob@3.2.11, lodash@2.4.2)
├── grunt-legacy-log@ (grunt-legacy-log-utils@0.1.1, lodash@2.4.2, underscore.string@2.3.3)
├── glob@ (inherits@1.0.2, graceful-fs@1.2.3)
└── js-yaml@ (esprima@1.0.4, argparse@0.1.16)

grunt-contrib-jshint@ node_modules\grunt-contrib-jshint
├── hooker@
└── jshint@ (strip-json-comments@1.0.4, exit@, shelljs@0.3.0, console-browserify@1.1.0, minimatch@2.0.10, cli@
0.6.6, lodash@3.7.0, htmlparser2@3.8.3)

重新查看 ,可以看到已经添加了 jshint 的依赖说明。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

{
  "name": "framework",
  "version": "",
  "description": "",
  "main": "",
  "dependencies": {
    "grunt": "^",
    "grunt-contrib-jshint": "^"
  },
  "devDependencies": {
    "grunt-contrib-jshint": "^"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

3. 在 grunt 中配置 jshint 测试 javascrpt 脚本

在我们的项目文件夹根目录中,创建一个前端项目源码的文件夹 app,在其中创建一个 scripts 的文件夹,用来保存我们编写的脚本。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

创建名为 的脚本文件,写入如下内容。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

// Hello.
//
// This is JSHint, a tool that helps to detect errors and potential
// problems in your JavaScript code.
//
// To start, simply enter some JavaScript anywhere on this page. Your
// report will appear on the right side.
//
// Additionally, you can toggle specific options in the Configure
// menu.function main() {
  return 'Hello, World!';
}

main();

我们需要在 grunt 中配置 jshint 的任务。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

module.exports = function(grunt) {

  // Project configuration.  ({
      pkg: (''),

    // Make sure code styles are up to par and there are no obvious mistakes// code style check// 代码检查    jshint: {
        all: [
            'app/**/*.js'
             ],
        options: {
            browser: true,            // browser environment
            devel: true//            }
    }
  });

  ('grunt-contrib-jshint');
};

all 中配置需要检查的脚本文件路径,options 中的 browser 用来配置说,我们的脚本需要在浏览器环境下执行,这样,我们的脚本中可以使用 console、setTimeout 等等函数了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

现在执行 grunt hint 就可以看到如下的输出。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

PS C:\Study\framework> grunt jshint
Running "jshint:all" (jshint) task
>> 1file lint free.

Done, without errors.

如果把脚本中 main() 后面的分号 (;) 删除掉,重新检查,就会发现 jshint 发挥了作用。它告诉我们 文件的第 16 行 main() 后面少了一个分号 (;)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

PS C:\Study\framework> grunt jshint
Running "jshint:all" (jshint) task

   app/scripts/
     16 |main()
               ^ Missing semicolon.

>> 1 error in1file
Warning: Task "jshint:all" failed. Use --force to continue.

Aborted due to warnings.

4. 配合 jQuery

在使用 jQuery 脚本库的情况下,我们的函数可能是这样的,使用 jQeury 的 ready 函数来开始。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

"use strict";

$( function(){
    ('Hello, world.');
});

这时使用 jshint 检查,就会发现 $ 是一个问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

PS C:\Study\framework> grunt jshint
Running "jshint:all" (jshint) task

   app/scripts/
      1 |'use strict';
         ^ Use the function form of "use strict".
      3 |$( function(){
         ^ '$' is not defined.

>> 2 errors in 1 file
Warning: Task "jshint:all" failed. Use --force to continue.

Aborted due to warnings.

第一个错误是 jshint 的规则 strict mode directive in the outermost scope of the code 导致,我们应该将 "use strict"; 放在函数内部的第一行中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

具体的原因说明:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

第二个错误是说,jshint 提示说不认识 $,'$' is not defined.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

jQuery 是在另外的库中定义的,我们这里只是使用而已。可以配置 jshint 中配置 $ 是一个全局变量。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

脚本修改为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

$( function(){
    "use strict";
    
    ('Hello, world.');
});

修改为文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

module.exports = function(grunt) {

  // Project configuration.  ({
      pkg: (''),

      // Make sure code styles are up to par and there are no obvious mistakes// code style check// 代码检查    jshint: {
        all: [
            'app/**/*.js'
             ],
        options: {
            globals: {
                $: false,
                jQuery: false
            },
            browser: true,            // browser environment
            devel: true//            }
    }
  });

  ('grunt-contrib-jshint');
  ('default', 'Hello, world task description.', function() {
      ('Hello, world.');
  });

};

5. Options

任何配置选项都会被透明底传递给 JSHint, 所以,你可以配置 JSHint 支持的任何特性。支持的特性见 JSHint documentation .文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

这里还额外支持一些特性:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

globals

Type: Object
Default: null文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

定义全局变量的字典,Key 就是全局变量的名字,布尔型的值用来表示可赋值。这不是 JSHint 的标准选项,但是会作为第三个参数传递给 JSHint。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

jshintrc

Type: String or true
Default: null文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

如果设置为 true,这里的配置参数不会传递给 JSHint,JSHint 将会通过 .jshintrc 文件来获取参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

如果设置了文件名,将会通过这个文件获取配置参数. 这个 jshintrc 文件必须是一个合法的 JSON 文件,类似这样。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

{
  "curly": true,
  "eqnull": true,
  "eqeqeq": true,
  "undef": true,
  "globals": {
    "jQuery": true
  }
}

需要注意的是 jshintrc 文件的配置信息不会与 中的配置进行合并。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

extensions

Type: String
Default: ''文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

需要检查的非 dot-js 扩展名列表。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

ignores

Type: Array
Default: null文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

需要忽略的文件和目录列表. 将会覆盖 .jshintignore 文件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

force

Type: Boolean
Default: false文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

设置为 true 将会报告 JSHint 错误,而不会将任务失败掉。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

reporter

Type: String
Default: null文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

Allows you to modify this plugins output. By default it will use a built-in Grunt reporter. Set the path to your own custom reporter or to one of the built-in JSHint reporters: jslint or checkstyle.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

允许修改输出插件,默认使用 Grunt 内置的报告器. 可以配置为自定义的报告器路径,或者 JSHint 内置的报告器之一: jslint 或者 checkstyle。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

See also: Writing your own JSHint reporter.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

可以指定一个外部的报告器,例如: jshint-stylish:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

首先通过 npm 进行安装。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

$ npm install --save-dev jshint-stylish
然后进行配置
options: {
    reporter: require('jshint-stylish')
}

reporterOutput

Type: String
Default: null文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

配置报告的输出路径. 如果配置,输出将不会输出到标准输出流,而是这个设置的路径。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

示例

Wildcards

In this example, running grunt jshint:all (or grunt jshint because jshint is a multi task) will lint the project's Gruntfile as well as all JavaScript files in the lib and test directories and their subdirectorieses, using the default JSHint options.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

下面的这个例子,执行 grunt jshint:all ( 由于 jshint 是一个多任务的任务,可以直接使用 grunt jshint,  ) 将会使用默认的 JSHint 配置。检查 ,lib 下面的任何 js 文件,test 下面的任何 js 文件,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

// Project configuration.({
  jshint: {
    all: ['', 'lib/**/*.js', 'test/**/*.js']
  }
});

Linting before and after concatenating

下面的这个例子中,执行 grunt jshint 将会检查 'beforeconcat' 和 'afterconcat' 的所有文件,这并不理想,因为 dist/ 会在 grunt-contrib-concat plugin 的 concat 任务创建它之前被检查。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

在这种情况下,应该先检查 'beforeconcat' 中的文件, 然后合并文件,最后再检查 'afterconcat' 中的文件,这样执行:grunt jshint:beforeconcat concat jshint:afterconcat.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

// Project configuration.({
  concat: {
    dist: {
      src: ['src/', 'src/'],
      dest: 'dist/'
    }
  },
  jshint: {
    beforeconcat: ['src/', 'src/'],
    afterconcat: ['dist/']
  }
});

Specifying JSHint options and globals

这个例子演示了定制 JSHint 的配置. 注意在 grunt jshint:uses_defaults 执行的时候,将会使用默认的配置, 但是当 grunt jshint:with_overrides 执行的时候,将使用合并之后的配置。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

// Project configuration.({
  jshint: {
    options: {
      curly: true,
      eqeqeq: true,
      eqnull: true,
      browser: true,
      globals: {
        jQuery: true
      },
    },
    uses_defaults: ['dir1/**/*.js', 'dir2/**/*.js'],
    with_overrides: {
      options: {
        curly: false,
        undef: true,
      },
      files: {
        src: ['dir3/**/*.js', 'dir4/**/*.js']
      },
    }
  },
});

Ignoring specific warnings

如果希望忽略特定的警告:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

[L24:C9] W015: Expected '}' to have an indentation at 11 instead at 9.

可以通过在警告标识之前加上减号 (-) 来关掉它。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html

({
  jshint: {
    ignore_warning: {
      options: {
        '-W015': true,
      },
      src: ['**/*.js'],
    },
  },
});
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/12505.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/gcs/12505.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定