vik_kodik
@vik_kodik
Разработчик интерфейсов.

Оптимизированная инкрементальня сборка scss?

Доброго времени суток! Как можно оптимизировать сборку стилей, когда есть один файл main.scss в котором подключены остальные scss файлы?

Есть 1 файл main.scss , в него подключены файлы типа _header.scss, _footer.scss и т.п. Так же подключены другие main файлы из других директорий. Вот так:
c2f9ceeaf8c3410ba9202dd734f06496.png
Сейчас рабочий таск для стилей пересобирает все стили. Выглядит он вот так:
/********************************************************************/
/*STYLES*************************************************************/
/********************************************************************/

gulp.task('style', function () {
    return gulp.src(path.src.style)
        .pipe(plugins.sourcemaps.init())
        .pipe(plugins.sass.sync().on('error', plugins.sass.logError))
        .pipe(plugins.autoprefixer({browsers: ['last 2 versions'], cascade: false}))
        .pipe(plugins.csso())
        .pipe(plugins.rename({suffix: '.min'}))
        .pipe(plugins.sourcemaps.write())
        .pipe(gulp.dest(path.dist.css))
        .pipe(reload({stream: true}));
});

Пока проект маленький все более менее работает. Но со временем, проект разрастается, и скорость таска достигает 20 и более секунд. Все из-за того что стилей много и пересобирая их раз за разом тратится все больше и больше времени. В итоге пользоваться совершенно невозможно. Были перепробованы плагины gulp-newer, gulp-changed, gulp-cached, gulp-remember.
Так же была испытана аналогичная опция и коробки gulp 4:
{since: gulp.lastRun('style')}
Полученный результат был неутешительным, главные файлы без "_" работали как надо, пересобирались инкрементально. А вот с заинклюжеными файлами все сложнее. Вотчер на них реагировал, запускал задачу, показывал что она завершена. Но на деле никаких изменения в главном файле не происходит. Кое какие мысли у меня по этому поводу есть, но помочь это никак не может.

Поэтому прошу совета как сделать инкрементальную сборку стилей с моей структурой файлов?

UPD: Размер минифицированного файла.

861571b9a697450a82630a2d28778a6e.png
  • Вопрос задан
  • 533 просмотра
Решения вопроса 2
zooks
@zooks
Frontend
Если используется Ruby Sass, то рекомендую заменить на libsass.
sass = require('gulp-sass')
Ответ написан
как делаю я:

каждый файл обрабатывается отдельно (то есть, в gulp.src у меня отправляется глоб-путь)
1. кеширую каждый файл - gulp-cached
2. с помощью gulp-insert добавляю в начало каждого файла строку "@import "+pathToVarsScss+";\n", где pathToVarsScss это файл, в котором собраны все миксины, переменные, что-угодно-еще, которые необходимы для компиляции каждого файла в отдельности
3. собственно, компилирую в css
4. postcss, любая обработка
5. работает gulp-remember, возвращая в поток все то, что убрал оттуда gulp-cached
6. gulp-concat

7. PROFIT!!!

результат: время сборки сокращается в десятки раз

ЗЫ: в начале и конце прикрутите сорсмапы
ЗЗЫ: csso наверняка будет долгим, минифицируйте только на продакшн сборку
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы