├── .gitignore
├── 01_technologies.md
├── 02_requirements.md
├── 03_installation.md
├── 04_tasks.md
├── 05_structure.md
├── 06_libraries.md
├── 07_images.md
├── 08_templates.md
├── 09_styles.md
├── 10_scripts.md
├── 11_resources.md
├── 13_pixel-perfect.md
├── 15_metatags.md
├── 16_codestyle-pug.md
├── 17_codestyle-scss.md
├── 18_codestyle-javascript.md
├── 19_video-js.md
├── 20_hls.md
├── 21_bem.md
├── 22_crossbrowser-adaptive.md
├── 23_perfomance.md
├── 24_git.md
├── 25_checklist.md
├── 26_short-checklist.md
├── 27_validation.md
├── 28_dynamic-share-for-spa.md
├── 29_helpers.md
├── README.md
└── images
├── 14
├── 960-grid-system.jpg
├── example-1.jpg
├── example-10.jpg
├── example-11.jpg
├── example-12.jpg
├── example-2.jpg
├── example-3.jpg
├── example-4.jpg
├── example-5.jpg
├── example-6.jpg
├── example-7.jpg
├── example-8.jpg
└── example-9.jpg
├── 19
├── image-1.jpg
├── image-2.jpg
└── image-3.jpg
└── 29
├── safe-areas-error.png
├── safe-areas-success.png
└── safe-areas.png
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | .DS_Store
3 |
--------------------------------------------------------------------------------
/01_technologies.md:
--------------------------------------------------------------------------------
1 | # Основные возможности и используемые технологии
2 |
3 | * Система сборки [Gulp](https://gulpjs.com/)
4 | * Оптимизация изображений.
5 | * Генерация PNG- и SVG-спрайтов.
6 | * Шаблонизация с помощью [Pug](https://pugjs.org/).
7 | * CSS-препроцессор [SCSS](http://sass-lang.com/) и [Autoprefixer](https://autoprefixer.github.io/ru/).
8 | * ES6 и [jQuery](https://jquery.com/).
9 | * Встроенное определение устройства, браузера и операционной системы пользователя.
10 | * Проверка кода линтерами ([pug-lint](https://www.npmjs.com/package/pug-lint), [stylelint](https://stylelint.io/), [ESLint](http://eslint.org/)).
11 | * [Browsersync](https://www.browsersync.io/), автоматическое обновление страницы при разработке.
12 | * Возможность быстро создать архив проекта.
13 | * Множество дополнительных параметров сборки.
14 |
--------------------------------------------------------------------------------
/02_requirements.md:
--------------------------------------------------------------------------------
1 | # Минимальные требования
2 |
3 | * node >= 9.5.0
4 | * npm >= 5.6.0
5 | * gulp >= 4.0.0
6 | * gulp-cli >= 2.0.1
7 |
8 | [Ссылка на инструкцию по переходу с gulp 3 на gulp 4](https://demisx.github.io/gulp4/2015/01/15/install-gulp4.html).
9 |
--------------------------------------------------------------------------------
/03_installation.md:
--------------------------------------------------------------------------------
1 | # Начало работы
2 |
3 | Для установки рекомендуется использовать [Yeoman](http://yeoman.io/):
4 |
5 | ```bash
6 | npm install -g yo
7 | ```
8 |
9 | После yeoman, необходимо установить шаблон самой сборки:
10 |
11 | ```bash
12 | npm install -g generator-ninelines-template
13 | ```
14 |
15 | Теперь находясь в пустой папке с проектом выполняем команду:
16 |
17 | ```bash
18 | yo ninelines-template
19 | ```
20 |
21 | Генератор задаст несколько вопросов:
22 |
23 | - Название проекта (по умолчанию — название папки проекта).
24 | - Описание проекта.
25 | - Запустить ли `npm install` (по умолчанию — да). Если пропустить установку npm-пакетов, то перед началом работы над проектом необходимо самостоятельно запустить `npm install`.
26 |
27 | Теперь можно запустить `gulp` и приступить к работе.
28 |
--------------------------------------------------------------------------------
/04_tasks.md:
--------------------------------------------------------------------------------
1 | # Gulp-задачи
2 |
3 | * `default` — основная задача, запускает `build`, `watch` и `serve`.
4 | * `build` — сборка всех файлов, запускает задачи `copy`, `images`, `sprites:png`, `sprites:svg`, `pug`, `scss`, `js`.
5 | * `watch` — запускает слежение за файлами, так что при изменении они автоматически пересобираются.
6 | * `serve` — запускает сервер Browsersync.
7 | * `pug` — запускает сборку Pug-шаблонов.
8 | * `images` — запускает сборку изображений.
9 | * `sprites:png` — запускает генерацию PNG-спрайтов.
10 | * `sprites:svg` — запускает генерацию SVG-спрайтов.
11 | * `scss` — запускает сборку стилей.
12 | * `js` — запускает сборку скриптов.
13 | * `copy` — запускает сборку дополнительных ресурсов.
14 | * `lint` — последовательно запускает линтеры `lint:js`, `lint:pug`, `lint:scss`.
15 | * `lint:js` — проверяет JavaScript-файлы линтером [ESLint](http://eslint.org/).
16 | * `lint:pug` — проверяет Pug-файлы линтером [pug-lint](https://github.com/pugjs/pug-lint).
17 | * `lint:scss` — проверяет SCSS-файлы линтером [stylelint](https://stylelint.io/).
18 | * `optimize:svg` — оптимизирует и форматирует код SVG-файлов в папке `src/images`.
19 | * `optimize:images` — оптимизирует изображения в папке `src/images`.
20 | * `zip` — создает архив проекта.
21 |
22 | ## Дополнительные параметры:
23 |
24 | * `--ci` — включает режим CI (`--no-cache --no-notify --no-open --throw-errors`).
25 | * `--fix` — автоматически исправляет ошибки при проверке кода линтером (только для `lint:js`).
26 | * `--minify` — включает минификацию файлов (только для `sprites:svg`, `pug`, `scss` и `js`).
27 | * `--minify-html` — включает минификацию HTML-файлов (имеет приоритет перед `--minify`).
28 | * `--minify-css` — включает минификацию CSS-файлов (имеет приоритет перед `--minify`).
29 | * `--minify-js` — включает минификацию JS-файлов (имеет приоритет перед `--minify`).
30 | * `--minify-svg` — включает минификацию SVG-файлов (имеет приоритет перед `--minify`).
31 | * `--no-cache` — отключает кэширование (только для `copy`, `images` и `pug`).
32 | * `--no-debug` — отключает отладочный вывод списка обрабатываемых файлов.
33 | * `--no-notify` — отключает уведомления об ошибках.
34 | * `--no-open` — отключает автоматический запуск браузера (только для `serve`).
35 | * `--port` — задает порт сервера (только для `serve`).
36 | * `--spa` — включает режим одностраничного приложения (только для `serve`).
37 | * `--throw-errors` — прерывает сборку при возникновении ошибки.
38 |
--------------------------------------------------------------------------------
/05_structure.md:
--------------------------------------------------------------------------------
1 | # Структура папок и файлов
2 |
3 | ```text
4 | ninelines-template
5 | ├── src
6 | │ ├── images
7 | │ │ └── sprites
8 | │ │ ├── png
9 | │ │ │ └── .keep
10 | │ │ └── svg
11 | │ │ └── .keep
12 | │ ├── js
13 | │ │ ├── vendor
14 | │ │ │ └── .keep
15 | │ │ ├── main.js
16 | │ │ └── vendor.js
17 | │ ├── pug
18 | │ │ ├── mixins
19 | │ │ │ └── svg.pug
20 | │ │ ├── base.pug
21 | │ │ └── mixins.pug
22 | │ ├── resources
23 | │ │ └── fonts
24 | │ │ └── .keep
25 | │ ├── scss
26 | │ │ ├── functions
27 | │ │ │ └── _sprites.scss
28 | │ │ ├── mixins
29 | │ │ │ ├── _clearfix.scss
30 | │ │ │ ├── _retina.scss
31 | │ │ │ ├── _sprites.scss
32 | │ │ │ ├── _triangle.scss
33 | │ │ │ └── _visually-hidden.scss
34 | │ │ ├── vendor
35 | │ │ │ └── .keep
36 | │ │ ├── _base.scss
37 | │ │ ├── _fonts.scss
38 | │ │ ├── _functions.scss
39 | │ │ ├── _mixins.scss
40 | │ │ ├── _sprites.hbs
41 | │ │ ├── _sprites.scss
42 | │ │ ├── _variables.scss
43 | │ │ ├── _vendor.scss
44 | │ │ └── main.scss
45 | │ └── index.pug
46 | ├── .babelrc
47 | ├── .editorconfig
48 | ├── .eslintignore
49 | ├── .eslintrc
50 | ├── .gitignore
51 | ├── .npmrc
52 | ├── .pug-lintrc.json
53 | ├── .stylelintignore
54 | ├── .stylelintrc
55 | ├── gulpfile.js
56 | ├── package.json
57 | ├── README.md
58 | └── webpack.config.js
59 | ```
60 |
61 | ## `src`
62 |
63 | В папке `src` хранятся исходные файлы проекта.
64 |
65 | ## `src/images`
66 |
67 | Папка `images` предназначена для хранения изображений.
68 | При сборке файлы из данной папки попадают в `build/images`.
69 |
70 | ## `src/images/sprites`
71 |
72 | Папка `src/images/sprites` предназначена для хранения векторных (SVG) и растровых (PNG) иконок.
73 |
74 | ## `src/images/sprites/png`
75 |
76 | Папка `src/images/sprites/png` предназначена для хранения растровых иконок.
77 | При сборке файлы из данной папки объединяются в два спрайта: `build/images/sprites.png` и `build/images/sprites@2x.png`.
78 |
79 | ## `src/images/sprites/svg`
80 |
81 | Папка `src/images/sprites/svg` предназначена для хранения векторных иконок.
82 | При сборке файлы из данной папки объединяются в один спрайт: `build/images/sprites.svg`.
83 |
84 | ## `src/js`
85 |
86 | Папка `src/js` предназначена для хранения скриптов.
87 |
88 | ## `src/js/vendor`
89 |
90 | Папка `src/js/vendor` предназначена для хранения скриптов сторонних библиотек, которых нет в репозитории npm.
91 |
92 | ## `src/js/main.js`
93 |
94 | Файл `src/js/main.js` предназначен для хранения основной логики сайта.
95 | При сборке данный файл попадает в `build/js`.
96 |
97 | ## `src/js/vendor.js`
98 |
99 | Файл `src/js/vendor.js` предназначен для подключения сторонних библиотек.
100 |
101 | При сборке данный файл попадет в `build/js`.
102 |
103 | ## `src/pug`
104 |
105 | Папка `src/pug` предназначена для хранения шаблонов.
106 |
107 | ## `src/pug/mixins`
108 |
109 | Папка `src/pug/mixins` предназначена для хранения Pug-миксин.
110 |
111 | ## `src/pug/base.pug`
112 |
113 | В файле `src/pug/base.pug` хранится базовый шаблон страниц сайта.
114 |
115 | ## `src/pug/mixins.pug`
116 |
117 | Файл `src/pug/mixins.pug` предназначен для подключения Pug-миксин из папки `src/pug/mixins`.
118 |
119 | ## `src/resources`
120 |
121 | Папка `src/resources` предназначена для хранения различных файлов проекта.
122 | При сборке файлы из данной папки попадают в `build`.
123 |
124 | ## `src/resources/fonts`
125 |
126 | Папка `src/resources/fonts` предназначена для хранения шрифтов.
127 | При сборке файлы из данной папки попадают в `build/fonts`.
128 |
129 | ## `src/scss`
130 |
131 | Папка `src/scss` предназначена для хранения стилей.
132 |
133 | ## `src/scss/functions`
134 |
135 | Папка `src/scss/functions` предназначена для хранения SCSS-функций.
136 |
137 | ## `src/scss/mixins`
138 |
139 | Папка `src/scss/mixins` предназначена для хранения SCSS-миксин.
140 |
141 | ## `src/scss/vendor`
142 |
143 | Папка `src/scss/vendor` предназначена для хранения стилей сторонних библиотек, которых нет в репозитории npm.
144 |
145 | ## `src/scss/_base.scss`
146 |
147 | Файл `src/scss/_base.scss` предназначен для хранения базовых стилей.
148 |
149 | ## `src/scss/_fonts.scss`
150 |
151 | Файл `src/scss/_fonts.scss` предназначен для подключения шрифтов.
152 |
153 | ## `src/scss/_functions.scss`
154 |
155 | Файл `src/scss/_functions.scss` предназначен для подключения функций из папки `src/scss/functions`.
156 |
157 | ## `src/scss/_mixins.scss`
158 |
159 | Файл `src/scss/_mixins.scss` предназначен для подключения миксин из папки `src/scss/mixins`.
160 |
161 | ## `src/scss/_sprites.hbs`
162 |
163 | `src/scss/_sprites.hbs` — шаблон, на основе которого генерируется содержимое файла `src/scss/_sprites.scss`.
164 |
165 | ## `src/scss/_sprites.scss`
166 |
167 | Файл `src/scss/_sprites.scss` предназначен для работы с PNG-спрайтами.
168 | Содержимое данного файла автоматически генерируется на основе шаблона `src/scss/_sprites.hbs` и иконок из папки `src/images/sprites/png`.
169 |
170 | ## `src/scss/_variables.scss`
171 |
172 | Файл `src/scss/_variables.scss` предназначен для хранения SCSS-переменных.
173 |
174 | ## `src/scss/_vendor.scss`
175 |
176 | Файл `src/scss/_vendor.scss` предназначен для подключения стилей сторонних библиотек.
177 |
178 | ## `src/scss/main.scss`
179 |
180 | Файл `src/scss/main.scss` предназначен для хранения основных стилей сайта.
181 | При сборке данный файл преобразуется в CSS и сохраняется в `build/css` вместе с файлом `main.css.map`.
182 |
183 | ## `src/index.pug`
184 |
185 | `src/index.pug` — шаблон главной страницы.
186 | При сборке все Pug-файлы из папки `src` преобразуются в HTML и сохраняются в `build`.
187 |
188 | ## `.babelrc`
189 |
190 | `.babelrc` — файл настроек JavaScript-транспайлера Babel.
191 |
192 | ## `.editorconfig`
193 |
194 | `.editorconfig` — файл настроек редактора.
195 |
196 | ## `.eslintignore`
197 |
198 | `.eslintignore` — файл настроек ESLint для игнорирования файлов.
199 |
200 | ## `.eslintrc`
201 |
202 | `.eslintrc` — файл настроек ESLint.
203 |
204 | ## `.gitignore`
205 |
206 | `.gitignore` — файл настроек Git для игнорирования файлов.
207 |
208 | ## `.npmrc`
209 |
210 | `.npmrc` — файл настроек npm.
211 |
212 | ## `.pug-lintrc.json`
213 |
214 | `.pug-lintrc.json` — файл настроек pug-lint.
215 |
216 | ## `.stylelintignore`
217 |
218 | `.stylelintignore` — файл настроек stylelint для игнорирования файлов.
219 |
220 | ## `.stylelintrc`
221 |
222 | `.stylelintrc` — файл настроек stylelint.
223 |
224 | ## `gulpfile.js`
225 |
226 | `gulpfile.js` — основной файл сборки, содержащий Gulp-задачи.
227 |
228 | ## `package.json`
229 |
230 | `package.json` — файл, содержащий базовую информацию о проекте и список требуемых библиотек.
231 |
232 | ## `README.md`
233 |
234 | `README.md` — описание проекта.
235 |
236 | ## `webpack.config.js`
237 |
238 | `webpack.config.js` — файл настроек webpack.
239 |
--------------------------------------------------------------------------------
/06_libraries.md:
--------------------------------------------------------------------------------
1 | # Подключение сторонних библиотек
2 |
3 | Библиотеки подключаются с помощью npm.
4 | При установке следует указывать ключ `--save` или `--save-dev`.
5 |
6 | Пример:
7 |
8 | ```bash
9 | npm install --save jquery
10 | npm install --save-dev gulp
11 | ```
12 |
13 | `--save` указывается для библиотек, код которых попадает в итоговую сборку (папку `build`) и будет использоваться на сайте.
14 |
15 | `--save-dev` указывается для библиотек, которые используются только для сборки.
16 |
17 | После установки необходимо подключить нужные файлы библиотеки:
18 |
19 | * скрипты — в `src/js/vendor.js` или `src/js/main.js`.
20 | * стили — в `src/scss/_vendor.scss`.
21 | * изображения — в `src/images`.
22 | * любые другие файлы — в `src/resources`.
23 |
24 | Полный пример, описывающий установку библиотеки fancybox:
25 |
26 | 1. Установка:
27 |
28 | ```bash
29 | npm install --save fancybox
30 | ```
31 |
32 | 2. Подключение скриптов в файл `src/js/vendor.js`:
33 |
34 | ```js
35 | import 'fancybox';
36 | ```
37 |
38 | 3. Подключение стилей в файл `src/scss/_vendor.scss`:
39 |
40 | ```scss
41 | $fancybox-image-url: "../images";
42 |
43 | @import "../../node_modules/fancybox/dist/scss/jquery.fancybox";
44 | ```
45 |
46 | 4. Копирование изображений в `src/images`:
47 |
48 | ```text
49 | ninelines-template
50 | └── src
51 | ├── images
52 | │ ├── blank.gif
53 | │ ├── fancybox_loading.gif
54 | │ ├── fancybox_loading@2x.gif
55 | │ ├── fancybox_overlay.png
56 | │ ├── fancybox_sprite.png
57 | │ ├── fancybox_sprite@2x.png
58 | │ └── ...
59 | └── ...
60 | ```
61 |
62 | Если библиотека отсутствует в npm, либо её нужно модифицировать, то файлы следует скачать и закинуть в папки `src/js/vendor` и `src/scss/vendor`.
63 |
--------------------------------------------------------------------------------
/07_images.md:
--------------------------------------------------------------------------------
1 | # Работа с изображениями
2 |
3 | Изображения следует хранить в папке `src/images`.
4 | При запуске задачи `images` файлы из папки `src/images` копируются в `build/images`.
5 |
6 | ```text
7 | ninelines-template
8 | ├── build
9 | │ └── images
10 | └── src
11 | └── images
12 | ```
13 |
14 | Для оптимизации изображений можно использовать задачу `optimize:images`.
15 |
16 | > `optimize:images` оптимизирует только исходные файлы из папки `src/images`!
17 |
18 | Предварительно оптимизированные изображения рекомендуется хранить в папке `src/resources/images`.
19 | В таком случае при запуске задачи `optimize:images` данные файлы не будут затронуты.
20 |
21 | ```text
22 | ninelines-template
23 | └── src
24 | └── resources
25 | └── images
26 | ```
27 |
28 | ## Работа с PNG-спрайтами
29 |
30 | Работа с PNG-спрайтами строится следующим образом:
31 |
32 | 1. Берем две версии иконки — обычную и retina (увеличенную в два раза).
33 | Сохраняем в `src/images/sprites/png`:
34 |
35 | ```text
36 | ninelines-template
37 | └── src
38 | └── images
39 | └── sprites
40 | └── png
41 | ├── phone.png
42 | └── phone@2x.png
43 | ```
44 |
45 | 2. Запускаем задачу `sprites:png` (если уже запущен `gulp watch` или `gulp`, то данный шаг можно пропустить):
46 |
47 | ```bash
48 | gulp sprites:png
49 | ```
50 |
51 | 3. Генератор оптимизирует и объединяет иконки в спрайты:
52 |
53 | ```text
54 | ninelines-template
55 | └── build
56 | └── images
57 | ├── sprites.png
58 | └── sprites@2x.png
59 | ```
60 |
61 | На основе предзаданного шаблона `src/scss/_sprites.hbs` генерируется файл `src/scss/_sprites.scss`, содержащий вспомогательную информацию о получившихся спрайтах:
62 |
63 | ```text
64 | ninelines-template
65 | └── src
66 | └── scss
67 | ├── _sprites.hbs
68 | └── _sprites.scss
69 | ```
70 |
71 | Для каждой иконки создается CSS-класс в формате `.sprite-[name]`.
72 | В нашем случае получим класс `.sprite-phone`.
73 |
74 | В сборке также содержится ряд SCSS-функций и миксин для работы со спрайтами.
75 |
76 | `src/scss/functions/_sprites.scss`:
77 |
78 | ```scss
79 | @function sprite($name, $size: normal) { /* ... */ }
80 | @function sprite-width($name, $size: normal) { /* ... */ }
81 | @function sprite-height($name, $size: normal) { /* ... */ }
82 | @function sprite-image($name, $size: normal) { /* ... */ }
83 | @function sprite-x($name, $size: normal) { /* ... */ }
84 | @function sprite-y($name, $size: normal) { /* ... */ }
85 | @function sprite-total-width($name, $size: normal) { /* ... */ }
86 | @function sprite-total-height($name, $size: normal) { /* ... */ }
87 | ```
88 |
89 | `src/scss/mixins/_srites.scss`:
90 |
91 | ```scss
92 | @mixin sprite-width($name, $size: normal) { /* ... */ }
93 | @mixin sprite-height($name, $size: normal) { /* ... */ }
94 | @mixin sprite-background-image($name, $size: normal) { /* ... */ }
95 | @mixin sprite-background-position($name, $size: normal) { /* ... */ }
96 | @mixin sprite-background-size($name, $size: normal) { /* ... */ }
97 | @mixin sprite-background($name, $size: normal) { /* ... */ }
98 | @mixin sprite($name) { /* ... */ }
99 | ```
100 |
101 | 4. Полученные спрайты можно использовать в Pug (с помощью классов):
102 |
103 | ```jade
104 | footer
105 | a(href="tel:+71234567890")
106 | span.sprite-phone
107 | | +7 (123) 456-78-90
108 | ```
109 |
110 | Или в SCSS (с помощью миксин):
111 |
112 | ```scss
113 | footer {
114 | a {
115 | &::before {
116 | @include sprite("phone");
117 |
118 | content: "";
119 | }
120 | }
121 | }
122 | ```
123 |
124 | ## Работа с SVG-спрайтами
125 |
126 | Принцип работы с SVG-спрайтами:
127 |
128 | 1. Получаем векторные иконки в формате `.svg` (либо заранее подготовленные, либо экспортируем с помощью редактора).
129 | Сохраняем в папку `src/images/sprites/svg`:
130 |
131 | ```text
132 | ninelines-template
133 | └── src
134 | └── images
135 | └── sprites
136 | └── svg
137 | └── phone.svg
138 | ```
139 |
140 | 2. Запускаем задачу `sprites:svg` (если уже запущен `gulp watch` или `gulp`, то данный шаг можно пропустить):
141 |
142 | ```bash
143 | gulp sprites:svg
144 | ```
145 |
146 | 3. Генератор оптимизирует и объединяет иконки в один спрайт:
147 |
148 | ```text
149 | ninelines-template
150 | └── build
151 | └── images
152 | └── sprites.svg
153 | ```
154 |
155 | В сборке содержится Pug-миксин для подключения SVG-спрайтов.
156 | `src/pug/mixins/svg.pug`:
157 |
158 | ```jade
159 | mixin svg(name)
160 | svg&attributes(attributes)
161 | use(xlink:href=`${baseDir}images/sprites.svg#${name}`)
162 | ```
163 |
164 | 4. Подключаем иконку в Pug:
165 |
166 | ```jade
167 | footer
168 | a(href="tel:+71234567890")
169 | +svg("phone")
170 | | +7 (123) 456-78-90
171 | ```
172 |
173 | При необходимости иконку можно стилизовать:
174 |
175 | ```scss
176 | footer {
177 | a {
178 | svg {
179 | display: inline-block;
180 | vertical-align: middle;
181 | width: 30px;
182 | height: 30px;
183 | fill: $color-black;
184 | }
185 | }
186 | }
187 | ```
188 |
189 | Если цвет заливки или обводки не удается изменить с помощью CSS, то необходимо открыть SVG-файл иконки в редакторе и удалить соответствующие атрибуты (`fill`, `stroke`) из кода.
190 |
191 | ## Избавляемся от обрезанных краев SVG-иконок
192 |
193 | 1. Общий пример:
194 |
195 | Шаг 1: исходная иконка без полей
196 | ```html
197 |
202 | ```
203 |
204 | Шаг 2: добавляем поле размером {padding}
205 | ```html
206 |
213 | ```
214 |
215 | Шаг 3: запускаем optimize:svg и получаем иконку без лишних трансформаций
216 | ```html
217 |
222 | ```
223 |
224 | 2. Конкретный пример:
225 |
226 | Шаг 1: исходная иконка без полей
227 | ```html
228 |
233 | ```
234 |
235 | Шаг 2: добавляем поле размером 1px
236 | ```html
237 |
244 | ```
245 |
246 | Шаг 3: запускаем optimize:svg и получаем иконку без лишних трансформаций
247 | ```html
248 |
253 | ```
254 |
--------------------------------------------------------------------------------
/08_templates.md:
--------------------------------------------------------------------------------
1 | # Работа с шаблонизатором Pug
2 |
3 | > При работе с шаблонизатором **важно** придерживаться установленных [правил по оформлению кода](16_codestyle-pug.md).
4 |
5 | В сборке используется шаблонизатор [Pug](https://pugjs.org/) (ранее назывался Jade).
6 |
7 | Pug предоставляет множество возможностей, упрощающих работу с шаблонами:
8 |
9 | * Переменные.
10 | * Циклы.
11 | * Условия.
12 | * Фильтры.
13 | * Наследование шаблонов.
14 | * Миксины.
15 |
16 | Шаблоны страниц размещаются в `src`, а дополнительные файлы и миксины в `src/pug`:
17 |
18 | ```text
19 | ninelines-template
20 | └── src
21 | ├── pug
22 | │ ├── mixins
23 | │ │ └── svg.pug
24 | │ ├── base.pug
25 | │ └── mixins.pug
26 | └── index.pug
27 | ```
28 |
29 | За сборку и преобразование Pug в HTML отвечает задача `pug`:
30 |
31 | ```bash
32 | gulp pug
33 | ```
34 |
35 | После выполнения команды в папке `build` появятся HTML-файлы:
36 |
37 | ```text
38 | ninelines-template
39 | └── build
40 | └── index.html
41 | ```
42 |
43 | ## Базовый шаблон и создание страниц
44 |
45 | В качестве базового шаблона используется `src/pug/base.pug`.
46 |
47 | Пример наследования и использования шаблона:
48 |
49 | ```jade
50 | extends pug/base
51 |
52 | block content
53 | // Содержимое страницы
54 | ```
55 |
56 | Базовый шаблон определяет блоки (участки кода или место в шаблоне), которые можно изменять и дополнять при наследовании.
57 |
58 | ### `vars`
59 |
60 | Блок `vars` хранит основные настройки шаблона:
61 |
62 | * `baseDir` — корневая директория сайта (по умолчанию `/`).
63 |
64 | * `title` — заголовок страницы (используется в `