<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gulp</title>
	<atom:link href="https://consultapp.ru/category/stati/gulp/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Веб-разработка, сопровождение информационных систем</description>
	<lastBuildDate>Fri, 03 Nov 2023 19:37:52 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>Простая настройка Gulp для верстальщика</title>
		<link>https://consultapp.ru/simple-gulp-for-front-developer/</link>
		
		<dc:creator><![CDATA[Дмитрий]]></dc:creator>
		<pubDate>Fri, 03 Nov 2023 09:21:12 +0000</pubDate>
				<category><![CDATA[Gulp]]></category>
		<category><![CDATA[Статьи]]></category>
		<guid isPermaLink="false">https://consultapp.ru/?p=1790</guid>

					<description><![CDATA[<p>Gulp &#8212; сборщик проекта, который на первый вгляд может показаться усложненным. Но как только Вы немного погрузитесь в него, то поразитесь, насколько он удобен и гибок для подстройки именно под Вашу структуру. В этой статье мы разберем простой пример настройки Gulp и его плагинов, делается это через gulpfile.js в корне проекта. Установка самого сборщика и&#8230;</p>
<p>Сообщение <a href="https://consultapp.ru/simple-gulp-for-front-developer/">Простая настройка Gulp для верстальщика</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Gulp &#8212; сборщик проекта, который на первый вгляд может показаться усложненным. Но как только Вы немного погрузитесь в него, то поразитесь, насколько он удобен и гибок для подстройки именно под Вашу структуру.</p>



<span id="more-1790"></span>



<p>В этой статье мы разберем простой пример настройки <a href="https://gulpjs.com/" target="_blank" rel="noreferrer noopener">Gulp</a> и его <a href="https://gulpjs.com/plugins" target="_blank" rel="noreferrer noopener">плагинов</a>, делается это через <strong>gulpfile.js</strong> в корне проекта. Установка самого сборщика и его плагинов осуществляется через пакетный менеджер <strong>npm</strong>.</p>



<h2 class="wp-block-heading">Что мы используем в обычном проекте?</h2>



<p>В простом проекте по верстке, в котором у нас будет <strong>папка исходников </strong>(<strong>src)</strong> и <strong>рабочего проекта</strong> (<strong>dist</strong>), мы работаем с:</p>



<ul class="wp-block-list">
<li><strong><a href="#html">HTML</a></strong> &#8212; в нашем случае все будет в различных .html файлах двух типов: страницы и темплейты компонентов (здесь мы будем использовать плагин <strong>gulp-file-include</strong>, что очень сильно облегчает разработку и соответствует DRY);</li>



<li><a href="#scss"><strong>SASS/SCSS</strong> </a>&#8212; будем использовать препроцессоры для удобства, те собирать будем все .scss файлы в один оптимизированный стилевой файл <strong>style.css</strong>;</li>



<li><strong><a href="#js">JS</a></strong> &#8212; те или иные скрипты, все .js файлы, хотелось бы тоже собрать по всему проекту в один оптимизированный<strong> script.js</strong>;</li>



<li><strong><a href="#images">Images</a></strong> &#8212; разные статические картинки, которые учавствуют в оформлении. Их будем собирать по всему проекту в одну папку без сохранения изначальной стркутуры папок,  а так же оптимизировать размер;</li>



<li><strong><a href="#helpers">Live Dev Server</a></strong> &#8212; хотелось бы как-то налету применять все изменения  при разработке, за это будет отвечать локальный сервер.</li>
</ul>



<p>Сначала мы рассмотрим отдельные части кода, потом соберем весь пазл.</p>



<h2 class="wp-block-heading">Необходимые плагины</h2>



<p>Плагины мы устанавливаем, как dev зависимости с помощью <strong>npm</strong> например. </p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">npm i -D gulp browser-sync gulp-flatten del...</code></pre>



<p>Соотвественно начало нашего настроечного файла будет содержать подключение всех установленных плагинов. Их смысл во многом понятен из названий и будет разобран ниже.</p>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript">// COMMON
import gulp from 'gulp';
const { src, dest, watch, series } = gulp;

import { deleteAsync } from 'del';
import syncServer from 'browser-sync';
const sync = syncServer.create();

import flatten from 'gulp-flatten';

// STYLE
import * as dartSass from 'sass';
import gulpSass from 'gulp-sass';
const sass = gulpSass(dartSass);
import autoprefixer from 'gulp-autoprefixer';
import minify from 'gulp-clean-css';
import sourcemaps from 'gulp-sourcemaps';
import concat from 'gulp-concat';

// HTML
import include from 'gulp-file-include';

// IMAGES
import imagemin from 'gulp-imagemin';</code></pre>



<h2 class="wp-block-heading" id="html">HTML</h2>



<p>В HTML нас ждет один из самых приятных сюрпризов, это возможность разделять код на файлы и подключать и в любом месте других файлов, например так:</p>



<pre class="wp-block-code"><code lang="markup" class="language-markup">  &lt;head&gt;
    @@include('src/components/meta/index.html')
    &lt;title&gt;Title&lt;/title&gt;
  &lt;/head&gt;</code></pre>



<p>За работу с html будет отвечать одноименная функция, заметьте, что мы не берем все .html из проекта, а только те, что считаем страницами, при этом шаблоны подключаются из папки компонентов: </p>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript">function html() {
  return src('src/pages/**/**.html') // берем все файлы по шаблону
    .pipe( 
      include({
        prefix: '@@',
        basepath: '@root',
      }),// запускаем плагин, который подставит все темплейты
    )
    .pipe(dest('dist')); // кладем файлы с сохранением структуры и проект
} </code></pre>



<h2 class="wp-block-heading" id="scss">SASS/SCSS</h2>



<p>Тут мы будем использовать последовательное включение разных плагинов для потока файлов, большинство названий говорящие, так что особых пояснений не требуется. Если что-то не ясно, можно уточнить по имени <a href="https://gulpjs.com/plugins" target="_blank" rel="noreferrer noopener">плагина</a>.</p>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript">function scss() {
  return src('src/**/**.scss') // берем все файлы с расширением .scss
    .pipe(sourcemaps.init()) // начинаем собирать sourcemap информацию
    .pipe(autoprefixer()) // добавляем браузерные префиксы
    .pipe(sass().on('error', sass.logError)) // препроцессор sass
    .pipe(concat('style.min.css')) // собираем все в 1 файл
    .pipe(minify()) // минифицируем
    .pipe(sourcemaps.write('.')) // указываем sourcemap  туже директорию
    .pipe(dest('dist/assets/css')); // сохраняем конечный фалй
}</code></pre>



