Эта статья Gulp является частью серии, созданной в сотрудничестве с SiteGround . Спасибо за поддержку партнеров, которые делают возможным использование SitePoint.
Простая разработка тем WordPress частично ответственна за ее успех. Разработчик, обладающий интерфейсом и знанием PHP, может обратиться к превосходному Кодексу и начать работу над своим следующим шедевром.
Разработка темы возможна только с помощью текстового редактора и графического пакета, но современные наборы инструментов могут революционизировать ваш рабочий процесс. В этом уроке мы будем использовать Gulp для запуска задач, в том числе:
- копирование новых файлов тем PHP
- оптимизация изображений
- компиляция файлов Sass SCSS в один минимизированный файл CSS
- объединение упорядоченных файлов JavaScript, удаление операторов отладки и минимизация
- автоматическое обновление браузера при обновлении файлов.
Что такое Gulp?
Gulp — это система сборки на основе JavaScript, которая берет ваши исходные файлы и преобразует их в оптимизированные версии. Если вы новичок в Gulp, пожалуйста, обратитесь к разделу Введение в Gulp.js для полной инструкции по установке и использованию. Краткое описание начальных шагов:
- Установите Node.js.
- Установите Gulp глобально:
npm install gulp-cli -g - Создайте папку проекта и перейдите в нее:
mkdir mythemeзатемcd mytheme. - Инициализируйте ваш проект с помощью npm:
npm init
Файлы вашего проекта
Процесс сборки Gulp (или любой другой) требует набора исходных файлов, содержащих ваш неизмененный код и изображения. Они обрабатываются, обрабатываются и минимизируются для создания файлов сборки .
WordPress устанавливается в папку веб-сервера, возможно, /var/www/ в Linux / Apache. Ваша тема WordPress должна быть определена в ее собственной подпапке в /wp-content/themes/ . Поэтому папка с нашими встроенными файлами может быть /var/www/wp-content/themes/mytheme/ . Как минимум, темы требуют двух файлов:
- таблицу стилей
style.cssсодержащую метаданные в комментариях вверху, и - файл шаблона
index.php.
Большинство тем содержат гораздо больше файлов для представления сообщений, страниц, индексов, категорий, тегов и ошибок. Межстраничные пароли, такие как верхние и нижние колонтитулы, обычно определяются как файлы изображений и JavaScript.
Вы можете разместить свои исходные файлы где-нибудь в папке mytheme . Это может быть полезно, если вы распространяете тему для скачивания, изменения и создания другими пользователями. Однако для целей данного руководства мы будем использовать исходную папку, недоступную с веб-сервера, например ~/mytheme/ . Преимущества такого подхода:
- Исходными файлами вашей темы можно управлять в одной папке и хранилище, не загрязняя папки build или WordPress.
- Последняя созданная папка темы содержит только те файлы, которые ей требуются.
- Gulp, его плагины и другие приложения не содержатся в папке темы. Они не могут быть случайно скопированы на производственный сервер, что является ненужным и может иметь последствия для безопасности.
Папка исходного проекта требует еще четыре подпапки:
-
template— файлы темы WordPress PHP -
images— изображения, используемые вашей темой -
scss— исходные файлы Sass SCSS -
js— любое количество отдельных исходных файлов JavaScript на стороне клиента.
Установить зависимости
В исходной папке ( ~/mytheme/ ) выполните следующую команду npm чтобы установить Gulp и все подключаемые модули в качестве зависимостей разработки:
npm install --save-dev autoprefixer browser-sync css-mqpacker cssnano gulp gulp-concat gulp-deporder gulp-imagemin gulp-newer gulp-postcss gulp-sass gulp-strip-debug gulp-uglify gulp-util postcss-assets
Будет node_modules папка node_modules содержащая код модуля. Это должно быть опущено в вашей системе управления версиями (для пользователей Git добавьте node_modules в ваш файл .gitignore ).
Создать файл конфигурации Gulp
Создайте новый gulpfile.js конфигурации gulpfile.js в корне вашей исходной папки. Добавьте этот код, чтобы начать:
// Gulp.js configuration 'use strict' ; const // source and build folders dir = { src : 'src/' , build : '/var/www/wp-content/themes/mytheme/' }, // Gulp and plugins gulp = require ( 'gulp' ), gutil = require ( 'gulp-util' ), newer = require ( 'gulp-newer' ), imagemin = require ( 'gulp-imagemin' ), sass = require ( 'gulp-sass' ), postcss = require ( 'gulp-postcss' ), deporder = require ( 'gulp-deporder' ), concat = require ( 'gulp-concat' ), stripdebug = require ( 'gulp-strip-debug' ), uglify = require ( 'gulp-uglify' ) ; // Browser-sync var browsersync = false ; // PHP settings const php = { src : dir.src + 'template/**/*.php' , build : dir.build }; // copy PHP files gulp.task( 'php' , () => { return gulp.src(php.src) .pipe(newer(php.build)) .pipe(gulp.dest(php.build)); });
Мы определяем папки по умолчанию, загружаем модули, затем создаем задачу php для копирования новых и обновленных файлов в папку темы. Задача была намеренно проста для копирования исходных файлов PHP как есть.
Сохраните gulpfile.js и создайте несколько файлов .php в папке исходного template . Затем введите следующую команду:
gulp php
Все файлы будут скопированы в папку темы ( /var/www/wp-content/themes/mytheme/ ).
Обработка изображений
Файлы изображений часто сжимаются с помощью таких инструментов, как imagemin . Добавьте следующий код в gulpfile.js :
// image settings const images = { src : dir.src + 'images/**/*' , build : dir.build + 'images/' }; // image processing gulp.task( 'images' , () => { return gulp.src(images.src) .pipe(newer(images.build)) .pipe(imagemin()) .pipe(gulp.dest(images.build)); });
Сохраните и запустите gulp images . Сжатые версии любых новых или обновленных изображений в папке исходных images копируются в /var/www/wp-content/themes/mytheme/images/ .
Sass Compilation
WordPress не может напрямую использовать файлы Sass; Вы должны скомпилировать в один файл style.css . Добавьте следующий код в gulpfile.js :
// CSS settings var css = { src : dir.src + 'scss/style.scss' , watch : dir.src + 'scss/**/*' , build : dir.build, sassOpts: { outputStyle : 'nested' , imagePath : images.build, precision : 3 , errLogToConsole : true }, processors: [ require ( 'postcss-assets' )({ loadPaths: [ 'images/' ], basePath: dir.build, baseUrl: '/wp-content/themes/wptheme/' }), require ( 'autoprefixer' )({ browsers: [ 'last 2 versions' , '> 2%' ] }), require ( 'css-mqpacker' ), require ( 'cssnano' ) ] }; // CSS processing gulp.task( 'css' , [ 'images' ], () => { return gulp.src(css.src) .pipe(sass(css.sassOpts)) .pipe(postcss(css.processors)) .pipe(gulp.dest(css.build)) .pipe(browsersync ? browsersync.reload({ stream: true }) : gutil.noop()); });
Запустите эту новую задачу с gulp css чтобы:
- сначала запустите задачу Gulp
images(изображения могут потребоваться в вашем CSS) - скомпилируйте код Sass в исходном
scss/style.scssиспользуя быстрый компилятор LibSass - Используйте PostCSS для автоматического добавления ссылок на ресурсы, применения префиксов поставщиков, объединения медиазапросов и минимизации получающегося кода CSS
- выведите таблицу стилей в
/var/www/wp-content/themes/mytheme/style.css. - принудительная перезагрузка браузера Browsersync (подробнее об этом позже).
Исходный scss/style.scss должен содержать метаданные темы WordPress вверху, например
'_base' ; @ import '_forms' ; @ import '_tables' ; @ import 'components/_widget1' ; // etc...
Важно использовать /*! как первая строка. Это гарантирует, что cssnano minifier не удалит комментарий и сделает вашу тему непригодной для использования.
Плагин postcss-assets позволяет вам ссылаться на ресурсы изображения, используя такой код:
.widget1 { width : width( 'myimage.jpg' ); height : height( 'myimage.jpg' ); background-image : resolve( 'myimage.jpg' ); }
Вы также можете встроить изображения с помощью автоматической кодировки Base64:
.widget2 { background-image : inline( 'myimage.jpg' ); }
Обработка JavaScript
Добавьте следующий код в gulpfile.js :
// JavaScript settings const js = { src : dir.src + 'js/**/*' , build : dir.build + 'js/' , filename : 'scripts.js' }; // JavaScript processing gulp.task( 'js' , () => { return gulp.src(js.src) .pipe(deporder()) .pipe(concat(js.filename)) .pipe(stripdebug()) .pipe(uglify()) .pipe(gulp.dest(js.build)) .pipe(browsersync ? browsersync.reload({ stream: true }) : gutil.noop()); });
Запустите эту новую задачу с gulp js чтобы:
- обработать все файлы JavaScript в исходной папке
js - упорядочить файлы соответствующим образом. Добавьте комментарии вверху ваших файлов JavaScript для объявления зависимостей, например,
// requires: lib1.jsили// requires: config.js lib1.js - объединить в один файл
- убрать все операторы отладки и ведения журнала консоли
- минимизировать код
- выведите полученный код в
/var/www/wp-content/themes/mytheme/js/scripts.js. - принудительная перезагрузка браузера Browsersync (подробнее об этом позже).
Запустить все
Вместо того, чтобы вызывать каждую задачу отдельно, мы можем добавить следующий код в gulpfile.js :
// run all tasks gulp.task( 'build' , [ 'php' , 'css' , 'js' ]);
Теперь вы можете использовать gulp build для параллельного запуска задач php , js , css и images . (Обратите внимание, images являются зависимостью задачи css поэтому нам не нужно вызывать ее напрямую.)
Включить просмотр файлов и Browsersync
Ваш рабочий процесс может быть радикально улучшен с помощью:
- Позвольте Gulp наблюдать за изменениями файлов перед запуском соответствующей задачи.
- Автоматическая перезагрузка файлов CSS и JavaScript при их изменении (без обновления страницы).
- Автоматическое обновление страницы при изменении файла шаблона.
Во-первых, нам нужно определить задачу browsersync в gulpfile.js . Это создаст прокси-сервер для вашего веб-сервера под управлением WordPress на localhost (измените этот домен или используйте IP-адрес при необходимости):
// Browsersync options const syncOpts = { proxy : 'localhost' , files : dir.build + '**/*' , open : false , notify : false , ghostMode : false , ui: { port: 8001 } }; // browser-sync gulp.task( 'browsersync' , () => { if (browsersync === false ) { browsersync = require ( 'browser-sync' ).create(); browsersync.init(syncOpts); } });
Теперь добавьте задачу watch для запуска Browsersync, проследите за изменениями файлов и запустите соответствующую задачу:
// watch for file changes gulp.task( 'watch' , [ 'browsersync' ], () => { // page changes gulp.watch(php.src, [ 'php' ], browsersync ? browsersync.reload : {}); // image changes gulp.watch(images.src, [ 'images' ]); // CSS changes gulp.watch(css.watch, [ 'css' ]); // JavaScript main changes gulp.watch(js.src, [ 'js' ]); });
Наконец, добавьте задачу Gulp по default которая запускает начальную сборку и запускает задачу watch :
// default task gulp.task( 'default' , [ 'build' , 'watch' ]);
Теперь запустите gulp из командной строки. Консоль будет отображать вывод, который включает в себя строки, похожие на:
[BS] Proxying: http://localhost [BS] Access URLs: ------------------------------------- Local: http://localhost:3000 External: http://192.168.1.99:3000 ------------------------------------- UI: http://localhost:8001 UI External: http://192.168.1.99:8001 ------------------------------------- [BS] Watching files...
Вместо загрузки вашего сайта разработки с http://localhost/ введите адрес http://localhost:3000/ или внешний URL, если вы просматриваете с другого устройства. Ваш сайт WordPress будет загружаться, как и раньше, но Gulp будет следить за изменениями и немедленно применять обновления. Вам больше не нужно переключаться в браузер и нажимать кнопку «Обновить» снова!
Нажмите Ctrl / Cmd + C, когда хотите остановить обработку Gulp.
Улучшать дальше
Мы рассмотрели основы разработки тем WordPress с помощью Gulp, но есть несколько тысяч плагинов, которые помогут вам в вашем рабочем процессе. Вы можете рассмотреть дополнительные задачи для:
- ограничить ваш код PHP и JavaScript
- создавать стили темы WordPress из информации
package.json - Кэш-перебор активов WordPress
- автоматически развернуть вашу тему на рабочем сервере.
Несколько часов написания задач Gulp могут сэкономить много дней ручной обработки в течение длительного времени.