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

NPM Gulp>;检索SCSS导入文件路径,css,npm,sass,gulp,Css,Npm,Sass,Gulp,因此,目前在我的gulp设置中,我有许多CSS文件,它们是生成的——一个通用的“核心”文件,然后是特定于模板的样式表 它没有在每次更改时重新编译所有样式表,而是只编译所需的样式表——但这导致了复杂的“监视”路径,覆盖了许多文件,这些文件只反映了每个模板的主SCSS文件中的内容(由@use/@import语句组成) 然后我突然想到,与其写出所有的watch文件路径,不如简单地“抓取”SCSS文件,并递归地抓取所有@use/@import语句的文件路径 例如,假设我有一个“blog.scss”文件:

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

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

然后我突然想到,与其写出所有的watch文件路径,不如简单地“抓取”SCSS文件,并递归地抓取所有@use/@import语句的文件路径

例如,假设我有一个“blog.scss”文件:

是否可以获取其@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),可能会有其他问题

有什么想法吗


提前感谢。

您试图实现的所谓增量构建系统,它意味着-
我们只编译那些已更改的文件,不涉及任何其他内容

如果你想深入了解细节,我真的推荐这篇文章->由Sarthak Batra撰写


如果您只想使用ready2go解决方案,请选择以下选项:

  • 所有代码示例都是针对gulpJS v4的,因此请通过在项目目录中运行console命令来确保它是当前的版本->
    gulp-v

  • 除了gulpV4,您还需要安装插件。您可以通过运行console命令来实现这一点:
    npmi--在项目文件夹中保存dev gulp dependents

  • 在gulpfile.js中,需要添加新的导入语句。对于v4,它看起来像:
    const dependents=require(“gulpdependents”)

  • 最后,您需要更新gulpstyles函数,并确保它只编译更改过的文件

    • path.styles.src
      ->styles文件夹的路径,在我的例子中,它看起来像
      “app/static/styles/***.scss”
    • since:gulp.lastRun(styles)
      ->gulpV4 API调用,用于检查当前blob是否与上次函数运行时相同,并只将更改的文件放入管道中
    • .dependents()
      ->->运行并查找依赖于管道中当前文件的文件。这正是你们在最初的问题中想要描述的
    • 我想您已经熟悉
      .scss()
      gulp.dest
      正在做的事情了
    • 最终结果->仅编译已更改的样式
  • 如果您有多个styles函数,我建议您创建一个新的(这样您就不会打破以前的工作惯例),并测试这个新函数的感觉如何
  • 因为我们使用了
    since.lastRun
    ->,它只有在第一次运行后才能正常工作。因此,这就像编译所有内容>等待更改>检查更改>仅编译已编辑的更改


    p.p.S如果您有任何问题,我很乐意回答。

    Hi;)我理解正确吗?你只想以交互方式生成已更改的文件,而不想解析>编译>生成未更改的文件?@ve1ikiy在某种意义上是的。目前,我的设置有7个不同模板的样式表-而不是监视整个文件夹,每次我执行特定的监视命令时,都会重新创建所有7个样式表-但事实证明,在添加新的SCSS导入时,维护这些样式表很困难。有没有更好的方法来处理这个问题?是的,在gulp的v4中有一个新的API调用->它有助于创建只有在与上一次运行有一些不同时才会执行的函数。我将在下面的回答中详细描述。谢谢!!很难判断它是否在我当前的设置中工作,但它在不到1秒的时间内编译了14个样式表。我正在使用合并流和watcher“on”事件,所以这可能有冲突,但实际上,我现在应该能够通过上面的内容使我的设置更加简单。我很高兴我的回答对您有所帮助。我最近在gulp设置中遇到了同样的问题,所以我很高兴我所有的研究都没有完全浪费:)嗯,不幸的是“因为:gulp.lastRun(styles)”似乎只关心顶级SCSS文件(具有所有导入),如果部分被更改,它不会接收它。同样的问题也会被缓存:(@Kehza是的,这就是为什么我们使用
    gulp dependents
    ->,它与
    lastRun
    一起跟踪导入文件中的所有更改,而不是
    gulp cached
    。如果您遵循链接文章中描述的路径,正确的插件结构就在最后。嗯,我确实使用了gulp dependents和lastRun,但它似乎只关心什么时候我的顶级SCSS文件已更改。例如blog.SCSS,并且没有导入任何样式或部分。我的等效“path.styles.src”仅包含顶级文件,例如blog.SCSS,并且没有导入任何部分。是否需要更改?
    'local-dev/styles/variables.scss'
    'local-dev/styles/tools.scss'
    'local-dev/styles/core/base.scss'
    'local-dev/styles/templates/blog.scss'
    
    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)
    }