【问题标题】:Browsersync doesn't detect changes on sass files in the subfoldersBrowsersync 未检测到子文件夹中 sass 文件的更改
【发布时间】:2021-02-23 08:11:11
【问题描述】:

我有一个从 sass 文件构建 css 文件的 gulp 任务,如下所示:

gulp.task("sass", () => {
  return (
    gulp.src([
      src_assets_folder + "sass/*.scss"
      ], {
        since: gulp.lastRun("sass"),
      })
      .pipe(debug({title: "sass-debug:"}))
      .pipe(sourcemaps.init())
      .pipe(plumber({errorHandler: onError}))
      .pipe(dependents())
      .pipe(sass({ fiber: Fiber }))
      .pipe(autoprefixer())
      .pipe(minifyCss())
      .pipe(sourcemaps.write("."))
      .pipe(gulp.dest(dist_folder))
      .pipe(browserSync.reload({ stream: true }))
  );
});
gulp.watch([src_assets_folder + 'sass/**/*.scss'], gulp.series("sass"));

我正在构建的 sass 文件是直接在 sass 文件夹下找到的文件,而不是 sass 子文件夹中的所有文件,但我的观察者递归地在 sass 文件夹中的所有文件上。

我遇到的问题是,当 Browsersync 启动时,然后我更新了一个在 sass 文件夹下没有立即找到的 sass 文件,Browsersync 没有检测到任何更改,但是当我更新一个找到的 sass 文件时在 sass 文件夹下,Browsersync 会立即检测到更改。

我该如何解决?

【问题讨论】:

  • 我有点困惑 - 你的 sass/*.scss 文件是 @import 还是 @use 所有在更深处找到的 sass 文件?
  • @Mark 没错,我的sass/*.scss 只包含子文件夹中的 sass 文件,它们实际上不包含任何 sass 代码。
  • 这些包含的文件都是部分文件,所以以下划线开头?
  • @Mark 不,他们没有,但它们都在子文件夹中。

标签: sass gulp


【解决方案1】:

我终于找到了解决问题的方法。

想法是在任务 src 中包含部分内容,然后过滤它们以防止构建它们。

最终的解决方案是这样的:

gulp.task("sass", () => {
  const partials = readdirSync(src_sass_folder, { withFileTypes: true })
    .filter(dirent => dirent.isDirectory())
    .map(dirent => `!${src_sass_folder + dirent.name}/**/*.scss`);
  return (
    gulp.src([
        src_sass_folder + "*.scss",
        src_sass_folder + "**/*.scss"
      ], {
        since: gulp.lastRun("sass"),
      })
      .pipe(dependents())
      .pipe(filter(['**'].concat(partials))) // =====================> HERE
      .pipe(debug({title: "sass-debug:", showCount: false}))
      .pipe(sourcemaps.init())
      .pipe(plumber({errorHandler: onError}))
      .pipe(sass({ fiber: Fiber }))
      .pipe(autoprefixer())
      .pipe(minifyCss())
      .pipe(sourcemaps.write("."))
      .pipe(gulp.dest(dist_folder + "Content"))
      .pipe(browserSync.stream({match: '**/*.css'}))
  );
});

【讨论】:

    【解决方案2】:

    这似乎与src()since 选项有关。启用该选项后,该任务不会创建任何 Vinyl 对象以进行管道传输,除非自上次运行任务以来 sass 文件夹下的文件中存在可检测到的更改。删除该选项应该可以解决问题。

    【讨论】:

    • 通过删除它,sass 任务会重建所有 sass 文件,而不仅仅是那些被更改的文件,这需要很多时间,在我的情况下是 23 秒
    • 为了使用 since 并且仍然让任务完全运行并更新 browsersync,您需要将 src() 路径更改为 sass/**/*.scss,这会产生自己的问题。跨度>
    • 是的,恐怕这不是一个选项,它也会构建所有包含的 sass 文件。
    • @RenaudisNotBillGates 这就是它的工作原理,这个答案完全回答了所写的问题。
    • 这不是很奇怪吗?由于许多项目在主要的 sass 文件中都包含 sass 部分,我认为它们也不会构建部分,因为如果在另一个单独的部分中声明了一些使用的变量,那一开始就不起作用。跨度>
    猜你喜欢
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多