Gulp 不会在进行更改时重新编译 sass

Gulp won't recompile sass when changes are made

我已经创建了一些任务来重新编译 sass 并在进行更改时使用浏览器同步。 我的gulp文件如下:

'use strict';

var gulp = require('gulp');
var sass = require('gulp-sass');
var browserSync = require('browser-sync');

gulp.task('sass', function() {
    return gulp.src('./css/*.scss')
        .pipe(sass().on('error', sass.logError))
        .pipe(gulp.dest('./css'));
});

gulp.task('sass:watch', function() {
    gulp.watch('./css/*.scss', ['sass']);
});

gulp.task('browser-sync', function() {
    var files = [
        './*.html',
        './css/*.css',
        './img/*.{png,jpg,gif}',
        './js/*.js'
    ];

    browserSync.init(files, {
        server: {
            baseDir: "./"
        }
    });

});


gulp.task('default', gulp.series('browser-sync', function() {
    gulp.start('sass:watch');
}));

我使用的节点版本12.16.1,gulp-sass版本4.1.0,gulp-cli版本2.3.0,gulp本地版本4.0 .2 和浏览器同步版本 2.26.7.

您的 Gulp 文件在进行更改时不会监视 sass 文件。它只是在寻找 CSS 的变化。这是我的 Gulp 任务功能的一部分,用于查找 SCSS 文件更改

function serve() {
  browserSync.init({
    open: false,
    port: 8000,
    server: {
      baseDir: 'src/',
      index: 'index.html'
    },
  });
  gulp.watch(paths.scss.src, gulp.series([compileSCSS]));
}

这是我的SCSS编译函数

function compileSCSS() {
  return gulp
    .src('./src/scss/style.scss')
    .pipe(plugins.rename('style.css'))
    .pipe(gulp.dest('./src/css/'));
}

我已经准备了一个 Gulp 函数,其中包含许多必需的工具。你可以在这里查看 https://gist.github.com/choyan/ab034dc0539942ee0d8f0ab9788d790f

改变这个

// gulp.task('default', gulp.series('browser-sync', function() {
//     gulp.start('sass:watch');
// }));

gulp.task('default', gulp.series('browser-sync', 'sass:watch'));

我严重怀疑gulp v4是否支持gulp.start

也改成这样:

gulp.task('browser-sync', function(done) {   // added done here
    var files = [
        './*.html',
        './css/*.css',
        './img/*.{png,jpg,gif}',
        './js/*.js'
    ];

    browserSync.init(files, {
        server: {
            baseDir: "./"
        }
    });
  done();                                    // called done() here
});

当我 运行 你的代码时,我注意到 sass:watch 任务从未开始,因此你根本没有看任何文件。这是您应该在终端中看到的内容:

[21:26:21] Using gulpfile ~\OneDrive\Test Bed\simple\gulpfile.js
[21:26:21] Starting 'default'...
[21:26:21] Starting 'browser-sync'...
[21:26:21] Finished 'browser-sync' after 164 ms
[21:26:21] Starting 'sass:watch'...         // this line missing when running your code
[Browsersync] Access URLs:
 -----------------------------------
       Local: http://localhost:3000
    External: http://10.0.0.186:3000
 -----------------------------------
          UI: http://localhost:3001
 UI External: http://localhost:3001
 -----------------------------------
[Browsersync] Serving files from: ./
[Browsersync] Watching files...

不要被最后一行所迷惑,浏览器同步总是会吐出这一点。 sass:watch 任务没有开始的原因是因为 gulp 永远无法通过 browser-sync 任务 - 你必须以某种方式向 gulp 发出任务已经完成的信号并且 done 是一种方法。然后 gulp 可以转到下一个任务,即 sass:watch。参见 gulp: async completion

您还需要进行您在评论中注明的更改 gulp.watch('./css/*.scss', gulp.series('scss'));

您的代码没有其他问题 - 它对我来说运行得很好。