Примеры с плагинами gulp watch, since: , Gulp-changed, gulp-newer, gulp-remember, gulp-cache, gulp-cached от Ильи Кантора в скринкастах Gulp 5: Инкрементальная сборка, watch. Gulp 5: Инкрементальная сборка, повышение производительности.
В первом примере, "инкрементальность" обеспечивается за счет того, что в плагине styles данные кэшируются, а значит пересобираются заново только измененные файлы, но все это реализовано внутри styles...
Конспекты к первым четырем скринкастам Gulp Структура папок и имена файлов можно посмотреть в этом предыдущем посте
gulp watch после запусканачинает наблюдать за файлами, если обнаруживает изменения, то выполняет задачи
# ... gulp.watch('frontend/assets/**/*.*', gulp.series('assets'));});
# мониторим все изменения в 'frontend/assets/'
# а далее задача, которую нужно запускамть..., это либо функция, либо
# gulp.series('assets'))
# Даже, если задача одна, ее надо обернуть в
# gulp.series(
'use strict';
const gulp = require('gulp');
const stylus = require('gulp-stylus');
const sourcemaps = require('gulp-sourcemaps');
const debug = require('gulp-debug');
const gulpIf = require('gulp-if');
const del = require('del');
const isDevelopment = !process.env.NODE_ENV ||
process.env.NODE_ENV == 'development';
gulp.task('styles', function() {
return gulp.src('frontend/styles/main.styl')
.pipe(gulpIf(isDevelopment, sourcemaps.init()))
.pipe(stylus())
.pipe(gulpIf(isDevelopment, sourcemaps.write()))
.pipe(gulp.dest('public'));
});
gulp.task('clean', function() {
return del('public');
});
gulp.task('assets', function() {
return gulp.src('frontend/assets/**', {since: gulp.lastRun('assets')})
.pipe(debug({title: 'assets'}))
.pipe(gulp.dest('public'));
});
gulp.task('build', gulp.series(
'clean',
gulp.parallel('styles', 'assets'))
);
gulp.task('watch', function() {
gulp.watch('frontend/styles/**/*.*', gulp.series('styles'));
gulp.watch('frontend/assets/**/*.*', gulp.series('assets'));
});
gulp.task('dev', gulp.series('build', 'watch'));
Вот эту команду можно вставить, а запомнить надо¶
gulp.task('assets', function() {
console.log(require('stylus/lib/parser').cashe)
return ...
# 3:40 Gulp 5: Инкрементальная сборка, watch
Итак, файлы стилей кэшируются, а вот assets будут пересобираться каждый раз заново, если не добавить параметр since
ОБеспечиваем инкрементальность для assets¶
return gulp.src('frontend/assets/**', {since: gulp.lastRun('assets')})
# 4:40 Gulp 5: Инкрементальная сборка, watch
# Команда touch изменяет дату модификации, а файл тот же
> touch fronted/assets/index.html
А если файл был удален? Ну и что? При сборке в проадкшен сначала почистим папку, а при разработке мусор не так страшен..., но способ есть
# В основе **watch** модуль **chokidar**, который генерирует события
# 7:40 Gulp 5: Инкрементальная сборка, watch
Нельзя оставлять gulp.watch без обертки¶
Поскольку при любом обращении к модулю она будет выполняться. Просто сделаем вот такой вызов:
gulp.task('watch', function() {
gulp.watch('frontend/styles/**/*.*', gulp.series('styles'));
gulp.watch('frontend/assets/**/*.*', gulp.series('assets'));
});
Кроме того, лучше задать последовательность
gulp.task('dev', gulp.series('build', 'watch'));
# 9:00 Gulp 5: Инкрементальная сборка, watch
####Gulp 6: Инкрементальность и производительность (следущий скринкаст)
При первом запуске gulp.lastRun('assets') не срабатывает, чтобы ускорить первый запуск нужен плагин gulp-newer
# return gulp.src('frontend/assets/**', {since: gulp.lastRun('assets')})
'use strict';
const gulp = require('gulp');
const stylus = require('gulp-stylus');
const sourcemaps = require('gulp-sourcemaps');
const debug = require('gulp-debug');
const gulpIf = require('gulp-if');
const del = require('del');
const newer = require('gulp-newer'); // gulp-changed
const isDevelopment = !process.env.NODE_ENV || process.env.NODE_ENV == 'development';
gulp.task('styles', function() {
return gulp.src('frontend/styles/main.styl')
.pipe(gulpIf(isDevelopment, sourcemaps.init()))
.pipe(stylus())
.pipe(gulpIf(isDevelopment, sourcemaps.write()))
.pipe(gulp.dest('public'));
});
gulp.task('clean', function() {
return del('public');
});
gulp.task('assets', function() {
return gulp.src('frontend/assets/**', {since: gulp.lastRun('assets')})
.pipe(newer('public'))
.pipe(debug({title: 'assets'}))
.pipe(gulp.dest('public'));
});
gulp.task('watch', function() {
gulp.watch('frontend/styles/**/*.*', gulp.series('styles'));
gulp.watch('frontend/assets/**/*.*', gulp.series('assets'));
});
gulp.task('build', gulp.series('clean', gulp.parallel('styles', 'assets')));
gulp.task('dev', gulp.series('build', 'watch'));
Что делает плагин gulp-newer
gulp.task('assets', function() {
return gulp.src('frontend/assets/**', {since: gulp.lastRun('assets')})
.pipe(newer('public')) //# читает содержание папки
//# и сравнивает даты, и не пускает дальше неизмененные файлы
.pipe(debug({title: 'assets'}))
.pipe(gulp.dest('public'));
});
# 1:40 Gulp 6: Инкрементальность и производительность
Есть еще один плагин - аналог Gulp-changed
.pipe(remember('styles'))
# 4:00 Gulp 6: Инкрементальность и производительность
Запоминает то, что проходит через него в именованном кэше 'styles', если при следующем обращении к нему не попадает какой-то файл, то он добавляет его из кэша... В видео все подробно...
# 6:00 Gulp 6: Инкрементальность и производительность
'use strict';
// gulp-remember
const gulp = require('gulp');
const debug = require('gulp-debug');
const concat = require('gulp-concat');
const autoprefixer = require('gulp-autoprefixer');
const remember = require('gulp-remember');
const cached = require('gulp-cached');
const path = require('path');
gulp.task('styles', function() {
return gulp.src('frontend/styles/**/*.css')
.pipe(cached('styles'))
.pipe(autoprefixer())
.pipe(remember('styles'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public'));
});
gulp.task('watch', function() {
gulp.watch('frontend/styles/**/*.css',
gulp.series('styles')).on('unlink', function(filepath) {
remember.forget('styles', path.resolve(filepath));
delete cached.caches.styles[path.resolve(filepath)];
});
});
gulp.task('dev', gulp.series('styles', 'watch'));
Поставил .pipe(cached('styles')) - прио повторном поиске все файлы с тем же содержимым "отметаются"
# 11:10 Gulp 6: Инкрементальность и производительность
Все же, большинство использует since - он не читает содержимое файлов
# 13:10 Gulp 6: Инкрементальность и производительность
Есть еще gulp-cache (ранее был gulp-cached)
# 13:50 Gulp 6: Инкрементальность и производительность
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий