【问题标题】:NPM Gulp > retrieve SCSS import filepathsNPM Gulp > 检索 SCSS 导入文件路径
【发布时间】:2021-07-20 18:46:35
【问题描述】:

因此,目前在我的 gulp 设置中,我生成了许多 CSS 文件 - 一个通用的“核心”文件,然后是特定于模板的样式表。

它不是在每次更改时重新编译所有样式表,而是只编译所需的样式表 - 但这会导致复杂的“监视”路径,涵盖许多文件,这些文件仅反映每个模板的主要 SCSS 文件中的内容(包括@use/@import 语句)。

然后我突然想到,与其写出所有的监视文件路径,我只是简单地“抓取”SCSS 文件并递归地抓取任何@use/@import 语句的所有文件路径,这不是很好吗。

举个例子,假设我有这个“blog.scss”文件:


    // Variables 
    @import 'variables';
    
    // Tools
    @import './tools';
    
    // Parts
    @import './core/base';
    @import './templates/blog';

是否可以为其@import 语句获取所有文件路径,例如:

'local-dev/styles/variables.scss'
'local-dev/styles/tools.scss'
'local-dev/styles/core/base.scss'
'local-dev/styles/templates/blog.scss'

我考虑过简单地将文件作为字符串检索,并使用一些正则表达式 - 但这不会考虑文件扩展名 (.scss/.css/_partials.scss) 并且可能会有其他问题。

有什么想法吗?

提前致谢。

【问题讨论】:

  • 嗨 ;) 我理解正确吗 - 您只想以交互方式构建已更改的文件,而不是解析>编译>构建保持不变的文件?
  • @ve1ikiy 在某种意义上是的。目前,我的设置有 7 个样式表,用于各种不同的模板——而不是查看整个文件夹,并且每次我执行特定的监视命令时都重新创建所有 7 个样式表——但事实证明,维护起来很痛苦。添加了新的 SCSS 导入。有没有更好的方法来处理这个问题?
  • 是的,在 gulp 的 v4 中有新的 API 调用 -> lastRun 这有助于创建仅在与之前的运行有一些差异时才会执行的函数。我将在下面的答案中更详细地描述它。

标签: css npm sass gulp


【解决方案1】:

您试图实现的称为增量构建系统,这意味着 - we compile only those files, that were changed, and don't touch anything else

如果你想深入了解细节,我真的推荐这篇文章 -> Sarthak Batra 的 Incremental SASS Builds with Gulp


如果你只是想要 ready2go 解决方案,这里是:

  1. 所有代码示例均适用于 gulpJS v4,因此请通过在项目目录中运行控制台命令确保它是您当前拥有的版本 -> gulp -v

  2. 除了 gulpV4,你还需要安装 gulp-dependents 插件。您可以在项目文件夹中运行控制台命令:npm i --save-dev gulp-dependents

  3. 在您的 gulpfile.js 中,您需要添加新的导入语句。对于 v4,它看起来像:const dependents = require("gulp-dependents")

  4. 最后,您需要更新 gulp 样式函数,并确保它只编译更改的文件。

function styles(callMeBack) {
  return gulp
    .src(paths.styles.src, { since: gulp.lastRun(styles) })
    .pipe(dependents())
    .pipe(scss())
    .pipe(gulp.dest(paths.styles.dest))
    .pipe(browserSync.stream())
    .on("end", callMeBack)
}
  • path.styles.src -> 您的样式文件夹的路径,在我的情况下,它看起来像 "app/static/styles/**/*.scss";
  • since: gulp.lastRun(styles) -> gulpV4 API 调用,检查当前 blob 是否与上次函数运行时相同,并仅将更改的文件纳入管道;
  • .dependents() -> 运行deep search with regExp 并查找依赖于管道中一个当前文件的文件。这正是您在原始问题中试图描述的内容;
  • 我想你很熟悉.scss()gulp.dest 在做什么。 :)
  • 最终结果 -> 仅编译更改的样式;
  1. 如果您有多种样式功能,我建议您创建一个新功能(这样您就不会破坏以前的工作常规),并测试这个新功能的感觉。

P.S 因为我们使用since.lastRun -> 它只有在第一次运行后才能正常工作。所以这就像编译所有内容>等待更改>检查更改>只编译已编辑的内容

P.P.S 如果您有任何问题,我很乐意为您解答。

【讨论】:

  • 谢谢!!很难判断它是否适用于我当前的设置,但它在不到 1 秒的时间内编译了大约 14 个样式表。我正在使用合并的流和观察者“开启”事件,所以这可能是冲突的,但实际上我现在应该能够通过上述方式使我的设置变得更加简单。
  • 很高兴我的回答对您有所帮助。我最近在我的 gulp 设置中偶然发现了同样的问题,所以我很高兴我所有的研究都没有完全浪费:)
  • Hmm 不幸的是“因为:gulp.lastRun(styles)”似乎只关心顶级 SCSS 文件(包含所有导入),如果部分更改它不会选择它向上。同样的问题 gulp-cached :(
  • @Kehza 是的,这就是我们使用 gulp-dependents -> 的原因,它使用 lastRun 而不是 gulp-cached 跟踪导入文件中的所有更改。如果您遵循链接文章中描述的路径,则正确的插件结构在最后。
  • 嗯,我确实使用了 gulp-dependents 和 lastRun,但它似乎只在我的顶级 SCSS 文件更改时才在意。例如blog.scss,并且没有任何导入的样式或部分。我的“paths.styles.src”等价物只包含顶级文件,例如blog.scss 和它的任何部分。这需要改变吗?
猜你喜欢
  • 2019-05-18
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2018-06-08
  • 1970-01-01
相关资源
最近更新 更多