<h2 class="wp-block-heading" id="js">JS</h2>



<p>C JS все достаточно просто, собираем в один файл всё с расширением .js. Но Вы можете подключить дополнительные плагины для манификации кода например.</p>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript">function js() {
  return src('src/**/**.js') // выбираем файлы по маске
    .pipe(concat('script.js')) // сиединяем в один файл script.js
    .pipe(dest('dist/assets/js')); // сохраняем в необходимую директорию
}</code></pre>



<h2 class="wp-block-heading" id="images">Images</h2>



<p>Собираем все картинки в папке, и обрабатываем необходимым образом.</p>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript">function images() {
  return src('src/assets/images/*') // выбираем файлы по маске
    .pipe(imagemin()) // оптимизируем картинки
    .pipe(flatten()) // избавляемся от вложенности, можно убрать
    .pipe(dest('dist/assets/images/')); // сохраняем в проект
}</code></pre>



<h2 class="wp-block-heading" id="helpers">Вспомогательные функции</h2>



<p>Еще нам понадобится, как уже упоминалось, сервер и функция очистки проекта. Сервер работает по принципу слежения за соответствующими файлами и запуску функций при их изменении.</p>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript">function clear() {
  return deleteAsync('dist'); // удаляем все файлы из итогового проекта
}

