Skip to content

Commit e7a924b

Browse files
committed
Replace gulp-svgmin and gulp-sharp-responsive with @firefoxic/conjure
1 parent b0ea11c commit e7a924b

File tree

10 files changed

+2169
-5195
lines changed

10 files changed

+2169
-5195
lines changed

.gitignore

+4-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ node_modules
22
build
33
.idea
44
.DS_Store
5-
raw/**/*.jpg
6-
raw/**/*.jpeg
7-
raw/**/*.png
8-
raw/**/*.svg
9-
!raw/**/README.md
5+
source/**/*.jpg
6+
source/**/*.jpeg
7+
source/**/*.png
8+
!source/favicons/**/*.png

README.md

+50-37
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Сборка для HTML-курсов в HTML Academy
22

3-
Сборка работает на gulp 4 версии
3+
Сборка работает на gulp 5 версии
44

55
## Начало
66

@@ -67,11 +67,8 @@
6767
│ └── workflows/ # Автоматизация для github actions
6868
│ ├── check.yml # Запускает линтеры на Гитхабе
6969
│ └── gh-pages.yml # Публикует проект и создаёт ссылку на проект
70-
├── raw/ # Папка для «сырых» файлов (игнорируются гитом)
71-
│ ├── icons/ # Папка для оригиналов svg-иконок
72-
│ └── images/ # Папка для оригиналов картинок
7370
├── source/ # Исходники проекта
74-
│ ├── favicons/ # Папка для фавиконок (кроме favicon.ico)
71+
│ ├── favicons/ # Папка для фавиконок (кроме favicon.ico, его в source переложить вручную)
7572
│ ├── fonts/ # Папка для шрифтов
7673
│ ├── icons/ # Папка для оптимизированных svg-иконок для преобразования их в спрайт (stack)
7774
│ ├── images/ # Папка для оптимизированных картинок
@@ -113,9 +110,10 @@
113110
- `npm run lint:bem` - проверяет правильное использование БЭМ в разметке
114111
- `npm run lint:styles` - проверяет проект на совместимость с stylelint
115112
- `npm run lint:scripts` - проверяет скрипты по правилам eslint
116-
- `npm run optimize` - запускает все оптимизации изображений (занимает длительное время):
117-
- `npm run optimize:raster` - оптимизирует растровые изображения из `raw/images/` в `source/images/`
118-
- `npm run optimize:vector` - оптимизирует векторные изображения из `raw/images/` в `source/images/`
113+
- `npm run optimize` - запускает все оптимизации изображений:
114+
- `npm run optimize:icons` - в `source/icons/` оптимизирует векторные иконки
115+
- `npm run optimize:images` - в `source/images/` оптимизирует векторыне и конвертирует растровые изображения (растровые оригиналы удаляются автоматически)
116+
- `npm run optimize:favicons` - в `source/favicons/` генерирует все необходимые варианты фавиконок, а также webmanifest (векторные оригиналы удаляются автоматически)
119117

120118
## Работа с разметкой
121119

@@ -177,38 +175,70 @@
177175

178176
## Работа с графикой
179177

180-
### Растр
178+
Во всех трёх ниже описанных случаях коммитить нужно оптимизированную графику.
181179

182-
Абсолютно всю растровую графику с **двухкратной плотностью** из макета складывайте в `raw/images/`. Здесь графика игнорируется гитом.
180+
### Изображения
183181

184-
После того как добавите графику сразу запускайте команду `npm run optimize:raster` (или просто `npm run optimize`) для оптимизации графики и создания `.webp`-версии. Команду нужно запускать один раз при появлении новой графики в проекте.
182+
Из макета всю растровую графику (только с **двухкратной плотностью**, но без суффикса плотности `@2x` в имени) и всю контентную векторную графику (логотип, графики, иллюстрации) складывайте в:
185183

186-
Новая оптимизированная графика с разной плотностью и суффиксами плотности в именах файлов появится в `source/images`. Эту, уже оптимизированную графику нужно коммитить.
184+
```shell
185+
└── source/
186+
└── images/
187+
```
188+
189+
Здесь растровая графика без суффикса плотности игнорируется гитом.
187190

188-
### Вектор
191+
Запуск команды `npm run optimize:images` оптимизирует векторную графику и конвертирует растровую в форматы `Webp` и `Avif` для двухкратной и однократной плотности пикселей с соответствующими суффиксами.
192+
193+
### Иконки
189194

190195
Векторную графику для спрайта (иконки) складывайте в:
191196

192197
```shell
193-
└── raw/
198+
└── source/
194199
└── icons/
195200
```
196201

197-
Контентную векторную графику (логотип, графики, иллюстрации) складывайте в:
202+
Запуск команды `npm run optimize:icons` оптимизирует все иконки.
203+
204+
### Фавиконки
205+
206+
Векторные фавиконки (все, что есть в макете) разместите в:
198207

199208
```shell
200-
└── raw/
201-
└── images/
209+
└── source/
210+
└── favicons/
202211
```
203212

204-
Запуск команды `npm run optimize:vector` поместит оптимизированные копии этих svg-файлов в соответствующие папки в исходниках:
213+
Имена исходных файлов должны быть такими:
205214

