Как упростить задачу Gulp для структуры жестких папок?

Я работаю с gulp-sass, gulp-sourcemaps, browsersync и у меня есть проект с жесткой структурой папок для sass-таблиц стилей. Теперь задача выглядит так:

gulp.task('sass', function () {
  // bootstrap compilation
    gulp.src('./sass/bootstrap.scss')
  .pipe(sourcemaps.init())
  .pipe(sass())
  .pipe(sourcemaps.write('.', {includeContent: true, sourceRoot: '/sass'}))
  .pipe(gulp.dest('./assets/global/plugins/bootstrap/css/'))

  // global theme stylesheet compilation
    gulp.src('./sass/global/*.scss')
  .pipe(sourcemaps.init())
  .pipe(sass())
  .pipe(sourcemaps.write('.', {includeContent: true, sourceRoot: '/sass/global'}))
  .pipe(gulp.dest('./assets/global/css'))

  gulp.src('./sass/apps/*.scss')
  .pipe(sourcemaps.init())
  .pipe(sass())
  .pipe(sourcemaps.write('.', {includeContent: true, sourceRoot: '/sass/apps'}))
  .pipe(gulp.dest('./assets/apps/css'))

  gulp.src('./sass/pages/*.scss')
  .pipe(sourcemaps.init())
  .pipe(sass())
  .pipe(sourcemaps.write('.', {includeContent: true, sourceRoot: '/sass/pages'}))
  .pipe(gulp.dest('./assets/pages/css'))

  // theme layouts compilation
  gulp.src('./sass/layouts/layout4/*.scss')
  .pipe(sourcemaps.init())
  .pipe(sass())
  .pipe(sourcemaps.write('.', {includeContent: true, sourceRoot: '/sass/layouts/layout4'}))
  .pipe(gulp.dest('./assets/layouts/layout4/css'))

  gulp.src('./sass/layouts/layout4/themes/*.scss')
  .pipe(sourcemaps.init())
  .pipe(sass())
  .pipe(sourcemaps.write('.', {includeContent: true, sourceRoot: '/sass/layouts/layout4/themes'}))
  .pipe(gulp.dest('./assets/layouts/layout4/css/themes'))
});

Но я думаю, что эта задача может быть проще. Спасибо.

1 ответ

Вы должны быть в состоянии сократить код и улучшить его сопровождение, определяя каждый *.scss шаг обработки только один раз.

Ваши исходные каталоги с *.scss файлы следуют той же схеме, за исключением первого и последнего:

source files:     './sass/{path}/*.scss'
source maps root: '/sass/{path}'
destination root: './assets/{path}/css'

Где {path} такое ядро ​​пути источника - "global", "layouts/layout4" и т. д. Как насчет хранения ядер пути в массиве и обработки массива локальной функцией?

Например, давайте использовать массив объектов, где src ключ является исходным путем ядра и необязательным dest ключ может переопределить шаблон назначения корня по умолчанию:

var merge = require('merge-stream');

gulp.task('sass', function () {
  // src: './sass/{src}/*.scss', sourceRoot: '/sass/{src}'
  // dest: './assets/{dest}', default './assets/{src}/css'
  var stylesheets = [
        {src: '', dest: '/global/plugins/bootstrap/css'},
        {src: '/global'},
        {src: '/apps'},
        {src: '/pages'},
        {src: '/layouts/layout4'},
        {src: '/layouts/layout4/themes', dest: '/layouts/layout4/css/themes'}
      ],
      streams = stylesheets.map(function (stylesheet) {
        var src = stylesheet.src,
            dest = stylesheet.dest || src + '/css';
        return gulp.src('./sass' + src + '/*.scss')
          .pipe(sourcemaps.init())
          .pipe(sass().on('error', sass.logError))
          .pipe(sourcemaps.write('.', {
            includeContent: true,
            sourceRoot: '/sass' + src
          }))
          .pipe(gulp.dest('./assets' + dest + '/'));
      });
  return merge.apply(this, streams);
});

Другие улучшения: если вы не хотите, чтобы ошибка в *.scss файл для сбоя цепочки задач gulp, вы должны прослушать событие "error" gulp-sass плагин. Если вы хотите, чтобы задача gulp была цепной, вы должны вернуть результат последней pipe() позвони с него.

Интеграция задач, таких как gulp-livereload, gulp-minify-css или же gulp-autoprefixer было бы просто вопросом добавления соответствующего pipe() позвоните в цепочку и все файлы будут затронуты.

ОБНОВЛЕНИЕ: Исправлена ​​ошибка, при которой возвращался один поток, обрабатывающий все файлы из задачи, с помощью модуля слияния. Последовательность .pipe() звонки не могут быть продолжены другим .src() стартовая цепь. Отдельные таблицы стилей не будут создаваться в последовательности, но вызывающая сторона сможет ждать, пока все они будут созданы.

Другие вопросы по тегам