После статьи на Хабре, решил собрать свой простой gulpfile, для html и css.
Как устанавливать node я вам не буду рассказывать, об этом уже много где сказано. И найти информацию об этом вас не затруднит.
Перейду к самому главному. Мой “рабочий” проект, для сборки простенького сайта лежит здесь.
А теперь, чуть чуть по подробнее :-)
Основная задача этого gulpfile собирать html из jade шаблонов и css из stylus. Ну и разумеется обычные html и css тоже должно уметь. Также оптимизация всех картинок. Т.к. на js я пока толком не умею ничего делать, то особого внимания я ему не прикладываю, поэтому с скриптами у меня практически ничего не делается, кроме “склейки” и минификации.
// Собираем Stylus
gulp.task('stylus', function() {
gulp.src('assets/styles/**/*.styl')
.pipe(stylus()) // собираем stylus
.on('error', console.log) // Если есть ошибки, выводим и продолжаем
.pipe(autoprefixer("last 1 version", "> 1%", "ie 8", "ie 7"))
.pipe(gulp.dest('public/css/')) // записываем css
.pipe(livereload(server)); // даем команду на перезагрузку css
});
Стили прогоняются еще через autoprefixer, который расставляет нужные префиксы по условию "last 1 version", "> 1%", "ie 8", "ie 7"
.
// Собираем html из Jade
gulp.task('jade', function() {
gulp.src(['assets/template/*.jade', '!assets/template/_*.jade'])
.pipe(jade({
pretty: true
})) // Собираем Jade только в папке ./assets/template/ исключая файлы с _*
.on('error', console.log) // Если есть ошибки, выводим и продолжаем
.pipe(gulp.dest('public/')) // Записываем собранные файлы
.pipe(htmlhint({
"tag-pair": true,
"style-disabled": true,
"img-alt-require": true,
"tagname-lowercase": true,
"src-not-empty": true,
"id-unique": true,
"spec-char-escape": true
}))
.pipe(htmlhint.reporter())
.pipe(gulp.dest('public/'))
.pipe(livereload(server)); // даем команду на перезагрузку страницы
});
html я заодно проверяю htmlhint
на закрытые теги, уникальные id, и т.п. По названиям все понятно должно быть :-)
Картинки оптимизируются задачей:
// Копируем и минимизируем изображения
gulp.task('images', function() {
gulp.src(['assets/img/**/*', '!assets/img/**/*.svg'])
.pipe(cache(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })))
.pipe(livereload(server))
.pipe(gulp.dest('public/img'))
});
Под виндой у вас возникнут проблемы с этой задачей, решается она легко, нужно в package.json
добавить "jpegtran-bin": "~0.2.3"
. И все должно заработать. Во всяком случае гуглится всё просто и быстро.
Так же там стоит cache .pipe(cache(imagemin
, это для того чтобы не оптимизировать все картинки заново, а брать только новые, только добавленные. Ну, конечно, если я ничего не путаю :-)
Svg я тоже прогоняю через svgmin
. Все весьма не плохо “оптимизируется”. Хотел еще поставить gulp-rsvg, но с виндой тут возникают проблемы. А может я что-то не то делаю?
Для сборки конечного проекта у меня используется задача build
, она практически во всем повторяет задачу watch
. Там можно многое убавить, не расписывая все повторно, но пока что я не хочу этого делать.
Пока что у меня с этим Gulp возникло несколько вопросов, почти те же самые, что некогда с grunt. А именно:
- Мне не совсем понятно, как копировать обычные файлы, т.е. которые не должно подвергаться сборке, я конечно решил вроде этот вопрос
gulp.src('assets/static/**/*').pipe(gulp.dest('public/'));
, но все равно есть сомнения. Тут еще есть командаcopy
, но я мало что о ней нашел :-) - У меня не запускается svgmin при watch, как и при build) И я не могу понять почему. Отдельно, задача svgmin запускается.
- При изменении одного файла, будь то html или css, задача сразу прогоняет через себя все файлы, как бы так сделать, чтобы только изменяемый файл обновлялся?
- И самое главное. Научите меня обновлять всё, что в package.json :-) Что то типа npm update, но так, чтобы версии актуализировались.
- Было еще что-то, но я как всегда забыл, возможно допишу, как вспомню.
Да и вообще, хотелось бы посмотреть на чужие gulp конфиги) Особенно на простые, по типу моего, для простых задач.