【问题标题】:Node + Gulp - Have to save files two times to see changes in browserNode + Gulp - 必须保存文件两次才能看到浏览器的变化
【发布时间】:2017-09-03 17:00:16
【问题描述】:

能否请您指出正确的方向来解决这种不一致?

我正在一个使用 Node、gulp 和 gulp 插件列表的新项目中工作。 每次我执行 Ctrl + S 时,浏览器都会重新加载,但我没有看到应用的更改,所以我需要再次 Ctrl + S 才能看到它们。这第二次浏览器重新加载显示更改。

我的源目录下的我的任何 html、scss 或 js 文件都会发生这种情况。

我正在使用 Visual Studio Code 在 Windows 10 上工作,除此之外一切正常。

我的 gulpfile.js 内容如下:

    var gulp = require('gulp');
    var sass = require('gulp-sass');
    var inject = require('gulp-inject');
    var wiredep = require('wiredep').stream;
    var plumber = require('gulp-plumber');
    var imagemin = require('gulp-imagemin');
    var browserSync = require('browser-sync');
    var uglify = require('gulp-uglify');

    gulp.task('styles', function(){
      var injectFiles = gulp.src(['!src/styles/main.scss', 'src/styles/*.scss'], {read: false});
      var injectGlobalFiles = gulp.src('src/global/*.scss', {read: false});

     function transformFilepath(filepath) {
        return '@import "' + filepath + '";';
      }

      var injectFilesOptions = {
        transform: transformFilepath,
        starttag: '// inject:app',
        endtag: '// endinject',
        addRootSlash: false
      };

      var injectGlobalOptions = {
        transform: transformFilepath,
        starttag: '// inject:global',
        endtag: '// endinject',
        addRootSlash: false
      };

      return gulp.src('src/styles/main.scss')
        .pipe(plumber())
        .pipe(wiredep())
        .pipe(inject(injectGlobalFiles, injectGlobalOptions))
        .pipe(inject(injectFiles, injectFilesOptions))
        .pipe(sass())
        .pipe(gulp.dest('dist/styles'));
    });

    gulp.task('browser-sync', function() {  
      browserSync.init(["styles/*.css", "js/*.js","index.html"], {
          server: {
              baseDir: "dist"
          }
      });
    });

    gulp.task('html', ['styles'], function(){
      var injectFiles = gulp.src('src/styles/*.scss', {read: false});
      var injectOptions = {
        addRootSlash: false,
        ignorePath: ['src', 'dist']
      };

      return gulp.src('src/index.html')
        .pipe(plumber())
        .pipe(inject(injectFiles, injectOptions))
        .pipe(gulp.dest('dist'));
    });

    gulp.task('imagemin', function() {
      gulp.src('src/assets/*.{jpg,jpeg,png,gif,svg}')
      .pipe(plumber())
      .pipe(imagemin())
      .pipe(gulp.dest('dist/assets'));
    });

    gulp.task('uglify', function() {
      gulp.src('src/js/*.js')
          .pipe(uglify())
          .pipe(gulp.dest('dist/js'));
    });

    gulp.task('sass', function() {
      gulp.src('src/styles/*.scss')
          .pipe(plumber())
          .pipe(sass())
          .pipe(gulp.dest('dist/styles/'));
    });

    gulp.task('watch', function() {
      gulp.watch('src/js/*.js', ['uglify']).on('change', browserSync.reload);
      gulp.watch('src/styles/*.scss', ['sass']).on('change', browserSync.reload);
      gulp.watch('src/assets/*.{jpg,jpeg,png,gif,svg}', ['imagemin']).on('change', browserSync.reload);
      gulp.watch('src/index.html', ['html']).on('change', browserSync.reload);
    });



gulp.task('default', ['html', 'sass','imagemin', 'uglify', 'browser-sync', 'watch']);

任何帮助将不胜感激。

谢谢你,祝你愉快。

【问题讨论】:

    标签: node.js gulp browser-sync gulp-browser-sync


    【解决方案1】:

    试试这些改变:

    var browserSync = require('browser-sync').create();
    
     gulp.task('watch', function() {
      gulp.watch('src/js/*.js', ['uglify']).on('change', browserSync.reload({ stream:true }));
      gulp.watch('src/styles/*.scss', ['sass']).on('change', browserSync.reload({ stream:true }));
      gulp.watch('src/assets/*.{jpg,jpeg,png,gif,svg}', ['imagemin']).on('change', browserSync.reload);
      gulp.watch('src/index.html', ['html']).on('change', browserSync.reload());
    });
    

    如果这没有帮助,我会将重新加载调用移动到每个任务的末尾,如下所示:

    .pipe(browserSync.reload({ stream:true }));
    

    希望这会有所帮助。

    [编辑]

    改成这样:

    gulp.task('watch', function() {
      gulp.watch('src/js/*.js', ['uglify']);
      gulp.watch('src/styles/*.scss', ['sass']);
      gulp.watch('src/assets/*.{jpg,jpeg,png,gif,svg}', ['imagemin']);
      gulp.watch('src/index.html', ['html']).on('change', browserSync.reload);
    });
    
    gulp.task('imagemin', function() {
      return gulp.src('src/assets/*.{jpg,jpeg,png,gif,svg}')
        .pipe(plumber())
        .pipe(imagemin())
        .pipe(gulp.dest('dist/assets'));
        .pipe(browserSync.reload({ stream:true }));
    });
    
    gulp.task('uglify', function() {
      return gulp.src('src/js/*.js')
        .pipe(uglify())
        .pipe(gulp.dest('dist/js'));
        .pipe(browserSync.reload({ stream:true }));
    });
    
    gulp.task('sass', function() {
      return gulp.src('src/styles/*.scss')
        .pipe(plumber())
        .pipe(sass())
        .pipe(gulp.dest('dist/styles/'));
        .pipe(browserSync.reload({ stream:true }));
    });
    

    gulpfile 的其他部分不会改变。除了做之前建议的更改:

    var browserSync = require('browser-sync').create();
    

    【讨论】:

    • 您好@Mark,感谢您的回答。恐怕您的第一个选择不起作用。我收到以下信息: TypeError: "listener" argument must be a function at Gulp. (C:\Users\full_path\gulpfile.js:92:41) 第 92 行说:gulp.watch('src /js/*.js', ['uglify']).on('change', browserSync.reload({ stream:true }));这是您建议的代码的第一个。现在,你能解释一下你的第二个选择吗?我想我没有做对。你什么意思?非常感谢。
    • 嗨,马克,感谢您的回复。它现在以某种方式工作。现在该过程会在第一次保存时保存更改,但不会重新加载浏览器。我不得不手动完成。你能看出问题出在哪里吗?此外,错误消息仍然存在->“侦听器”参数必须是一个函数。也感谢您的知识和耐心。
    • 我对 html watch 调用做了一个小改动。看看这是否有什么不同。该错误消息指的是哪一行?
    • 嘿,马克,您的解决方案运行良好。对回复的超级延迟感到抱歉,非常感谢!
    • 没问题。如果您认为它有帮助,请接受正确的答案,以便其他人无需阅读所有 cmets 即可知道。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2021-06-28
    相关资源
    最近更新 更多