gulp在出错时停止服务器,即使gulpfile.js中包含jshint

gulp在出错时停止服务器,即使gulpfile.js中包含jshint,gulp,jshint,gulp-jshint,Gulp,Jshint,Gulp Jshint,我不知道为什么即使我的gulpfile中有jshint,只要我的js文件中出现错误,服务器仍然会停止。我安装了jshint并将其包含在我的项目中,因为它在js文件中报告错误,但仍然失败。我怎样才能解决这个问题 gulp.task('scripts', () => { return gulp.src('assets/js/src/*.js') .pipe(jshint()) .pipe(jshint.reporter('jshint-stylish',

我不知道为什么即使我的gulpfile中有jshint,只要我的js文件中出现错误,服务器仍然会停止。我安装了jshint并将其包含在我的项目中,因为它在js文件中报告错误,但仍然失败。我怎样才能解决这个问题

gulp.task('scripts', () => {
    return gulp.src('assets/js/src/*.js')
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish', {beep: true}))
        .pipe(concat('main.js'))
        .pipe(gulp.dest('assets/js/build/'))
        .pipe(uglify())
        .pipe(gulp.dest('assets/js/'))
        .pipe(browserSync.stream({stream: true}));
});

gulpjshint
按您所说的做:它报告JavaScript文件中的错误。不多不少。它不会阻止有缺陷的JavaScript文件到达以后的管道阶段,如
uglify()
(如果JavaScript文件中有任何错误,它会抛出并停止服务器)

如果您想防止有缺陷的JavaScript文件破坏您的服务器,您需要将所有
jshint
内容放入它自己的任务中,并确保该任务:

然后您需要使您的
脚本
任务依赖于该
jshint
任务:

gulp.task('scripts', ['jshint'], () => {
    return gulp.src('assets/js/src/*.js')
        .pipe(concat('main.js'))
        .pipe(gulp.dest('assets/js/build/'))
        .pipe(uglify())
        .pipe(gulp.dest('assets/js/'))
        .pipe(browserSync.stream({stream: true}));
});

现在,您的
脚本
任务将仅在
jshint
任务成功时运行。如果任何JavaScript文件有缺陷,则当服务器继续使用上一个好的JavaScript版本运行时,jshint会将错误输出到控制台。

gulp jshint
按您所说的做:它报告JavaScript文件中的错误。不多不少。它不会阻止有缺陷的JavaScript文件到达以后的管道阶段,如
uglify()
(如果JavaScript文件中有任何错误,它会抛出并停止服务器)

如果您想防止有缺陷的JavaScript文件破坏您的服务器,您需要将所有
jshint
内容放入它自己的任务中,并确保该任务:

然后您需要使您的
脚本
任务依赖于该
jshint
任务:

gulp.task('scripts', ['jshint'], () => {
    return gulp.src('assets/js/src/*.js')
        .pipe(concat('main.js'))
        .pipe(gulp.dest('assets/js/build/'))
        .pipe(uglify())
        .pipe(gulp.dest('assets/js/'))
        .pipe(browserSync.stream({stream: true}));
});

现在,您的
脚本
任务将仅在
jshint
任务成功时运行。如果任何JavaScript文件有缺陷,
jshint
会将错误输出到控制台,而您的服务器将继续使用上一个良好的JavaScript版本运行。

最简单的修复方法是使用gulp plumber更优雅地处理错误:

var plumber = require("gulp-plumber");

gulp.task('scripts', () => {
    return gulp.src('assets/js/src/*.js')
        .pipe(plumber())
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish', {beep: true}))
        .pipe(concat('main.js'))
        .pipe(gulp.dest('assets/js/build/'))
        .pipe(uglify())
        .pipe(gulp.dest('assets/js/'))
        .pipe(browserSync.stream({stream: true}));
});
就个人而言,我不喜欢这种解决方案,因为它会阻止您的缩小文件被更新。以下是我的建议:

var jshintSuccess = function (file) {
    return file.jshint.success;
}

gulp.task('scripts', () => {
    return gulp.src('assets/js/src/*.js')
        .pipe(sourcemaps.init())
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish', {
            beep: true
        }))
        .pipe(gulpif(jshintSuccess, uglify()))
        .pipe(concat('main.js'))
        .pipe(sourcemaps.write('maps'))
        .pipe(gulp.dest('assets/js/'))
        .pipe(browserSync.stream({
            stream: true
        }));
});
首先,请注意,我没有向多个目的地写信。相反,我使用sourcemaps,这样您就不需要未统一的代码。第二,我使用gulpif根据jshint的结果有条件地通过uglify传递代码。有错误的代码将绕过uglify,这样它仍然会进入目标文件

现在,您可以使用开发人员工具检查和调试它


注意:我建议这仅用于本地开发。我不会将它连接到一个持续集成管道,因为您只需要好的代码就可以进入生产环境。可以为此设置不同的任务,也可以添加另一个gulp if条件,以防止基于环境变量生成损坏的代码。

最简单的修复方法是使用gulp plumber更优雅地处理错误:

var plumber = require("gulp-plumber");

gulp.task('scripts', () => {
    return gulp.src('assets/js/src/*.js')
        .pipe(plumber())
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish', {beep: true}))
        .pipe(concat('main.js'))
        .pipe(gulp.dest('assets/js/build/'))
        .pipe(uglify())
        .pipe(gulp.dest('assets/js/'))
        .pipe(browserSync.stream({stream: true}));
});
就个人而言,我不喜欢这种解决方案,因为它会阻止您的缩小文件被更新。以下是我的建议:

var jshintSuccess = function (file) {
    return file.jshint.success;
}

gulp.task('scripts', () => {
    return gulp.src('assets/js/src/*.js')
        .pipe(sourcemaps.init())
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish', {
            beep: true
        }))
        .pipe(gulpif(jshintSuccess, uglify()))
        .pipe(concat('main.js'))
        .pipe(sourcemaps.write('maps'))
        .pipe(gulp.dest('assets/js/'))
        .pipe(browserSync.stream({
            stream: true
        }));
});
首先,请注意,我没有向多个目的地写信。相反,我使用sourcemaps,这样您就不需要未统一的代码。第二,我使用gulpif根据jshint的结果有条件地通过uglify传递代码。有错误的代码将绕过uglify,这样它仍然会进入目标文件

现在,您可以使用开发人员工具检查和调试它

注意:我建议这仅用于本地开发。我不会将它连接到一个持续集成管道,因为您只需要好的代码就可以进入生产环境。或者为此设置一个不同的任务,或者添加另一个gulpif条件,以防止基于环境变量生成损坏的代码