NPM Gulp > 检索 SCSS 导入文件路径

NPM Gulp > retrieve SCSS import filepaths

所以目前在我的 gulp 设置中,我生成了很多 CSS 文件 - 一个通用的 'core' 文件,然后是特定于模板的样式表。

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

然后我想到,与其写出所有的监视文件路径,不如直接 'crawl' 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),并且可能会有其他问题。

有什么想法吗?

提前致谢。

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

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


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

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

  2. 除了gulpV4你还需要安装gulp-dependents插件。您可以通过 运行ning 控制台命令来完成: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() -> 运行s a deep search with regExp 并查找依赖于管道中当前文件的文件。这正是您在原始问题中试图描述的内容;
  • 而且我认为您熟悉 .scss()gulp.dest 在做什么。 :)
  • 最终结果 -> 只会编译更改的样式;
  1. 如果你有多个样式函数,我建议你创建一个新的(这样你就不会打破你以前的工作常规),并测试这个新的感觉如何。

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

P.P.S如果有什么问题,我很乐意回答。