【问题标题】:gulp-sass autoprefix sourcemapgulp-sass 自动前缀源映射
【发布时间】:2014-10-05 13:39:45
【问题描述】:

这个周末我开始玩 gulp。我想设置一个任务,可以

  • 编译我的 sass 文件
    • 如果我在 sass 文件中出错,请继续工作
    • 使用 sass Bootstrap
  • 生成源地图
  • 附加浏览器前缀
  • 在不重新加载浏览器的情况下注入已编译的 css
  • 快速(在开发环境中最高 1-2 秒)

我完成了大部分步骤,但浏览器前缀让我很难过 这是我到目前为止得到的结果

var browserSync = require('browser-sync');
var reload = browserSync.reload;
var filter = require('gulp-filter');
var gulp = require('gulp');
var sass = require('gulp-sass');
var autoprefixer = require('gulp-autoprefixer');
var notify = require("gulp-notify");
var sourcemaps = require('gulp-sourcemaps');
var concat = require('gulp-concat');

var config = {
    sassPath: './sass',
    bower: './bower_components',
    bootstrap: './bower_components/bootstrap-sass-official/assets/stylesheets',
    fonts: './bower_components/bootstrap-sass-official/assets/fonts'
};

gulp.task('sass', function () {
    return gulp.src(config.sassPath + '/**/*.scss')
        .pipe(sourcemaps.init())
            .pipe(sass({
                //outputStyle: 'compressed',
                outputStyle: 'nested',
                precision: 10,
                includePaths: [
                    config.sassPath,
                    config.bower,
                    config.bootstrap
                ],
                onError: function (err) {
                    notify().write(err);
                }
            }))
            .pipe(concat('app.css'))
            .pipe(autoprefixer('last 2 version'))
        .pipe(sourcemaps.write())
        .pipe(gulp.dest('css'))
        .pipe(filter('**/*.css')) // Filtering stream to only css files
        .pipe(browserSync.reload({stream:true}));
});

gulp.task('browser-sync', function() {
    browserSync({
        logLevel: "info",
        server: {
            baseDir: './',
            //directory: true,
            routes: {
                "/fonts": config.fonts
            }
        }
    });
});

gulp.task('default', ['sass', 'browser-sync'], function () {
    gulp.watch(['./**/*.html', 'js/**/*.js'], reload);
    gulp.watch('sass/*.scss',['sass']);
});

问题是自动前缀给了我一个错误并弄乱了源映射

我得到的错误:“gulp-sourcemap-write: source file not found:C:\WEB\skilldrill_v1\skilldrill\sass\app.css”

所以出于某种原因,它试图在 sass 目录中查找 css 文件

[编辑]
我设法找到了问题,但还没有解决。 这个东西工作的管道:gulp-autoprefixer -> 做一些事情 -> 前缀任务 -> 乙烯基-sourcemaps-apply

gulp-autoprefixer\index.js 第35行:applySourceMap(file, res.map.toString()); 从这一点开始,vinyl-sourmaps-apply 理解当前文件(在我的例子中为 app.css)也成为了一个源文件。

以下是问题: a) 它认为 css 文件与 gulp.src() 中指定的文件夹位于同一文件夹中,这通常不是真的 b) 它不仅仅适用于自动前缀添加的行,而是添加对每一行的引用

您对这些信息有什么想法吗?我开始挖掘 gulp-concat 可以正确处理类似问题。

【问题讨论】:

  • 我想我在 sourcemaps 和 gulp-autoprefixer 上遇到过类似的问题。我还尝试了一种变通方法,两次运行源映射。我最近发现使用 PostCSS 和 CSSNext 似乎可以解决这个问题。看看here,看看这个解决方案是否对你有用。

标签: gulp-sass autoprefixer gulp-sourcemaps


【解决方案1】:

我在使用 autoprefixer 和 sourcemap 时遇到了同样的问题。我已经更改了我的工作流程,在编译 sass 后创建源映射,然后在运行 autoprefixer 时再次加载到 gulp-sourcemaps,最后创建更新的源映射。

// Compile Sass
.pipe(sourcemaps.init())
    .pipe(sass())
.pipe(sourcemaps.write())
.pipe(gulp.dest('../public/assets/css'))

// Autoprefix
.pipe(sourcemaps.init({loadMaps: true}))
    .pipe(autoprefixer('last 2 version', 'ie 8', 'ie 9'))
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('../public/assets/css'))

然后只看css文件进行样式注入。

