esprima.js / gulp-strip-debug通过在剥离调试器语句时报告无用的错误来干扰gulp-jshint任务

时间:2016-06-17 11:29:42

标签: javascript gulp jshint esprima gulp-jshint

这是昨天刚刚开始发生的事情,这让我头疼不已。

作为我arcade.ly构建的一部分,我有一个check-scripts任务,可以剥离调试代码并在我的所有JavaScript上运行 jshint

gulp.task('check-scripts', function () {
    return gulp.src([
        'src/static/scripts/common/pinjector.js',
        'src/static/scripts/common/service.*.js',
        'src/static/scripts/asteroids-starcastle/*.js',
        'src/static/scripts/asteroids/asteroids.js',
        'src/static/scripts/asteroids/app.js',
        'src/static/scripts/starcastle/actor.*.js',
        'src/static/scripts/starcastle/service.*.js',
        'src/static/scripts/starcastle/starcastle.js',
        'src/static/scripts/starcastle/app.js',
        'src/static/scripts/space-invaders/actor.*.js',
        'src/static/scripts/space-invaders/service.*.js',
        'src/static/scripts/space-invaders/space-invaders.js',
        'src/static/scripts/space-invaders/app.js',
        'src/server/*.js',
    ])
    .pipe(stripDebug())
    .pipe(jshint({
        laxbreak: true,
        multistr: true
    }))
    .pipe(jshint.reporter('default'))
    .pipe(jshint.reporter('fail'));
});

直到昨天,这个工作一切正常,如果出现问题,我会收到一个有用的jshint错误,告诉我到底出了什么问题。现在,当我运行gulp check-scripts时,如果出现问题,我经常会遇到这种错误:

11:47:00] Starting 'check-scripts'...

events.js:154
      throw er; // Unhandled 'error' event
      ^
Error: Line 30: Unexpected identifier
    at constructError (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2406:21)
    at createError (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2425:17)
    at unexpectedTokenError (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2499:13)
    at throwUnexpectedToken (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2504:15)
    at expect (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2522:13)
    at expectCommaSeparator (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2546:13)
    at parseObjectInitializer (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:3052:17)
    at inheritCoverGrammar (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2680:18)
    at parsePrimaryExpression (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:3246:20)
    at inheritCoverGrammar (/Library/WebServer/Documents/arcade/node_modules/esprima/esprima.js:2680:18)

如您所见,那里没有有用的信息。目前我正在重构,所以我的变更集通常涵盖了许多文件。这里的问题是我可以看到esprima的解析器不满意,但我不知道哪个文件正在破坏它,也不知道该文件中的哪一行代码。

我可以通过迭代评论和取消注释check-scripts中的行并重新运行gulp-checkscripts,最终通过注释和取消注释代码来解决这个问题,但这显然是一件苦差事。< / p>

在这种情况下,这是导致错误的代码:

function masterSoundConfiguration() {
    var masterConfig = {
        elementCountForRapidRepeat: 6,
        sfxMasterVolume: 0.4,
        musicMasterVolume: 0.6,
        sounds: [],
        music: []                        // <-- Missing comma
        mergeIntoMaster: mergeIntoMaster
    };

    ...
}

如您所见,缺少逗号,导致错误。

问题似乎是由gulp-strip-debug引起的,但如果我只是禁用此 jshint 会因为debugger语句而抱怨。由于我需要构建甚至在开发中运行该站点,这是一个麻烦。

我想我可以禁用gulp-strip-debug并配置 jshint 来忽略debugger语句,仅适用于dev版本,但有没有办法将gulp-strip-debug配置为报告错误更好,或者这是一个错误/设计缺陷/疏忽?

非常感谢任何见解/建议。

谢谢,

巴特

1 个答案:

答案 0 :(得分:0)

gulp-strip-debug库是strip-debug的一个非常薄的包装器,所以我很想得出结论这是strip-debug中的一个错误(或缺陷),尽管它也可能在方式gulp-strip-debug报告来自strip-debug的错误。

我需要进一步调查,并可能投入公关。即使没有行号,它也很容易让它报告错误所在的文件,这本身就是一个很大的改进。