Джентльменский набор front-end разработчика
Содержание:
- Введение
- Миксины
- Современная сборка 2020 для frontend. Gulp4 +10
- Начало
- Установка Node.js
- Step 3: Configure Your Project
- Альтернативные варианты развертывания
- Пишем первый таск
- Дополнительные полезные плагины для Gulp
- Инструкция по установке Gulp окружения
- What’s new in 4.0?!
- Плагины
- Настройка окружения
- Собираем js
- Metadata updates#
- Использование Gulp
- Exporting#
- SassScript
- gulp.src()
- Отслеживание файлов
- Step 7: Profit!
- Итог
Введение
Gulp — это таск-менеджер для автоматического выполнения часто используемых задач
(например, минификации, тестирования, объединения файлов), написанный на
языке программирования JavaScript.
Программное обеспечение использует
командную строку для запуска задач, определённых в файле Gulpfile.
Создан как ответвление от проекта Grunt, чтоб взять из него лучшие практики.
Распространяется через менеджер пакетов
NPM
под MIT лицензией.
Если Вы будете копировать код с этой страницы — имейте в виду, что я ставлю кое-где лишние
проблелы — исключительно для того, чтобы текст лучше помещался на экран. Смело удаляйте их.
Это основная статья об использовании Gulp.
В данный момент Вы можете помимо этой прочитать также статьи:
Как скопировать папку с помощью Gulp |
|
Объединить и сжать несколько css файлов в один |
|
Как отправить файлы по ftp с помощью Gulp |
|
Gulp series |
|
Обработка только изменённых файлов с помощью gulp.watch().on(‘change’) |
Миксины
Миксины — блоки Sass кода (или примеси-шаблоны), которые могут принимать аргументы (опционально) и позволяют значительно расширить возможности написания стилей и сократить затраты времени на применении однотипных правил и даже целых CSS блоков. Это что-то вроде функции, которая может принять аргумент, выполнить огромный объем работы и выдать результат в зависимости от входного параметра.
Миксин объявляется директивой @mixin, после объявления должно быть указано имя миксина. Вызывается миксин директивой @include, которая принимает имя миксина и передаваемые аргументы, если такие имеют место быть.
Примеры:
Sass | CSS — готовый результат |
@mixin border($color) border: $color 1px solid p @include border(#333) @mixin transition($time) -webkit-transition: all $time ease; -moz-transition: all $time ease; -o-transition: all $time ease; transition: all $time ease; p @include transition(.25s) |
p { border: #333 1px solid; } p { -webkit-transition: all 0.25s ease; -moz-transition: all 0.25s ease; -o-transition: all 0.25s ease; transition: all 0.25s ease; } |
Друзья, мы рассмотрели основные возможности Sass, которых достаточно для плодотворной работы с CSS стилями сайта. Некоторые директивы и возмоности не вошли в данное руководство, но если вам интересно узнать обо всех возможностях Sass, почитайте документацию, будет полезно.
Другие уроки по теме «Инструменты»
- Gulp include на стороне сервера Browsersync + Build
- OptimizedHTML 5: Важные обновления стартера для JS-разработки
- Gulp 4 — Актуальное и исчерпывающее руководство для самых маленьких
- Актуальный способ установки и настройки окружения Windows WSL 2 (Windows Subsystem for Linux)
- PageSpeed Insights — Оптимизация (обновление)
- Winter (October) CMS — Первое знакомство
Современная сборка 2020 для frontend. Gulp4 +10
- 17.02.20 05:04
•
Den-V
•
#484714
•
Хабрахабр
•
Tutorial
•
•
4900
JavaScript, Node.JS, Разработка веб-сайтов, CSS, HTML
Начало
Посмотрев на календарь, я понял, что уже 2020, а посмотрев на свою сборку, которая была с 2018 года, я понял, что пора её менять. В этой статье мы разберем структуру проекта, плагины (минимальный набор функционала) и их новые возможности, которые добавились за такое большое время. Мы разберем все моменты, чтобы новичок мог себе скачать эту сборку и начать с ней работать.
Не только древность моей сборки мотивировала на эту статью, но и еще одна причина: мне больно смотреть, когда заходят на онлайн-сервисы для конвертации , минификации и других рутинных задач. Самое забавное — когда сделали мелкую правку, снова нужно проходить все круги ада копипаста.
Установка Node.js
Если вы знаете как установить node.js на свою систему и пользуетесь ей, можете смело переходить к следующему заголовку.
Хотелось бы сразу предупредить, что все описанные действия актуальны для Mac OS X, но в целом применимы и для других Unix систем. Разработка через таск-менеджер и командную строку в Windows несколько более затруднительная и тут она описана не будет. Однако, если вы все же пользуетесь Windows и не готовы от него отказываться, то могу предложить вариант использования виртуальной машины с установленной Ubuntu, я использую этот вариант на своей домашней системе, что в целом довольно удобно.
в ответ должна появиться версия установленной node.js. Если все хорошо, идем дальше.
Step 3: Configure Your Project
Note: You can skip this step if you already have a configuration file.
Let’s assume you have a new or pre-existing project in the folder . Navigate to this folder and initialize it with npm:
You’ll be asked a series of questions: enter a value or hit Return to accept defaults. A file that stores your configuration settings will be created on completion.
Note: Node.js installs modules to a folder. You should add this to your file to ensure they’re not committed to your repository. When deploying the project to another system, you can run to restore them.
For the remainder of this guide, we’ll presume your project folder contains the subfolders itemized below.
Folder: Pre-processed Source Files
This contains further subfolders:
- — HTML source files and templates
- — the original uncompressed images
- — multiple pre-processed script files
- — multiple pre-processed Sass files
Folder: Compiled/processed Files
Gulp will create files and create subfolders as necessary:
- — compiled static HTML files
- — compressed images
- — a single concatenated and minified JavaScript file
- — a single compiled and minified CSS file
Your project will almost certainly be different, but this structure is used for the examples below.
Note: If you’re on a Unix-based system and you just want to follow along with this guide, you can recreate the source folder structure with the following command:
Альтернативные варианты развертывания
Зависимости разработки не устанавливаются, если в операционной системе для переменной среды NODE_ENV задано значение production. Обычно это делается на сервере с помощью команды macOS/Linux:
export NODE_ENV=production
В Windows:
set NODE_ENV=production
В этом руководстве предполагается, что ресурсы будут скомпилированы в папку build, переданы в репозиторий Git или загружены непосредственно на сервер.
Чтобы использовать ресурсы на работающем сервере, изменить способ их создания. Например, файлы HTML, CSS и JavaScript сжимаются при использовании, но не в средах разработки. В этом случае удалите —save-dev при установке Gulp и его плагинов. Например:
npm install gulp
Эта команда устанавливает Gulp как зависимость приложения в разделе «dependencies» файла package.json. Сборщик будет установлен при вводе npm install и может быть запущен везде, где развернут проект.
Пишем первый таск
Создадим в корне проекта отдельный файл для описания и назовем его gulpfile.js. Открываем его и пишем первый таск (задачу):
const gulp = require('gulp'); gulp.task('hello', function (callback) { console.log('Hello!'); callback(); });
В первой строке подключаем Gulp (далее будем действовать аналогично с остальными необходимыми модулями).
Любой таск в Gulp создается методом .task(), который принимает два аргумента – название задачи и функцию-обработчик. Отметим, что в Gulp задачи асинхронны: надо дать знать, что задача выполнена, и ее выполняет callback() (в данном таске это просто функция-пустышка, так как нам нечего возвращать). Если этого не сделать, то в консоли мы увидим:
Using gulpfile ~\WebstormProjects\frontend\gulpfile.js Starting 'hello'... Hello! The following tasks did not complete: hello Did you forget to signal async completion?
Первый таск создан: можно запускать его в консоли! Пишем команду:
gulp hello
Здесь gulp – это вызов собственно gulp, а hello – название таска, который хотим выполнить. Все очень просто.
Дополнительные полезные плагины для Gulp
Проект, что мы создали выше это самый простейший набор плагинов Gulp. Его функциональность можно значительно расширить, установив и настроив дополнительные плагины. Я составил список, которые сам использую в своих проектах.
Plumber — дает возможность продолжить работу gulp при ошибке в коде. На самом деле, если вы в коде (html, js, sass, css) сделаете ошибку gulp выдаст ее в консоли и прекратит свою работу. Вам необходимо будет исправить ошибку и вновь запустить gulp.
Sourcemaps — создает карту подключений файлов css и js. Обычно в подобных проектах файлы стилей и скриптов делят на несколько частей для удобства. Так вот, чтобы потом ориентироваться в каком файле и в какой строке находится та или иная запись как раз и нужна карта подключений.
Tinypng — сжатие изображений. Работает по той же аналогии, что и imagemin, но сжимает значительно лучше.
SvgSprite — сборка svg-спрайта иконок. В последнее время я перешел с иконочных шрифтов на svg иконки. Чтобы уменьшить количество http запросов к серверу нужно собирать иконки в спрайты.
Rigger — объединяет html-файлы в один. Необходимо, когда вы разбиваете html-файлы на отдельные неизменяемые блоки, например, шапка сайта, футер и т.д.
BrowserSync — перезагрузка браузера. Очень полезное дополнение, т.к. не нужно тратить время на обновление браузера, плагин делает это автоматически при сохранении измененных файлов. В плагине используется встроенный простенький локальный-сервер.
Spritesmith — создание спрайтов картинок. Еще один плагин для сборки спрайтов, только в данном случае из иконок Png. Также использую его частенько, т.к. не всегда иконки в макете бывают в формате svg.
Rimraf — очистка папки dist. Бывает, что приходится очищать время от времени папку продакшена dist, т.к. в нем могут скопиться неиспользуемые файлы. Например, вы переименовали файл стилей в другое название, таким образом у вас в dist будут две копии — старая и новая.
На этом я завершаю данную статью, которая и так получилась достаточно объемной. Я сам очень долго изучал эту тему, а инструкции в интернете в основном являлись переводами зарубежных статей, в которых описывалось все скромно.
Конечно я буду еще писать на тему Gulp, т.к. сам постоянно развиваюсь и стараюсь делать свои проекты как можно проще и быстрее. Обязательно поделюсь своей сборкой в Github.
Жду ваши комментарии ниже. Подписывайтесь на мой канал в телеграм. До встречи в следующих статьях!
Инструкция по установке Gulp окружения
Для создания окружения необходимо иметь следующие установленные программы:
- «Node.js» (загрузить установщик «Node.js» для своей операционной системы можно c этой страницы; для проекта требуется версия программы не ниже 10);
- «Gulp» (установить Gulp можно посредством выполнения в консоли следующей команды: ).
Последняя версия этого проекта (v.2.3.0) основана на Gulp 4 версии.
Если вы используете первую версию проекта, то дополнительно необходимо ещё установить пакетный менеджер Bower.
Установка Gulp:
Ключ -g указывает npm, что пакет необходимо загрузить не в текущую, а в общую папку.
Выполнение инсталляции программы Bower осуществляется аналогично Gulp (актуально только для версии проекта 1.0.0):
npm install -g bower
После установки основных программ необходимо загрузить с Github архив проекта. Для этого можно воспользоваться этой ссылкой. Последняя версия проекта имеет номер 2.2.3.
Далее следует распаковать архив и перенести файлы из каталога «gulp-project-bootstrap-4» в корневую директорию проекта.
Если нужна не текущая, а какая-то определённая версия (например, 1.0.0), то её можно загрузить со страницы Releases.
Следующий этап – это установка npm пакетов и их зависимостей. Для этого в консоли (должны находиться в корневой директории проекта) необходимо выполнить команду:
npm install
Данная команда установит все пакеты, которые нужны как для работы самого окружения, так и для фронтенда. Выполняет npm эти действия в соответствии с инструкциями, написанными в файле «package.json».
При использовании первой версии проекта (1.0.0), в которой используется менеджер пакетов Bower, необходимо выполнить ещё команду:
bower install
Данная программа установит фронтенд пакеты, указанные в файле «bower.json».
What’s new in 4.0?!
- The task system was rewritten from the ground-up, allowing task composition using and methods.
- The watcher was updated, now using chokidar (no more need for gulp-watch!), with feature parity to our task system.
- First-class support was added for incremental builds using .
- A method was exposed to create symlinks instead of copying files.
- Built-in support for sourcemaps was added — the gulp-sourcemaps plugin is no longer necessary!
- Task registration of exported functions — using node or ES exports — is now recommended.
- Custom registries were designed, allowing for shared tasks or augmented functionality.
- Stream implementations were improved, allowing for better conditional and phased builds.
Плагины
Вместе с Gulp вы можете использовать ряд плагинов — более 600 на деле. Вы найдёте их список на странице плагинов, либо путём поиска gulpplugin в npm. Некоторые плагины помечены «gulpfriendly»; это не плагины, но они предназначены для работы с Gulp. Учтите, что при поиске непосредственно в npm, вы не увидите плагины из чёрного списка (прокрутите страницу с плагинами вниз и увидите больше).
Большинство плагинов довольно просты в использовании, имеют хорошую документацию и запускаются аналогичным образом (через поток файловых объектов). Они, как правило, модифицируют файлы (хотя некоторые, вроде валидаторов, нет) и возвращают новые файлы, которые передаются в следующий плагин.
Давайте расширим уже упомянутую задачу js:
Мы используем три плагина: gulp-jshint, gulp-uglify и gulp-concat. Вы можете увидеть в файлах README для плагинов, что их довольно легко использовать. Доступны некоторые настройки, но по умолчанию, как правило, всё хорошо.
Вы, возможно, заметили, что плагин JSHint вызывается дважды. Потому что первая строка вызывает JSHint для файлов, которые только присоединяют свойство jshint к файловым объектам без какого-либо вывода. Вы можете прочитать свойство jshint самостоятельно или передать его в jshint.reporter по умолчанию или в другой reporter, такой как jshint-stylish.
Два других плагина понятнее: функция uglify() минимизирует код, а функция concat(‘app.js’) объединяет все файлы в один с именем app.js.
Настройка окружения
В качестве окружения для работы с Sass в этом уроке, как и в других наших уроках, мы будем использовать версию Sass для таск-менеджера Gulp (gulp-sass). Для использования оригинальной Ruby версии или компиляции Sass посредством специального ПО, вы можете ознакомиться с инструкциями на оф. сайте. Данный урок носит преимущественно практический характер, поэтому останавливаться на возможных вариантах подключения к проекту не будем, подключим Sass наиболее популярным способом, используя Gulp.
Убедитесь, что у вас установлена последняя версия Node.js и Gulp. Если Node.js не установлен, скачайте его и установите. После установки Node.js установите gulp командой «npm i -g gulp» (Windows) или «sudo npm i -g gulp» (Linux, OS X). Почитать: Подробное руководство Gulp.
В папке вашего проекта выполните команду npm init и заполните пошагово информацию о вашем новом проекте. Пример, также, есть на странице руководства Gulp.
Далее установим в проект пакеты gulp и gulp-sass командой:
npm i --save-dev gulp gulp-sass
Далее в папке проекта создадим gulpfile.js следующего содержания:
var gulp = require('gulp'), // Подключаем Gulp sass = require('gulp-sass'); // Подключаем Sass пакет gulp.task('sass', function() { // Создаем таск "sass" return gulp.src(['sass/**/*.sass', 'sass/**/*.scss']) // Берем источник .pipe(sass({outputStyle: 'expanded'}).on('error', sass.logError)) // Преобразуем Sass в CSS посредством gulp-sass .pipe(gulp.dest('css')) // Выгружаем результата в папку css }); gulp.task('watch', function() { gulp.watch(['sass/**/*.sass', 'sass/**/*.scss'], ); // Наблюдение за sass файлами в папке sass }); gulp.task('default', );
У вас должна быть следующая структура проекта в вашей файловой системе:
-
myproject/
-
css/
common.css
-
sass/
common.sass
- node_modules/
- gulpfile.js
- package.json
-
css/
Запускаем выполнение Gulpfile командой gulp в терминале папки проекта.
Здесь мы берем все Sass файлы из директории sass/ вашего проекта и выгружаем готовый CSS результат в папку css/. Кроме того, здесь мы устанавливаем наблюдение watch за изменениями в Sass файлах и автоматическую компиляцию в CSS, если такие изменения имеют место быть. Результирующий css файл подключается в верстку.
Если вам что-то не понятно по настройке Gulp пакетов в данном примере, прочтите руководство Gulp.
После того, как наше окружение настроено и Sass успешно преобразуется в CSS при сохнанении *.sass файлов в директории sass/, можно спокойно продолжать обучение и выполнять примеры, которые мы будем сегодня разбирать, на практике.
Собираем js
Будем используем ES6-синтаксис – понадобится соответствующий плагин, чтобы сохранить кроссбраузерность приложения. Ставим Babel (занимается преобразованием ES6 в ES5):
npm i babel-core npm i gulp-babel babel-preset-env
Подключаем Babel:
const babel = require('gulp-babel');
Напишем задачу ‘js’, которая будет обрабатывать js-файлы:
gulp.task('js', function () { return gulp.src('./src/js/**/*.js') .pipe(babel({ presets: })) .pipe(gulp.dest(`${config.build}/js`)) });
Все аналогично задаче css, только вместо postcss в дело вступает babel.
Напишем простенький js-файл с ES6-кодом (пусть это будет script.js, размещенный в папке src/js). Испытаем работу таска:
function hello(name) { return `Hello! ${name}`; } console.log(hello('Петя!'));
Выполним задачу:
gulp js
Результатом будет файл script.js в папке build/js со следующим содержанием:
'use strict'; function hello() { var name = arguments.length > && arguments[] !== undefined ? arguments[] : 'n/a'; return 'Hello! ' + name; } console.log(hello('Петя'));
В результате работы Babel код немного усложнился по сравнению с исходным.
С одним файлом все хорошо, но что произойдет, если их будет 2, 3, 10 и больше? Совсем неудобно все это подключать к странице. Эту проблему поможет решить модуль gulp-concat.
Поставим его:
npm i gulp-concat
Скорректируем gulpfile:
const concat = require('gulp-concat');
Доработаем таск js:
gulp.task('js', function () { return gulp.src(`${config.src}/js/**/*.js`) .pipe(babel({ presets: })) .pipe(concat('main.js')) .pipe(gulp.dest(`${config.build}/js`)) });
Теперь concat(‘main.js’) объединяет все файлы в один – main.js, который удобно подключать к странице (попробуйте создать несколько файлов и понаблюдайте за результатом).
Научившись обрабатывать стили, JavaScript-код, вы все еще каждый раз набираете gulp ‘task’ в консоли. Это не очень удобно. Можно ли объединить все в одной задаче?
Да, и прежде чем это сделать, напишем еще пару вспомогательных тасков для очистки папки сборки и переноса остальных файлов (html, картинок, шрифтов и т.д.).
Ставим ‘del’:
npm i del
Подключаем:
const del = require('del');
Напишем задачи ‘clr’ и ‘assets’. Первая будет вычищать папку build перед сборкой, а вторая – просто переносить файлы.
gulp.task('clr', function () { return del('${config.build}/*') });
gulp.task('assets', function () { return gulp.src('./src/assets/**') .pipe(gulp.dest('./build/')); });
Создадим отдельный таск для html:
gulp.task('html', function () { return gulp.src(`${config.src}/assets/*.html`) .pipe(gulp.dest('./build')) });
Теперь можем вычищать нашу директорию сборки и переносить остальные файлы. Но при разработке изменения происходят во многих файлах, и каждый раз нужно пересобирать проект вручную. Чтобы избавиться от этой рутины, воспользуемся методом gulp.watch.
Напишем задачу ‘watch’, которая будет отслеживать изменения в нужных файлах и при необходимости запускать соответствующие таски:
gulp.task('watch', function () { gulp.watch(`${config.src}/pcss/**/*.pcss`, gulp.series('css')); gulp.watch(`${config.src}/js/**/*.js`, gulp.series('js')); gulp.watch(`${config.src}/assets/*.html`, gulp.series('html')); });
В данной задаче мы следим за изменениями в файлах стилей, скриптов и html.
Осталось написать задачу для первичной сборки – назовем ее ‘build’, а также задачу ‘default’, которая позволит, просто набрав команду ‘gulp’, собрать проект и запустить «вотчеры».
Задача ‘build’:
gulp.task('build', gulp.series( 'clr', gulp.parallel('css', 'js', 'assets', 'html') ));
Используем метод .parallel, чтобы ускорить процесс и запустить все задачи в параллельных потоках.
Задача ‘default’:
gulp.task('default', gulp.series('build', gulp.parallel('watch', 'server')));
Метод .series запускает задачи последовательно: сначала выполнится ‘build’, а далее параллельно стартуют ‘watch’ и ‘server’.
Metadata updates#
Whenever the stream creates a file, the Vinyl object’s , , and are compared to the created file. If they differ, the created file will be updated to reflect the Vinyl object’s metadata. If those properties are the same, or gulp doesn’t have permissions to make changes, the attempt is skipped silently.
This functionality is disabled on Windows or other operating systems that don’t support Node’s or methods. This is due to Windows having unexpected results through usage of and .
Note: The method internally converts and timestamps to seconds. This division by 1000 may cause some loss of precision on 32-bit operating systems.
Использование Gulp
Давайте создадим задачу Gulp для минимизации одного из наших файлов JavaScript. Создайте файл с именем gulpfile.js. В нём будут определяться ваши задачи, которые запускаются с помощью команды gulp.
Добавьте следующие команды в ваш файл gulpfile.js:
Установите gulp-uglify через npm выполнив npm install —save-dev gulp-uglify, а затем запустите задачу через gulp minify. Предположим, у вас есть файл с именем app.js в папке js, новый app.js будет создан в папке build и содержать сжатую версию js/app.js.
Что на самом деле здесь происходит?
Мы делаем несколько вещей в нашем файле gulpfile.js. Вначале мы загружаем модули gulp и gulp-uglify:
Затем определяем задачу с именем minify, которая при запуске вызывает функцию, заданную в качестве второго аргумента:
В конце, и это самое сложное, мы определяем, что наша задача должна делать:
Если вы не знакомы с потоками, а большинство фронтенд-разработчиков с ними не знакомы, то код выше ничего вам не скажет.
Exporting#
Tasks can be considered public or private.
- Public tasks are exported from your gulpfile, which allows them to be run by the command.
- Private tasks are made to be used internally, usually used as part of or composition.
A private task looks and acts like any other task, but an end-user can’t ever execute it independently. To register a task publicly, export it from your gulpfile.
const{ series }=require(‘gulp’);
functionclean(cb){
cb();
}
functionbuild(cb){
cb();
}
exports.build= build;
exports.default=series(clean, build);
Copy
In the past, `task()` was used to register your functions as tasks. While that API is still available, exporting should be the primary registration mechanism, except in edge cases where exports won’t work.
SassScript
SassScript позволяет значително расширить возможности Sass за счет использования пользовательских переменых, арифметических и прочих функций. SassScript может быть использован для автоматической генерации новых селекторов и свойств.
2.1 Переменные в Sass
Это действительно замечательная возможность — определять переменные, которые можно использовать в любом месте вашего Sass файла. Цвета, дефолтные значения, единицы, все это можно взять в переменную и использовать в дальнейшем. Переменная определяется так: $название: значение.
Sass | CSS — готовый результат |
$accent: #FF9910 .button background-color: $accent color: #fff |
.button { background-color: #FF9910; color: #fff; } |
2.2 Операции с числами и строками + интерполяция
Sass дает возможность использовать стандартные арифметические операции над числами, такие как сложение (+), вычитание (-), деление (/) и остаток от деления по модулю (%). Операторы сравнения (<, >, <=, >=, ==, !=) также поддерживаются для чисел.
Кроме того, в Sass есть возможность конкатенировать (соединять) строки.
Sass | CSS — готовый результат |
$summ: 10 + 20 / 2 $cn: content .selector margin: top: $summ + px bottom: 12px + 8px background-color: trans + parent #{$cn}: "con" + "tent" |
.selector { margin-top: 20px; margin-bottom: 20px; background-color: transparent; content: "content"; } |
Как видим из примера $summ: 10 + 20 / 2, соблюдается приоритет в выполнении арифметических операций — сначала деление, потом сложение. Для определения порядка действий, можно использовать круглые скобки, как в математике
Обратите внимание, что при сложении 12px + 8px, мы получим 20px
Обратите также внимание на строки 2 и 9, здесь мы используем интерполяцию для размещения динамических значений в любом месте Sass файла, в том числе и в месте, где у нас идет название свойства, название селектора или в любой строке. Чаще всего интерполяция в Sass используется для получения нового значения переменной, благодаря «интегрированию» в значение другой переменной, посредством конструкции #{}, например:
Чаще всего интерполяция в Sass используется для получения нового значения переменной, благодаря «интегрированию» в значение другой переменной, посредством конструкции #{}, например:
Sass | CSS — готовый результат |
$in: интер .interpol content: "#{$in}поляция" |
.interpol { content: "интерполяция"; } |
2.3 Операции с цветами
Цвета в Sass можно складывать, вычетать, делить и умножать. Все арифметические операции выполняются для каждого цвета отдельно: красного, зеленого и синего.
Sass | CSS — готовый результат |
$color1: #440203 + #550506 $color2: #010203 * 2 $color3: rgba(180, 0, 0, 0.75) + rgba(20, 255, 0, 0.75) body background-color: $color1 color: $color2 border-color: $color3 |
body { background-color: #990709; color: #020406; border-color: rgba(200, 255, 0, 0.75); } |
Sass | CSS — готовый результат |
$translucent-red: rgba(255, 0, 0, 0.5); p color: opacify($translucent-red, 0.3) background-color: transparentize($translucent-red, 0.25) .selector background-color: rgba(#333, 0.75) |
p { color: rgba(255, 0, 0, 0.8); background-color: rgba(255, 0, 0, 0.25); } .selector { background-color: rgba(51, 51, 51, 0.75); } |
gulp.src()
Функция gulp.src() берёт один или несколько файлов или массив и возвращает поток, который может быть передан в плагины.
Gulp использует node-glob для получения указанных файлов. Проще всего объяснить на примерах:
- js/app.js
Соответствует определённому файлу.
- js/*.js
Соответствует всем файлам, заканчивающихся на .js в папке js.
- js/**/*.js
Соответствует всем файлам с расширением .js в папке js и всех вложенных папках.
- !js/app.js
Исключает js/app.js из соответствия, что полезно если вы желаете выбрать все файлы в папке за исключением определённого файла.
- *.+(js|css)
Соответствует всем файлам, заканчивающихся на .js или .css.
Другие функции также доступны, но в Gulp они обычно не применяются. Посмотрите документацию Minimatch ради подробностей.
Предположим, у нас есть папка с именем js, содержащая файлы JavaScript, некоторые минимизированы, а некоторые нет. Мы хотим создать задачу по минимизации ещё не уменьшенных файлов. Чтобы сделать это, мы выбираем все файлы JavaScript в папке, за исключением всех файлов, оканчивающиеся на .min.js:
Отслеживание файлов
Gulp имеет возможность следить за изменением файлов и выполнять задачу или задачи при обнаружении изменений. Эта функция удивительно полезна (для меня, наверное, одна из самых полезных в Gulp). Вы можете сохранить Less-файл, а Gulp превратит его в CSS и обновит браузер без каких-либо действий с вашей стороны.
Для слежения за файлом или файлами используйте функцию gulp.watch(), которая принимает шаблон файлов или их массив (такой как gulp.src()), либо массив задач для их запуска или выполнения функции обратного вызова.
Предположим, что у нас есть задача build, она превращает наши файлы шаблонов в HTML и мы хотим определить задачу watch, которая отслеживает изменение шаблонов и запускает задачу для преобразования их в HTML. Мы можем использовать функцию watch следующим образом:
Теперь при изменении файла шаблона будет запущена задача build, которая создаст HTML.
Вы также можете указать для watch функцию обратного вызова вместо массива задач. В этом случае функция получает объект event содержащий информацию о событии, которое вызвало функцию:
Другой отличительной особенностью gulp.watch() является то, что она возвращает watcher. Используйте его для прослушивания дополнительных событий или для добавления файлов в watch. Например, чтобы одновременно запустить список задач и вызвать функцию, вы можете добавить слушателя в событие change при возвращении watcher:
В дополнение к событию change вы можете прослушивать ряд других событий:
- end
Срабатывает, когда watcher завершается (это означает, что задачи и функции обратного вызова не будут больше вызываться при изменении файлов).
- error
Срабатывает, когда происходит ошибка.
- ready
Срабатывает, когда файлы были найдены и готовы к отслеживанию.
- nomatch
Срабатывает, когда запросу не соответствует ни один файл.
Объект watcher также содержит некоторые методы, которые можно вызывать:
- watcher.end()
Останавливает watcher (при этом задачи или функции обратных вызовов не будут больше вызываться).
- watcher.files()
Возвращает список файлов за которыми следит watcher.
- watcher.add(glob)
Добавляет файлы в watcher, которые соответствуют указанному шаблону glob (также принимает необязательную функцию обратного вызова в качестве второго аргумента). - watcher.remove(filepath)
Удаляет определённый файл из watcher.
Gulp
Step 7: Profit!
Other plugins you may find useful:
- gulp-load-plugins: load all Gulp plugin modules without declarations
- gulp-preprocess: a simple HTML and JavaScript preprocess
- or gulp-less: the Less CSS pre-processor plugin
- gulp-stylus: the Stylus CSS pre-processor plugin
- gulp-size: displays file sizes and savings
- gulp-nodemon: uses nodemon to automatically restart Node.js applications when changes occur
Gulp tasks can run any JavaScript code or Node.js modules. They don’t necessarily need to be plugins — for example:
- browser-sync: automatically reload assets or refresh your browser when changes occur
- del: delete files and folders (perhaps clean your folder at the start of every run)
Invest a little time and Gulp could save many hours of development frustration. The advantages:
- plugins are plentiful
- configuration using pipes is readable and easy to follow
- can be adapted and reused in other projects
- your total page weight can be reduced to improve performance
- you can simplify your deployment
- coding is fun (well, more interesting than JSON configurations used by other task runners)
Useful links:
- Gulp home page
- Gulp plugins
- npm home page
Applying the processes above to a simple website reduced the total weight by more than 50% or more. You can test your own results using page weight analysis tools.
Gulp continues to be a great option for automated task running and can revolutionize your workflow. I hope you found this guide useful and consider Gulp for your production process.
Итог
Теперь ты имеешь в руках довольно простой и приятный инструмент для управления процессом Gulp на сервере (даже на обычном хостинге) и не нужно заниматься компиляцией ресурсов на локальной машине, работая через Deployment Tools.
Все эти наработки можно красиво обернуть в Composer плагин и подшлифовать для конкретной системы (например, Yii2). Этим я обязательно займусь, когда переведу CMS на неё.
В купе с возможностью править файлы ресурсов на сервере через админпанель ты получаешь мощный инструмент, не требующий от тебя настроенной рабочей машины. Можно срочно поправить мелкие баги по требованию заказчика из любого места, с любого компьютера и т.д.