为什么 Gulp 无法在更改后自动重新处理我的 JS?

Why does Gulp fail to automatically re-process my JS upon changes?

在我的 gulpfile.js 中,JS 更改会自动触发 BrowserSync 重新加载和我的 JS 处理任务。但出于某种原因,虽然重新加载确实有效,但我的 JS 任务无法正确处理 JS 更改并在 dist/ 文件夹中创建新的 JS 文件。为此,我必须重新启动 Gulp。为什么?

Gulpfile.js:

var gulp = require('gulp');
var sass = require('gulp-sass');
var browserSync = require('browser-sync').create();
var concat = require('gulp-concat');
var jshint = require('gulp-jshint');
var uglify = require('gulp-uglify');

gulp.task('sass', function() {
  return gulp.src('../assets/styles/**/*.scss')
  .pipe(sass())
  .pipe(gulp.dest('../dist/styles'))
  .pipe(browserSync.reload({
    stream: true
  }))
});

gulp.task('js', function() {
  return gulp.src(['../assets/scripts/*.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('default'))
    .pipe(concat('main.js'))
    .pipe(uglify())
    .pipe(gulp.dest('../dist/scripts'))
});

gulp.task('browserSync', function() {
  browserSync.init({
    proxy: 'http://127.0.0.1/my_site/new-front-page/',
  })
})

gulp.task('watch', ['sass', 'js', 'browserSync'], function() {
  gulp.watch('../assets/styles/**/*.scss',['sass']);
  gulp.watch('../**/**/*.php', browserSync.reload);
  gulp.watch('../assets/scripts/*.js', browserSync.reload);
  gulp.watch('../*.html', browserSync.reload);
});

编辑:

还针对 "js" 任务尝试了以下代码(与上面的代码相比,请参阅最后 3 行),但无济于事:

gulp.task('js', function() {
  return gulp.src(['../assets/scripts/*.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('default'))
    .pipe(concat('main.js'))
    .pipe(uglify())
    .pipe(gulp.dest('../dist/scripts'))
    .pipe(browserSync.reload({
      stream: true
    }))
});

您的 gulp.watch for js 更改实际上并未调用您的 'js' 任务。这就是为什么您必须重新运行 'watch' 任务才能看到任何更改。

gulp.watch('../assets/scripts/*.js', browserSync.reload);

它只是重新加载浏览器,但不调用 'js' 任务。更改为:

gulp.watch('../assets/scripts/*.js', ['js']);

gulp.task('js', function() {
  return gulp.src(['../assets/scripts/*.js'])
  .pipe(jshint())
  .pipe(jshint.reporter('default'))
  .pipe(concat('main.js'))
  .pipe(uglify())
  .pipe(gulp.dest('../dist/scripts'))
  .pipe(browserSync.reload({ stream:true }));
});

尝试执行 js 任务,就像我在下面提到的那样

gulp.task('js', function() {
gulp.src(['../assets/scripts/*.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('default'))
    .pipe(concat('main.js'))
    .pipe(uglify())
    .pipe(gulp.dest('../dist/scripts'))
    .pipe(browserSync.reload({ stream:true }));
});

gulp.task('watch', function() {
watch(['../assets/scripts/*.js'], function() {
    gulp.start('js');
 });
});

gulp.task('default', ['js', 'watch']);

这样写对我很有帮助。希望对你有用。

尝试 end 事件:

gulp.task('js', function() {
  return gulp.src(['../assets/scripts/*.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('default'))
    .pipe(concat('main.js'))
    .pipe(uglify())
    .pipe(gulp.dest('../dist/scripts'))

    .on('end', browserSync.reload)
});

作为 mark mentioned in ,您应该更改 watch 任务。但是,你应该:

gulp.watch('../assets/styles/**/*.scss',['sass', browserSync.reload]);
gulp.watch('../**/**/*.php', browserSync.reload);
gulp.watch('../assets/scripts/*.js', ['js', browserSync.reload]);
gulp.watch('../*.html', browserSync.reload);

当样式和脚本更改时,我们重新运行任务 (sass & js) 并重新加载页面。

我尝试了您的代码并进行了这些更改并且它有效。答案基于 Google Web Starter Kit's gulpfile.babel.js 其中有:

gulp.watch(['app/scripts/**/*.js'], ['lint', 'scripts', reload]);
gulp.task('watch', ['sass' , 'js' , 'browserSync'], function() {
gulp.watch('../assets/styles/**/*.scss' , ['sass']);
gulp.watch('../**/**/*.php' , browserSync.reload);
gulp.watch('../assets/scripts/*.js' , browserSync.reload);
gulp.watch('../*.html', browserSync.reload);
}); 

`需要完成的任务数组,在gulp运行watch之前,对数组进行逆序处理。所以browserSync先运行,然后js然后sass。您只需将顺序反转为 ['browserSync'、'js'、'sass']。 那应该可以解决问题。

我会按如下方式更改监视任务:

gulp.task('sass', function() {
  return gulp.src('../assets/styles/**/*.scss')
  .pipe(sass())
  .pipe(gulp.dest('../dist/styles'))
  .pipe(reload({stream: true}));
});

gulp.task('js', function() {
  return gulp.src(['../assets/scripts/*.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('default'))
    .pipe(concat('main.js'))
    .pipe(uglify())
    .pipe(gulp.dest('../dist/scripts'))
    .pipe(reload({stream: true}));
});

gulp.task('watch', ['sass', 'js'], function() {
  browserSync.init({
    proxy: 'http://127.0.0.1/my_site/new-front-page/',
  });

  gulp.watch('../assets/styles/**/*.scss',['sass']);
  gulp.watch('../**/**/*.php').on('change', browserSync.reload);
  gulp.watch('../assets/scripts/*.js', ['js']);
  gulp.watch('../*.html').on('change', browserSync.reload);
});

问题可能出在您重新加载的方式上。

稍微模块化您的代码。易于更改!

你的gulpfile.js

var build = require('./gulp/build'); gulp.task('build:dist', build.buildDist); gulp.task('build', gulp.series('build:dist'));

在你的 build.js inside gulp 文件夹中做一系列你想执行的任务 var buildDev = gulp.series( 干净的, gulp.series( 皮棉, 注入开发, moveAndFlattenFonts, moveAndFlattenAdminFonts, 移动JsonToApp ) ); var buildDist = gulp.series( 构建开发, //移动所有的东西 gulp.parallel( 移动HTML, 移动索引HTML, 移动AdminHtml, moveBowerComponentImagesToDist, moveAdminComponentImagesToDist, moveImagesToDist, moveFontsToDist, moveIconsToDist, moveJsonToDist, 移动服务器配置文件, moveScriptsToDist, moveScriptsToAdminDist,<br> 移动CSSToDist, moveCssToAdminDist, moveAndTemplatifyHtml<br> ), replaceRevisionedPaths, injectToIndexDist, 注入到AdminDist ); 和 运行 gulp build:dist 作为起始任务