Eslint自定义规则(二)

1,320 阅读2分钟

测试问题

那么eslint自定义的规则该如何去进行测试呢?在用Yeoman generator搭建的工程目录中,其实官方也提供了测试的方法,以块级注释为例

在命令行中npm run test,得到如下的结果

一开始开发的时候遇到问题,如下图:comments结果是什么,blockComments是什么等等。由于是node写的,只能在node环境中跑。不像在浏览器中打开devTool直接console一下就知道结果了。我总不能在所有代码都编写好后再调试吧,我对ast语法没有到如火纯青的地步,哪里错了都不知道,完全是黑盒了。还好有上面的test。

lib/rules/no-block-comments.js

/**
 * @fileoverview js不能块级注释
 * @author mj
 */
"use strict";

//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------

module.exports = {
    meta: {
        docs: {
            description: "js不能块级注释",
            category: "Fill me in",
            recommended: false
        },
        fixable: null,  // or "code" or "whitespace"
        schema: [
            // fill in your schema
        ]
    },

    create: function(context) {

        // 获取源代码
        const sourceCode = context.getSourceCode();

        return {
            Program(node) {
                
                // 获取源代码中所有的注释
                const comments = sourceCode.getAllComments();
                
                // 获取所有的块级注释
                const blockComments = comments.filter(
                    ({ type }) => type === "Block"
                );

                console.log("mj", blockComments)
                
                blockComments.length &&
                    context.report({
                        node: node,
                        message: "No block comments"
                    });
            }
        };
    }
};

tests/lib/rules/no-block-comments.js

/**
 * @fileoverview js不能块级注释
 * @author mj
 */
"use strict";

//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------

var rule = require("../../../lib/rules/no-block-comments"),

    RuleTester = require("eslint").RuleTester;


//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------

var ruleTester = new RuleTester();
ruleTester.run("no-block-comments", rule, {

    valid: ["var a = 1; console.log(a)"],

    invalid: [
        {
            code: "var a = 1; /* block comments */ console.log(a)",
            errors: [{
                message: "No block comments",
                nodeType: "Block"
            }]
        }
    ]
});

上面的规则比较简单,那怎么写一个比较复杂的规则呢?

1、过几遍官方文档

2、文档中很多解释都晦涩难懂,光看肯定不能知道是什么意思,需要亲手去试验

3、最重要的一点是参考官方是怎么写的。比如我想获取到文件中有多少行注释,但看文档没找到api, 这时候就去官网找那些和注释有关的rule源码,在里面肯定能找到答案

4、刚开始写肯定很慢,语法不会,场景考虑不周。但这个是必经之路,毕竟对于ast,对于node了解不深。

结合vscode测试自定义规则

1、由于npm run test 最终是跑的mocha tests --recursive,推荐先去看下阮一峰老师的mocha

2、也可以去看看vscode前端调试不完全指南

通过 vscode 调试前端代码主要依赖于一个插件:Debugger for Chrome,该插件主要利用 Chrome 所开放出来的接口 来实现对其渲染的页面进行调试。可以通过 Ctrl + Shift + X 打开插件中心,搜索对应插件后直接安装。安装完成并重新加载 vscode 后,可以直接点击调试按钮并创建新的启动配置。如果你之前已经创建过启动配置了,就可以直接打开 .vscode/launch.json 进行修改。

最终选择对应的配置,启动调试

那么你就可以实现和浏览器差不多的测试体验了。同学,该你了!