function serve() {
  // инициализируем сервер, который хостит нашу папку итогового проекта
  sync.init({ server: './dist' }); 

  // следим за файлами по маске и запускаем функции при их изменении
  // далее перезагружаем сервер
  watch(['src/**/**.html'], series(html)).on('change', sync.reload);
  watch(['src/**/**.scss'], series(scss)).on('change', sync.reload);
  watch(['src/assets/images/*'], series(images)).on('change', sync.reload);
  watch('src/**/**.js', series(js)).on('change', sync.reload);
}</code></pre>



<h2 class="wp-block-heading">Функции сборки проекта</h2>



<p>В итоге для удобства нам хотелось бы иметь короткие функции сборки всего проекта и запуска их из консоли. Нам понадобятся dev и build сборки. Запускать их будем так:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">gulp dev
gulp build</code></pre>



<p>Для сборок будем использовать наборы функций, которые запускаются последовательно, для этого используем метод gulp &#8212; <strong>series</strong>. Он возвращает функцию, которую мы экспортируем и сможем использовать для запуска из коммандной строки.</p>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript">// <strong>series</strong> последовательно запускает указанные функции
const build = series([clear, scss, html, js, images]);
const dev = series([clear, scss, html, js, images, serve]);

export { build, dev };</code></pre>



<p>Как видно из кода, различием dev сборки только в том, что она запускает тестовый сервер. Но Вы конечно можете кастомизировать порядок и настройки под ваши задачи и вкус.</p>



<h2 class="wp-block-heading">Итоговый файл настройки</h2>



<pre title="gulpfile.js" class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">// COMMON
import gulp from 'gulp';
const { src, dest, watch, series } = gulp;

import { deleteAsync } from 'del';
import syncServer from 'browser-sync';
const sync = syncServer.create();
import flatten from 'gulp-flatten';

// STYLE
import * as dartSass from 'sass';
import gulpSass from 'gulp-sass';
const sass = gulpSass(dartSass);
import autoprefixer from 'gulp-autoprefixer';
import minify from 'gulp-clean-css';
import sourcemaps from 'gulp-sourcemaps';
import concat from 'gulp-concat';

// HTML
import include from 'gulp-file-include';

// IMAGES
import imagemin from 'gulp-imagemin';

function html() {
  return src('src/pages/**/**.html')
    .pipe(
      include({
        prefix: '@@',
        basepath: '@root',
      }),
    )
    .pipe(dest('dist'));
}

function images() {
  return src('src/assets/images/*')
    .pipe(imagemin())
    .pipe(flatten())
    .pipe(dest('dist/assets/images/'));
}

function scss() {
  return src('src/**/**.scss')
    .pipe(sourcemaps.init())
    .pipe(autoprefixer())
    .pipe(sass().on('error', sass.logError))
    .pipe(concat('style.min.css'))
    .pipe(minify())
    .pipe(sourcemaps.write('.'))
    .pipe(dest('dist/assets/css'));
}

function js() {
  return src('src/**/**.js').pipe(concat('script.js')).pipe(dest('dist/assets/js'));
}

function clear() {
  return deleteAsync('dist');
}

function serve() {
  sync.init({ server: './dist' });

  watch(['src/**/**.html'], series(html)).on('change', sync.reload);
  watch(['src/**/**.scss'], series(scss)).on('change', sync.reload);
  watch(['src/assets/images/*'], series(images)).on('change', sync.reload);
  watch(['src/**/**.js'], series(js)).on('change', sync.reload);
}

const build = series([clear, scss, html, js, images]);
const dev = series([clear, scss, html, js, images, serve]);

export { build, dev };
</code></pre>



<h2 class="wp-block-heading">Заключение</h2>



<p>В этой статье мы описали простейший вариант настройки <strong>Gulp</strong>, при этом обладающий всеми необходимыми инструментами для сборки и оптимизации проекта. Вы, конечно, всегда можете дополнить его плагинами и настройками на Ваш вкус.</p>



<p>Если остались вопросы, <a href="mailto:info@consultapp.ru">напишите нам на почту</a>, мы постараемся помочь!</p>
<p>Сообщение <a href="https://consultapp.ru/simple-gulp-for-front-developer/">Простая настройка Gulp для верстальщика</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
