HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В прошлом уроке мы подключили встроенную в пакет Gulp функцию parallel(), которая позволила объединить несколько функций в одну единую задачу.</p>
1 <p>В прошлом уроке мы подключили встроенную в пакет Gulp функцию parallel(), которая позволила объединить несколько функций в одну единую задачу.</p>
2 <p>Помимо parallel() внутри пакета<em>Gulp</em>существует ещё несколько функций, которые будут рассмотрены в этом уроке. Нет нужды расписывать каждую функцию в отдельности, поэтому рассмотрим самые распространённые, которые вы будете использовать в работе. Больше информации про различные функции можно будет найти в документации пакета<em>Gulp</em>, ссылка на которую будет в конце урока.</p>
2 <p>Помимо parallel() внутри пакета<em>Gulp</em>существует ещё несколько функций, которые будут рассмотрены в этом уроке. Нет нужды расписывать каждую функцию в отдельности, поэтому рассмотрим самые распространённые, которые вы будете использовать в работе. Больше информации про различные функции можно будет найти в документации пакета<em>Gulp</em>, ссылка на которую будет в конце урока.</p>
3 <h2>series()</h2>
3 <h2>series()</h2>
4 <p>Функция series() по своему функционалу очень похожа на функцию parallel(), которую мы изучили в прошлых уроках. Но если есть две разные функции, значит у них должны быть отличия? И ответ - да! Отличие заключается в том, как именно будут вызываться функции в рамках задачи. И здесь два подхода:</p>
4 <p>Функция series() по своему функционалу очень похожа на функцию parallel(), которую мы изучили в прошлых уроках. Но если есть две разные функции, значит у них должны быть отличия? И ответ - да! Отличие заключается в том, как именно будут вызываться функции в рамках задачи. И здесь два подхода:</p>
5 <ul><li>Функция parallel(), как можно понять из названия, выполняет функции параллельно/одновременно. В примере выше функции sassCompile(), pugCompile() и imagesOptimize() не будут стоять в какой-то очереди или дожидаться окончания друг друга, а начнут работать вместе. Этот подход удобен, если задачи никак друг с другом не связаны и результат одной не зависит от результата другой.</li>
5 <ul><li>Функция parallel(), как можно понять из названия, выполняет функции параллельно/одновременно. В примере выше функции sassCompile(), pugCompile() и imagesOptimize() не будут стоять в какой-то очереди или дожидаться окончания друг друга, а начнут работать вместе. Этот подход удобен, если задачи никак друг с другом не связаны и результат одной не зависит от результата другой.</li>
6 </ul><ul><li>В противовес параллельному выполнению есть последовательное, которое реализуется функцией series(). Смысл этой функции в том, что пока не завершилась работа одной функции не начнётся выполнение другой. Это очень важно при использовании множества подзадач, которые напрямую влияют на то, с чем будет работать следующая функция.</li>
6 </ul><ul><li>В противовес параллельному выполнению есть последовательное, которое реализуется функцией series(). Смысл этой функции в том, что пока не завершилась работа одной функции не начнётся выполнение другой. Это очень важно при использовании множества подзадач, которые напрямую влияют на то, с чем будет работать следующая функция.</li>
7 </ul><p>На скриншотах стоит обратить внимание на то, когда запускаются задачи. В параллельном выполнении Gulp показывает одновременный запуск всех задач, а при использовании функции series() выполнение новой задачи стартует только после окончания выполнения предыдущей.</p>
7 </ul><p>На скриншотах стоит обратить внимание на то, когда запускаются задачи. В параллельном выполнении Gulp показывает одновременный запуск всех задач, а при использовании функции series() выполнение новой задачи стартует только после окончания выполнения предыдущей.</p>
8 <h2>src() и dest()</h2>
8 <h2>src() и dest()</h2>
9 <p>Многие задачи при работе с<em>Gulp</em>связаны с обработкой файлов. Будь то SASS, Pug или иной инструмент, все их необходимо обработать в формат, который понимает браузер. Для этого необходимо указать, какой файл будет обработан и куда его нужно переместить после обработки. За это, в<em>Gulp</em>отвечают две функции:</p>
9 <p>Многие задачи при работе с<em>Gulp</em>связаны с обработкой файлов. Будь то SASS, Pug или иной инструмент, все их необходимо обработать в формат, который понимает браузер. Для этого необходимо указать, какой файл будет обработан и куда его нужно переместить после обработки. За это, в<em>Gulp</em>отвечают две функции:</p>
10 <ul><li>src() для указания пути к<em>обрабатываемому</em>файлу</li>
10 <ul><li>src() для указания пути к<em>обрабатываемому</em>файлу</li>
11 <li>dest() для указания пути, куда необходимо положить<em>обработанный</em>файл</li>
11 <li>dest() для указания пути, куда необходимо положить<em>обработанный</em>файл</li>
12 </ul><p>Особых неожиданностей здесь нет. Эти функции отвечают за обработку путей к файлам и базовому взаимодействию. На самом деле они намного гибче, чем может показаться с самого начала, но остальной функционал используется крайне редко и в больших проектах, например кеширование. Посмотрите на базовый пример операции по копированию файла:</p>
12 </ul><p>Особых неожиданностей здесь нет. Эти функции отвечают за обработку путей к файлам и базовому взаимодействию. На самом деле они намного гибче, чем может показаться с самого начала, но остальной функционал используется крайне редко и в больших проектах, например кеширование. Посмотрите на базовый пример операции по копированию файла:</p>
13 <p>После выполнения задачи файл<em>src/sass/app.scss</em>будет скопирован в директорию<em>build/styles/</em></p>
13 <p>После выполнения задачи файл<em>src/sass/app.scss</em>будет скопирован в директорию<em>build/styles/</em></p>
14 <p>layout-project/ ├── build/ │ ├── styles/ │ │ └── app.scss ├── src/ │ ├── sass/ │ │ └── app.scss │ ├── pages/ │ │ ├── index.pug │ │ ├── sections/ │ │ │ ├── head.pug │ │ │ └── footer.pug ├── gulpfile.js ├── package.json └── node_modules/</p>
14 <p>layout-project/ ├── build/ │ ├── styles/ │ │ └── app.scss ├── src/ │ ├── sass/ │ │ └── app.scss │ ├── pages/ │ │ ├── index.pug │ │ ├── sections/ │ │ │ ├── head.pug │ │ │ └── footer.pug ├── gulpfile.js ├── package.json └── node_modules/</p>
15 <p>Сейчас он там не нужен, так как в директорию<em>build</em>попадут уже обработанные файлы, но теперь вы знаете, каким именно способом они туда попадут :)</p>
15 <p>Сейчас он там не нужен, так как в директорию<em>build</em>попадут уже обработанные файлы, но теперь вы знаете, каким именно способом они туда попадут :)</p>
16 <p>Обратите внимание, что в примере не вызывается функция done(), как было в прошлых примерах. Это связано с тем, что мы указали ключевое слово return. Подробнее о ключевом слове return вы могли прочитать в курсе введения в программирование.</p>
16 <p>Обратите внимание, что в примере не вызывается функция done(), как было в прошлых примерах. Это связано с тем, что мы указали ключевое слово return. Подробнее о ключевом слове return вы могли прочитать в курсе введения в программирование.</p>
17 <h3>Globs</h3>
17 <h3>Globs</h3>
18 <p>В примере выше был указан чёткий путь к файлу, который мы хотим скопировать. Для небольших проектов это может быть достаточно простым и эффективным решением, но, зачастую необходимо обработать не один, а все файлы из определённой директории или даже дерева директорий. К примеру, у нас возможна вот такая структура стилей:</p>
18 <p>В примере выше был указан чёткий путь к файлу, который мы хотим скопировать. Для небольших проектов это может быть достаточно простым и эффективным решением, но, зачастую необходимо обработать не один, а все файлы из определённой директории или даже дерева директорий. К примеру, у нас возможна вот такая структура стилей:</p>
19 <p>layout-project/ ├── src/ │ ├── sass/ │ │ ├── global.scss │ │ ├── mobile.scss │ │ ├── desktop.scss</p>
19 <p>layout-project/ ├── src/ │ ├── sass/ │ │ ├── global.scss │ │ ├── mobile.scss │ │ ├── desktop.scss</p>
20 <p>Как корректно обработать три этих файла? Есть два варианта:</p>
20 <p>Как корректно обработать три этих файла? Есть два варианта:</p>
21 <ol><li>Обработать каждый файл в отдельности</li>
21 <ol><li>Обработать каждый файл в отдельности</li>
22 <li>Обработать все файлы внутри одной функции</li>
22 <li>Обработать все файлы внутри одной функции</li>
23 </ol><p>С первым вариантом всё просто - создаём три функции, объединяем их в единую задачу и выполняем:</p>
23 </ol><p>С первым вариантом всё просто - создаём три функции, объединяем их в единую задачу и выполняем:</p>
24 <p>Если всего файла три, то такое решение можно считать нормальным, но не хорошим. Ведь над каждым файлом производится одинаковая операция, а меняется только сам обрабатываемый файл.</p>
24 <p>Если всего файла три, то такое решение можно считать нормальным, но не хорошим. Ведь над каждым файлом производится одинаковая операция, а меняется только сам обрабатываемый файл.</p>
25 <p>Для указания нескольких файлов используются специальные шаблоны путей -<em>Globs</em>. Это небольшой пакет, который преобразует шаблоны в пути и по умолчанию встроен в<em>Gulp</em>. Достаточно изучить пару приёмов, с помощью которых вы сможете выбирать почти любые файлы и в любом количестве.</p>
25 <p>Для указания нескольких файлов используются специальные шаблоны путей -<em>Globs</em>. Это небольшой пакет, который преобразует шаблоны в пути и по умолчанию встроен в<em>Gulp</em>. Достаточно изучить пару приёмов, с помощью которых вы сможете выбирать почти любые файлы и в любом количестве.</p>
26 <p>Первая конструкция - использование звёздочки *, она указывает на то, что надо выбрать всё, что не противоречит указанному в пути. Например, мы можем заменить звёздочкой имя файла в последнем примере и, тогда,<em>Gulp</em>выберет все три файла:<em>global.scss</em>,<em>mobile.scss</em>и<em>desktop.scss</em></p>
26 <p>Первая конструкция - использование звёздочки *, она указывает на то, что надо выбрать всё, что не противоречит указанному в пути. Например, мы можем заменить звёздочкой имя файла в последнем примере и, тогда,<em>Gulp</em>выберет все три файла:<em>global.scss</em>,<em>mobile.scss</em>и<em>desktop.scss</em></p>
27 <p>Можно ещё больше упростить процесс копирования файлов. Предположим, что SASS файлы находятся в совершенно разных директориях, а мы хотим сложить их в единую. Необходимо пройтись по всем доступным директориям, проверить наличие там файла с расширением scss/sass и скопировать. Для этого используется специальная конструкция **, которая нацелена на проход по директориям. Например, можно видоизменить код следующим образом:</p>
27 <p>Можно ещё больше упростить процесс копирования файлов. Предположим, что SASS файлы находятся в совершенно разных директориях, а мы хотим сложить их в единую. Необходимо пройтись по всем доступным директориям, проверить наличие там файла с расширением scss/sass и скопировать. Для этого используется специальная конструкция **, которая нацелена на проход по директориям. Например, можно видоизменить код следующим образом:</p>
28 <p>Теперь при запуске задачи будут проверены все директории внутри<em>src</em>на предмет наличия файла с расширением<em>.scss</em>. Здесь важно отметить, поиск будет производиться не только внутри поддиректорий<em>src</em>, но и в самой директории<em>src</em>. Например будут выбраны следующие файлы:</p>
28 <p>Теперь при запуске задачи будут проверены все директории внутри<em>src</em>на предмет наличия файла с расширением<em>.scss</em>. Здесь важно отметить, поиск будет производиться не только внутри поддиректорий<em>src</em>, но и в самой директории<em>src</em>. Например будут выбраны следующие файлы:</p>
29 <ul><li><em>src/styles.scss</em></li>
29 <ul><li><em>src/styles.scss</em></li>
30 <li><em>src/project/app/styles/app.scss</em></li>
30 <li><em>src/project/app/styles/app.scss</em></li>
31 <li><em>src/sass/mobile.scss</em></li>
31 <li><em>src/sass/mobile.scss</em></li>
32 </ul><p>и так далее.</p>
32 </ul><p>и так далее.</p>
33 <p><strong>Важно:</strong>при использовании метода с поиском файлов в различных директориях, при их переносе с помощью функции dest()<em>Gulp</em>сохраняет ту вложенность, которая была. Например, при выполнении прошлого примера файл<em>src/project/app/styles/app.scss</em>окажется по пути<em>build/styles/project/app/styles/app.scss</em>. Это важная особенность, которую стоит помнить для избежания ошибок при работе с проектом.</p>
33 <p><strong>Важно:</strong>при использовании метода с поиском файлов в различных директориях, при их переносе с помощью функции dest()<em>Gulp</em>сохраняет ту вложенность, которая была. Например, при выполнении прошлого примера файл<em>src/project/app/styles/app.scss</em>окажется по пути<em>build/styles/project/app/styles/app.scss</em>. Это важная особенность, которую стоит помнить для избежания ошибок при работе с проектом.</p>
34 <p>Это отлично работает, но есть одна существенная проблема - внутри нашего<em>src</em>могут находиться директории, из которых нет необходимости обрабатывать файлы. Например, директории с npm-пакетами. Чтобы уйти от этой проблемы в<em>Globs</em>существует метод исключения директорий, который указывается через знак логического отрицания !. В таком случае нужные пути и исключаемые указываются в виде массива строк. Исключим из копирования директорию<em>src/project</em>:</p>
34 <p>Это отлично работает, но есть одна существенная проблема - внутри нашего<em>src</em>могут находиться директории, из которых нет необходимости обрабатывать файлы. Например, директории с npm-пакетами. Чтобы уйти от этой проблемы в<em>Globs</em>существует метод исключения директорий, который указывается через знак логического отрицания !. В таком случае нужные пути и исключаемые указываются в виде массива строк. Исключим из копирования директорию<em>src/project</em>:</p>
35 <p>Важно обратить внимание, что в конце исключаемой директории стоят символы /**. Они говорят о том, что необходимо исключить не только саму директорию, но и все вложенные в неё.</p>
35 <p>Важно обратить внимание, что в конце исключаемой директории стоят символы /**. Они говорят о том, что необходимо исключить не только саму директорию, но и все вложенные в неё.</p>
36 <h2>Pipe()</h2>
36 <h2>Pipe()</h2>
37 <p>При просмотре последних примеров может возникнуть вопрос: "Что за pipe?". Перейдём к этому методу:</p>
37 <p>При просмотре последних примеров может возникнуть вопрос: "Что за pipe?". Перейдём к этому методу:</p>
38 <p>Если не вдаваться в тонкие подробности, то pipe() позволяет связывать потоки чтения и записи друг с другом. Если вернуться к примеру с копированием файлов, то именно с помощью pipe() появляется возможность получить файл и отдать его для последующей обработки функции dest().</p>
38 <p>Если не вдаваться в тонкие подробности, то pipe() позволяет связывать потоки чтения и записи друг с другом. Если вернуться к примеру с копированием файлов, то именно с помощью pipe() появляется возможность получить файл и отдать его для последующей обработки функции dest().</p>
39 <p>Так же будет происходить и при обработке файлов с помощью плагинов, например при компиляции SASS в CSS. Чтобы связать всю цепочку одновременно необходимо использовать pipe().</p>
39 <p>Так же будет происходить и при обработке файлов с помощью плагинов, например при компиляции SASS в CSS. Чтобы связать всю цепочку одновременно необходимо использовать pipe().</p>
40 <p>В контексте работы с пакетом<em>Gulp</em>можно выстроить типичную цепочку, или шаблон, задачи:</p>
40 <p>В контексте работы с пакетом<em>Gulp</em>можно выстроить типичную цепочку, или шаблон, задачи:</p>
41  
41