// CSS Injection
.pipe(filter('**/*.css'))
.pipe(browserSync.reload({stream:true}))

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但对于今天来到这里的人来说:

    没有问题让 Sourcemaps 和 AutoPrefixer 一起工作。所以看起来这个问题已经解决了。以下设置对我有用:

    const
        gulp = require('gulp'),
        sass = require('gulp-sass'),
        autoprefixer = require('gulp-autoprefixer'),
        concat = require('gulp-concat'),
        sourcemaps = require('gulp-sourcemaps'),
        browserSync = require('browser-sync').create();
    
    var
        scssSourcePath = './css/**/*.scss',
        cssDestPath = './css/',
        cssDestFile = 'styles.css';
    
    
    // Task 'styles': 
    // Compile SASS to CSS
    gulp.task('styles', function () {
        return gulp.src(scssSourcePath)
            .pipe(sourcemaps.init())
            .pipe(sass({ outputStyle: 'compressed' }).on('error', sass.logError))
            .pipe(autoprefixer())
            .pipe(concat(cssDestFile))
            .pipe(sourcemaps.write('.'))
            .pipe(gulp.dest(cssDestPath))
            .pipe(browserSync.stream());
        });
    
    
    // Default task: 
    // Init Browser-Sync,
    // Watch folders and start tasks on change
    gulp.task('default', function () {
        browserSync.init({
            server: "."
        });
    
        return gulp.watch(scssSourcePath, gulp.series('styles'));
    });
    

    旁注:
    我实际上建议使用 CSSnano 而不是 Autoprefixer。它包括 Autoprefixer 并进行了更多优化。只需将上述代码中出现的所有autoprefixer 替换为cssnano,您将获得额外的好处。

    【讨论】:

      【解决方案3】:

      @philipb3 谢谢!!花了 2 天的大部分时间试图弄清楚为什么 autoprefixer 和 gulp-sourcemaps 不能很好地一起玩,然后当我最终解决这个问题时,浏览器同步将完全重新加载,但没有注入新生成的 css。这似乎已经解决了这个问题。

      对于那些一开始对解释感到困惑的人,这里是我的 gulp 文件中我的 sass 任务的示例,其中 cmets 说明了正在发生的事情。

      gulp.task('sass', function() {
          // create postcss processors
          var processors = [
              mqpacker,
              autoprefixer({ browsers: ['last 2 version'] })
          ];
      
      return gulp.src(src.scss)
         .pipe(sourcemaps.init()) // start sourcemaps
         .pipe(sass({ outputStyle: 'expanded' }).on('error', sass.logError)) // compile sass
         .pipe(sourcemaps.write()) // write map inline
         .pipe(gulp.dest(src.css)) // pipe to css dir
         .pipe(sourcemaps.init({loadMaps: true})) // init sourcemaps again after pipe to dest dir
         .pipe(postcss(processors)) // run postcss stuff
         .pipe(sourcemaps.write('./maps')) // write map to external dir instead of inline
         .pipe(gulp.dest(src.css)) // pipe to dest dir again
         .pipe(filter('**/*.css')) // filter out everything that isn't a css file
         .pipe(reload({ stream: true })); // pipe result to browser-sync for reload
      });
      

      编辑:所以最终,当我开始向我的 gulp 构建添加更多任务和插件时,这也开始再次中断。我不完全确定是否有必要加载两次源地图。我已经重建了我的 gulp 文件,从 gulp-sass 和 gulp-sourcemaps 开始,即使在之后配置其他任务之后,这似乎也对我有用。希望这两种解决方案中的一种对某人有用。

      相关插件:

      var gulp = require('gulp');
      var sass = require('gulp-sass');
      var sourcemaps = require('gulp-sourcemaps');
      
      //** Post CSS Modules **//
      var postcss = require('gulp-postcss');
      var autoprefixer = require('autoprefixer');
      var mqpacker = require('css-mqpacker');
      

      如果您使用浏览器同步:(同时设置监视/服务任务)

      //** Browser-Sync **//
      var browserSync = require('browser-sync').create();
      var reload = browserSync.reload;
      

      来源:相应地改变这些

      var src = {
         base: 'ROOT_FOLDER',
         js:     'ROOT_FOLDER/js/**/*.js',
         css:    'ROOT_FOLDER/css',
         html:   'ROOT_FOLDER/*.html',
         jsdir:  'ROOT_FOLDER/js',
         maps:   './maps',
         scss:   'ROOT_FOLDER/scss/**/*.scss'
      };
      

      任务

      gulp.task('sass', function () {
          // load post-css plugins
          var processors = [
              mqpacker,
              autoprefixer({
                  browsers: ['last 2 version']
              })
          ];
          // start sass task
          return gulp.src(src.scss)
            .pipe(sourcemaps.init()) // init sourcemaps
            .pipe(sass.sync({outputStyle: 'expanded'}).on('error', sass.logError)) // compile scss
            .pipe(postcss(processors)) // autoprefix and combine media queries
            .pipe(sourcemaps.write(src.maps)) // write emaps relative to source dir
            .pipe(gulp.dest(src.css)) // pipe to css folder
            .pipe(browserSync.stream()); // send stream to browser-sync task
      });
      

      【讨论】:

        猜你喜欢
        • 2017-03-24
        • 2018-04-06
        • 2015-01-09
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        • 2015-03-20
        • 2015-05-25
        • 2015-03-11
        相关资源
        最近更新 更多