Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何覆盖文件并在同一个gulp任务中使用该文件?_Javascript_Node.js_Npm_Gulp_Postcss - Fatal编程技术网

Javascript 如何覆盖文件并在同一个gulp任务中使用该文件?

Javascript 如何覆盖文件并在同一个gulp任务中使用该文件?,javascript,node.js,npm,gulp,postcss,Javascript,Node.js,Npm,Gulp,Postcss,我甚至不知道如何在标题中解释我的问题。我想创建一个任务,它将遵循以下步骤: 将Sass文件作为源(例如src/scss/main.scss) 使用“postcss排序”对css属性进行排序 将源文件覆盖到同一路径(例如src/scss/main.scss) 获取已排序的scss文件并编译为css 写入css文件夹(例如dist/css) 我试图写这个任务,但当我开始观察scss文件的变化时,任务有无限循环。我也尝试了两个不同的任务(一个用于排序css属性和写入文件,另一个用于编译和写入),它仍然

我甚至不知道如何在标题中解释我的问题。我想创建一个任务,它将遵循以下步骤:

  • 将Sass文件作为源(例如src/scss/main.scss)
  • 使用“postcss排序”对css属性进行排序
  • 将源文件覆盖到同一路径(例如src/scss/main.scss)
  • 获取已排序的scss文件并编译为css
  • 写入css文件夹(例如dist/css)
  • 我试图写这个任务,但当我开始观察scss文件的变化时,任务有无限循环。我也尝试了两个不同的任务(一个用于排序css属性和写入文件,另一个用于编译和写入),它仍然在循环。我不想只对css文件中的css属性进行排序,我也想对我的scss文件进行排序。这是我的示例代码:

    // Load plugins
    const {gulp, watch, src, dest, series} = require( 'gulp' ),
          browserSync = require('browser-sync').create(),
          postcss = require( 'gulp-postcss' ),
          sortProperties = require( 'postcss-sorting' ),
          sassParser = require( 'postcss-scss' ),
          sass = require( 'gulp-sass' );
    
    
    // Load CSS property orders for 'postcss-sorting'
    const propertySortOrder = require('./propertySortOrder');
    
    
    // Style
    const style = () => {
        return src('src/scss/**/*.scss')
            .pipe(
                postcss([sortProperties(propertySortOrder)], {
                    syntax: sassParser,
                })
            )
            .pipe(dest('src/scss'))
            .pipe(sass().on('error', sass.logError))
            .pipe(dest('src/css'))
            .pipe(browserSync.stream());
    }
    
    // Start Server
    const startServer = (done) => {
        browserSync.init({
            server: { baseDir: './' },
            injectChanges: true
        });
    
        done();
    }
    
    // Watch File Changes
    const watchFileChanges = (done) => {
        watch('src/scss/**/*.scss', style);
    
        done();
    }
    
    exports.start = series(startServer, watchFileChanges);
    
    有人能帮我修一下吗?谢谢

    p.S.很抱歉,我犯了所有语法错误,英语不是我的母语。

    您可以使用,只有在发生更改时,它才会覆盖文件,防止无限循环:

    const changed = require('gulp-changed');
    const clone = require( 'gulp-clone' );
    const merge = require('merge-stream');
    
    
    // Style
    const style = () => {
        const sortedCssPipe = src('src/scss/**/*.scss')
            .pipe(
                postcss([sortProperties(propertySortOrder)], {
                    syntax: sassParser,
                })
            );
    
        const scssPipe = sortedCssPipe
            .pipe(clone())
            .pipe(changed('src/scss', {hasChanged: changed.compareContents}))
            .pipe(dest('src/scss'));
    
        const cssPipe = sortedCssPipe
            .pipe(sass().on('error', sass.logError))
            .pipe(dest('src/css'))
            .pipe(browserSync.stream());
    
        return merge(scssPipe, cssPipe);
    }
    

    如果我在使用gulp更改之前没有将此文件写入磁盘,则它不是排序和编译。如果我写入磁盘并使用gulp,它仍然会循环。谢谢,但没有解决我的问题。事实上,你是对的。这比我想象的要复杂一点。回复更新,现在应该可以了。非常感谢,这正是我想要的。