Современная cборка Gulp — ES-модули, Git — 2 часть
В предыдущей статье (Современная cборка Gulp для веб-разработки) мы создали самую простую сборку Gulp. Продолжим её совершенствовать.
Подготовка к сохранению в репозиторий Git
Отвлечемся немного от сборки и подготовим файты для сохранения их в репозитории. Впрочем сейчас можете пропустить этот пункт и вернутся к нему позже.
Подробнее о Git и Git Bash смотрите в статьях:
Основные команды Git Bash
30 основных команд Git для управление репозиториями GitHub
Создадим в корне проекта файл README.md в котором будет описание нашей сборки:
#Современная cборка Gulp для веб-разработки
И файл .gitignore где мы укажем какие файлы и папки не нужно сохранять в репозиторий (подробнее о .gitignore) :
/node_modules /dist package-lock.json
Мы подготовили сборку для сохранения в репозиторий.
Cтруктура проeкта
Для удобства работы при добавлении плагинов и измененииях сборки создадим отдельные файлы под разные задачи. Для этого создаим в корне проекта папку gulp а в ней папки
config — для файлов отвечающих за конфигурацию и
tasks — для задач
Теперь структура проекта будет выглядеть так:
project # Папка проекта │ ├── gulp │ ├── config # файлы отвечающие за конфигурацию │ └── tasks # задачи │ ├───src # ИСХОДНИКИ │ ├─── scss │ │ └── style.scss │ ├─── js │ │ └── app.js │ └─── index.html │ ├── .gitignore # "игнор" для Git ├── gulpfile.js # файл с настройками Gulp ├── package.json # файл с настройками сборки и установленными пакетами └── README.md # документация сборки
Настройка путей
Для удобной работы с файлами и папками запишем основные пути в переменную. Для этого создадим файл gulp/config/paths.mjs
export const paths = { // Пути к файлам
styles: {
src: './src/scss/**/*.scss',
dest: './dist/css'
},
scripts: {
src: './src/js/**/*.js',
dest: './dist/js'
},
html: {
src: './src/**/*.html',
dest: './dist'
}
};
Импортируем переменную (paths) с путями в основной файл настроек gulpfile.js
import { paths } from './gulp/config/paths.mjs'; // Импорт путей
(Не забудте удалить ранее прописанные «Пути к файлам»)
Для доступности этой и некоторых других переменных (которые объявим позже) в файле gulpfile.js создадим глобальную переменную:
// Глобальная переменная
global.app = {
paths: paths,
}
Теперь мы можем настраивать пути в отдельном месте и использовать их в любом файле сборки.
Подключение плагинов
Для часто используемых плагинов подключим их в отдельном ES-модуле — файле gulp/config/plugins.mjs
import sourcemaps from 'gulp-sourcemaps';
export const plugins = {
sourcemaps: sourcemaps,
}
Как и в предыдущем пункте импортируем переменную (plugins) в основной файл настроек gulpfile.js и добавляем к глобальной переменной:
import { plugins } from './gulp/config/plugins.mjs'; // Импорт плагинов
// Глобальная переменная
global.app = {
paths: paths,
plugins: plugins,
}
Отредактируем файл gulpfile.js удалив импорт перенесённых плагинов (сейчас это import sourcemaps from 'gulp-sourcemaps';)
И подключив их через глобальную переменную (меняем sourcemaps на app.plugins.sourcemaps).
Должно получиться так:
import gulp from 'gulp';
import * as dartSass from 'sass';
import gulpSass from 'gulp-sass';
import autoprefixer from 'gulp-autoprefixer';
import cleanCSS from 'gulp-clean-css';
import uglify from 'gulp-uglify';
import concat from 'gulp-concat';
import browserSync from 'browser-sync';
import { paths } from './gulp/config/paths.mjs'; // Импорт путей
import { plugins } from './gulp/config/plugins.mjs'; // Импорт плагинов
const sass = gulpSass(dartSass);
const server = browserSync.create();
// Глобальная переменная
global.app = {
paths: paths,
plugins: plugins,
}
// Компиляция SCSS в CSS
export function styles() {
return gulp.src(app.paths.styles.src, { sourcemaps: true })
.pipe(app.plugins.sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(autoprefixer())
.pipe(cleanCSS())
.pipe(app.plugins.sourcemaps.write('.'))
.pipe(gulp.dest(app.paths.styles.dest))
.pipe(server.stream());
}
// Минификация и объединение JS файлов
export function scripts() {
return gulp.src(paths.scripts.src, { sourcemaps: true })
.pipe(app.plugins.sourcemaps.init())
.pipe(concat('app.min.js'))
.pipe(uglify())
.pipe(app.plugins.sourcemaps.write('.'))
.pipe(gulp.dest(app.paths.scripts.dest))
.pipe(server.stream());
}
// Копирование HTML файлов
export function html() {
return gulp.src(app.paths.html.src)
.pipe(gulp.dest(app.paths.html.dest))
.pipe(server.stream());
}
// Запуск сервера и отслеживание изменений
export function serve() {
server.init({
server: {
baseDir: './dist'
}
});
gulp.watch(app.paths.styles.src, styles);
gulp.watch(app.paths.scripts.src, scripts);
gulp.watch(app.paths.html.src, html).on('change', server.reload);
}
// Определение задач
const build = gulp.series(gulp.parallel(styles, scripts, html), serve);
// Экспорт задач
export { build };
// Задача по умолчанию
export default build;
Если плагин используется только в одном модуле, то нет необхобимости подключать его таким способом. Можно подключить непосредственно в том файле, где он нужнен.
Подключение задач с помощью ES-модулей
Похожим образом поступим с задачами, которые поместим в отдельных файлах в папке gulp/tasks. Перенося импорт плагинов в эти модули и импортируя задачи в gulpfile.js.
В результате должна получиться такая конфигурация:
project # Папка проекта │ ├── gulp │ ├── config # файлы отвечающие за конфигурацию │ │ ├── paths.mjs # переменная с путями │ │ └── plugins.mjs # общие плагины │ └── tasks # задачи │ ├── html.mjs # обработка html │ ├── scripts.mjs # обработка js │ ├── serve.mjs # запуск сервера │ └── styles.mjs # обработка scss │ ~
В результате у нас должно получиться:
html.mjs
// Копирование HTML файлов
export function html() {
return app.gulp.src(app.paths.html.src)
.pipe(app.gulp.dest(app.paths.html.dest))
.pipe(app.server.stream());
}
scripts.mjs
import uglify from 'gulp-uglify';
import concat from 'gulp-concat';
// Минификация и объединение JS файлов
export function scripts() {
return app.gulp.src(app.paths.scripts.src, { sourcemaps: true })
.pipe(app.plugins.sourcemaps.init())
.pipe(concat('app.min.js'))
.pipe(uglify())
.pipe(app.plugins.sourcemaps.write('.'))
.pipe(app.gulp.dest(app.paths.scripts.dest))
.pipe(app.server.stream());
}
serve.mjs
import browserSync from 'browser-sync';
export const server = browserSync.create();
// Запуск сервера
export function serve() {
server.init({
server: {
baseDir: './dist'
}
});
}
styles.mjs
import * as dartSass from 'sass';
import gulpSass from 'gulp-sass';
import autoprefixer from 'gulp-autoprefixer';
import cleanCSS from 'gulp-clean-css';
const sass = gulpSass(dartSass);
// Компиляция SCSS в CSS
export function styles() {
return app.gulp.src(app.paths.styles.src, { sourcemaps: true })
.pipe(app.plugins.sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(autoprefixer())
.pipe(cleanCSS())
.pipe(app.plugins.sourcemaps.write('.'))
.pipe(app.gulp.dest(app.paths.styles.dest))
.pipe(app.server.stream());
}
Основной файл настроек gulpfile.js стал более «изящный»:
import gulp from 'gulp';
import { paths } from './gulp/config/paths.mjs'; // Импорт путей
import { plugins } from './gulp/config/plugins.mjs'; // Импорт плагинов
// Импорт задач
import { styles } from './gulp/tasks/styles.mjs'; // стили
import { scripts } from './gulp/tasks/scripts.mjs'; // скрипты
import { html } from './gulp/tasks/html.mjs'; // html
import { serve, server } from './gulp/tasks/serve.mjs'; // открытие в браузере
// Глобальная переменная
global.app = {
gulp: gulp,
paths: paths,
plugins: plugins,
server: server,
}
// Отслеживание изменений
function watch() {
gulp.watch(paths.styles.src, styles);
gulp.watch(paths.scripts.src, scripts);
gulp.watch(paths.html.src, html).on('change', server.reload);
}
// Определение сценария задач
const build = gulp.series(gulp.parallel(styles, scripts, html), gulp.parallel(serve, watch));
// Экспорт сценврия
export { build };
// Сценарий по умолчанию
export default build;
Заключение
Мы продолжили создавать современную сборку Gulp, используя ES-модули и строгий режим. Эта сборка поможет вам автоматизировать задачи, связанные с компиляцией SCSS, минификацией JavaScript, обработкой HTML и запуском локального сервера. Такая автоматизация значительно ускоряет и упрощает процесс разработки веб-сайтов. Gulp — это мощный инструмент, который позволяет настроить рабочий процесс именно под ваши нужды, делая разработку более эффективной и приятной.
P.S.
Эта сборка осталась простой, но стала более удобной благодаря ES-модулям для дальнейшего её совершенствования, чем мы и займёмся в следующей статье:
Современная cборка Gulp 5 — удаление и копирование — 3 часть