206215
```shell
207216
└── source/
208-
├── icons/
209-
└── images/
217+
└── favicons/
218+
├── 16.svg # Специальная версия размером 16×16. Добавляй её только при её наличии в макете.
219+
├── 32.svg # Основной вариант размером 32×32.
220+
└── touch.svg # Большая тач-иконка без скруглений и прозрачностей.
221+
```
222+
223+
Запуск команды `npm run optimize:favicons` сгенерирует все необходимые фавиконки и вебманифест. Кроме этого сгенерируется файл `Links.md` с кодом нужных тегов `link`. Заберите этот код в `head` разметки (md-файл после этого можно удалить).
224+
225+
Переместите `favicon.ico` и `manifest.webmanifest` в `source/`. Получится так:
226+
227+
```shell
228+
└── source/
229+
├── favicons/
230+
│ ├── icon-180.png
231+
│ ├── icon-192.png
232+
│ ├── icon-192.webp
233+
│ ├── icon-512.png
234+
│ ├── icon-512.webp
235+
│ └── icon.svg
236+
├── favicon.ico
237+
└── manifest.webmanifest
210238
```
211239

240+
По необходимости исправь пути в вебманифесте и тегах `link`.
241+
212242
### Сборка
213243

214244
При продакшен-сборке автоматизация перенесёт всю графику из `source/images/` в `build/images/`, а из иконок в `source/icons/` создаст спрайт `build/icons/stack.svg`.
@@ -227,23 +257,6 @@
227257
└── logo.svg
228258
```
229259

230-
### Фавиконки
231-
232-
Варианты фавиконок форматов PNG и SVG следует размещать в `source/favicons/`.
233-
234-
Файлы `favicon.ico` и `manifest.webmanifest` — в `source/`:
235-
236-
```shell
237-
└── source/
238-
├── favicons/
239-
│ ├── 180.png
240-
│ ├── 192.png
241-
│ ├── 512.png
242-
│ └── icon.svg
243-
├── favicon.ico
244-
└── manifest.webmanifest
245-
```
246-
247260
## Работа со шрифтами
248261

249262
Все шрифтовые файлы лежат в `source/fonts/`. Сборка переносит их в `build/fonts/`.

gulpfile.js

+5-43
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { readFileSync, rmSync } from 'node:fs';
22

3-
import gulp from 'gulp';
3+
import { src, dest, watch, series, parallel } from 'gulp';
44
import plumber from 'gulp-plumber';
55
import htmlmin from 'gulp-htmlmin';
66
import * as dartSass from 'sass';
@@ -10,24 +10,20 @@ import postUrl from 'postcss-url';
1010
import lightningcss from 'postcss-lightningcss';
1111
import { createGulpEsbuild } from 'gulp-esbuild';
1212
import browserslistToEsbuild from 'browserslist-to-esbuild';
13-
import sharp from 'gulp-sharp-responsive';
14-
import svgo from 'gulp-svgmin';
1513
import { stacksvg } from 'gulp-stacksvg';
1614
import server from 'browser-sync';
1715
import bemlinter from 'gulp-html-bemlinter';
1816

19-
const { src, dest, watch, series, parallel } = gulp;
2017
const sass = gulpSass(dartSass);
2118
const PATH_TO_SOURCE = './source/';
2219
const PATH_TO_DIST = './build/';
23-
const PATH_TO_RAW = './raw/';
2420
const PATHS_TO_STATIC = [
25-
`${PATH_TO_SOURCE}fonts/**/*.{woff2,woff}`,
2621
`${PATH_TO_SOURCE}*.ico`,
2722
`${PATH_TO_SOURCE}*.webmanifest`,
28-
`${PATH_TO_SOURCE}favicons/**/*.{png,svg}`,
23+
`${PATH_TO_SOURCE}favicons/**/*.{svg,png,webp}`,
24+
`${PATH_TO_SOURCE}fonts/**/*.woff2`,
25+
`${PATH_TO_SOURCE}images/**/*{svg,avif,webp}`,
2926
`${PATH_TO_SOURCE}vendor/**/*`,
30-
`${PATH_TO_SOURCE}images/**/*`,
3127
`!${PATH_TO_SOURCE}**/README.md`,
3228
];
3329
let isDevelopment = true;
@@ -90,48 +86,14 @@ export function processScripts () {
9086
.pipe(server.stream());
9187
}
9288

93-
export function optimizeRaster () {
94-
const RAW_DENSITY = 2;
95-
const TARGET_FORMATS = [undefined, 'webp']; // undefined — initial format: jpg or png
96-
97-
function createOptionsFormat() {
98-
const formats = [];
99-
100-
for (const format of TARGET_FORMATS) {
101-
for (let density = RAW_DENSITY; density > 0; density--) {
102-
formats.push(
103-
{
104-
format,
105-
rename: { suffix: `@${density}x` },
106-
width: ({ width }) => Math.ceil(width * density / RAW_DENSITY),
107-
jpegOptions: { progressive: true },
108-
},
109-
);
110-
}
111-
}
112-
113-
return { formats };
114-
}
115-
116-
return src(`${PATH_TO_RAW}images/**/*.{png,jpg,jpeg}`)
117-
.pipe(sharp(createOptionsFormat()))
118-
.pipe(dest(`${PATH_TO_SOURCE}images`));
119-
}
120-
121-
export function optimizeVector () {
122-
return src([`${PATH_TO_RAW}**/*.svg`])
123-
.pipe(svgo())
124-
.pipe(dest(PATH_TO_SOURCE));
125-
}
126-
12789
export function createStack () {
12890
return src(`${PATH_TO_SOURCE}icons/**/*.svg`)
12991
.pipe(stacksvg())
13092
.pipe(dest(`${PATH_TO_DIST}icons`));
13193
}
13294

13395
export function copyStatic () {
134-
return src(PATHS_TO_STATIC, { base: PATH_TO_SOURCE })
96+
return src(PATHS_TO_STATIC, { base: PATH_TO_SOURCE, encoding: false })
13597
.pipe(dest(PATH_TO_DIST));
13698
}
13799

0 commit comments

Comments
 (0)