【问题标题】:Gulp 4 watch gulp.series only run one timeGulp 4 手表 gulp.series 只运行一次
【发布时间】:2018-12-10 18:38:10
【问题描述】:

我从 Gulp 3 更改为 Gulp 4,但我无法让它工作。

当我运行gulp 并保存一个 js 或 scss 文件时,它会成功创建一个新文件。如果我再次保存,则没有任何反应。我的猜测是我不明白gulp.series 是如何工作的。它只运行那些。

var gulp = require('gulp');
var concat = require('gulp-concat');
var sass = require('gulp-sass');
var rename = require('gulp-rename');
var gutil = require('gulp-util');
var minifyJS = require('gulp-minify');

gulp.task('css', function() {
    gulp.src([
        'assets/css/src/tinyFileTree.scss'
    ])
    .pipe(sass().on('error', sass.logError))
    .pipe(gulp.dest('assets/css/dist'))
    .pipe(rename('tinyFileTree.min.scss'))
    .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(gulp.dest('assets/css/dist'))
});

// JS
gulp.task('js', function() {
  gulp.src([
    'assets/js/src/tinyFileTree.js'
    ])
    .pipe(minifyJS({
      ext:{
        min:'.min.js'
      },
    }))
    .on('error', function (err) { gutil.log(gutil.colors.red('[Error]'), err.toString()); })
    .pipe(gulp.dest('assets/js/dist'))
});

// Default
gulp.task('default', function() {
    gulp.watch('assets/css/src/tinyFileTree.scss', gulp.series('css'));
    gulp.watch('assets/js/src/tinyFileTree.js', gulp.series('js'));
});

【问题讨论】:

  • 第一步:将返回语句添加到您的任务中,例如“return gulp.src…………”。看看是否有帮助。

标签: gulp gulp-watch


【解决方案1】:

如果您不想返回 gulp 实例。您可以按照 gulp watch 文档中使用的 signature 进行操作。该函数需要一个带有一个参数的回调函数,您需要在任务结束时执行该参数。我花了几个小时才弄清楚这个问题,但就是这样。

注意 cb();

gulp.task('css', function(cb) {
    gulp.src([
        'assets/css/src/tinyFileTree.scss'
    ])
    .pipe(sass().on('error', sass.logError))
    .pipe(gulp.dest('assets/css/dist'))
    .pipe(rename('tinyFileTree.min.scss'))
    .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(gulp.dest('assets/css/dist'));

    cb();
});

【讨论】:

    【解决方案2】:

    我做了一个完整的重写,可以在这里找到:https://github.com/jenstornell/gulpfile-style-script

    你也可以在这里看到。希望它可以帮助某人。

    let gulp = require("gulp");
    let sass = require("gulp-sass");
    let autoprefixer = require("gulp-autoprefixer");
    let concat = require("gulp-concat");
    let uglify = require('gulp-uglify-es').default;
    let csso = require('gulp-csso');
    let rename = require('gulp-rename');
    
    var css = {
      src: 'assets/css/src/**/*.scss',
      dest: 'assets/css/dist',
      filename: 'style.scss'
    };
    
    var js = {
      src: 'assets/js/src/**/*.js',
      dest: 'assets/js/dist',
      filename: 'script.js'
    };
    
    function style() {
      return (
        gulp
          .src(css.src)
          .pipe(concat(css.filename))
          .pipe(sass())
          .on("error", sass.logError)
          .pipe(autoprefixer())
          .pipe(gulp.dest(css.dest))
          .pipe(csso())
          .pipe(rename({extname: '.min.css'}))
          .pipe(gulp.dest(css.dest))
      );
    }
    
    function script() {
      return (
        gulp
          .src(js.src)
          .pipe(concat(js.filename))
          .pipe(gulp.dest(js.dest))
          .pipe(uglify())
          .pipe(rename({extname: '.min.js'}))
          .pipe(gulp.dest(js.dest))
      );
    }
    
    function watch(){
      gulp.watch(css.src, style);
      gulp.watch(js.src, script);
    }
    
    exports.css = style;
    exports.js = script;
    exports.default = watch;
    

    【讨论】:

    • 我看到你添加了 return 语句 - 没有它们,这些任务只会运行一次。
    • @Mark 我明白了。看起来你一直都是对的。谢谢! =) 在掌握它之前,我需要搞砸一段时间。而且我的代码现在看起来更具可读性了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2015-05-28
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多