0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Третий проект в программе "<a>Фронтенд-разработчик</a>" - это первое настоящее фронтенд-приложение. Настройка окружения тут немного сложнее, чем в случае первых двух проектов, где надо было написать консольные утилиты.</p>
1
<p>Третий проект в программе "<a>Фронтенд-разработчик</a>" - это первое настоящее фронтенд-приложение. Настройка окружения тут немного сложнее, чем в случае первых двух проектов, где надо было написать консольные утилиты.</p>
2
<p>Хекслет предлагает очень простой способ сделать это. Собственно, когда система подготовит на вашем Гитхабе репозиторий, первый шаг проекта будет заключаться в следующем:</p>
2
<p>Хекслет предлагает очень простой способ сделать это. Собственно, когда система подготовит на вашем Гитхабе репозиторий, первый шаг проекта будет заключаться в следующем:</p>
3
<ol><li>Скопировать в свой проект заготовку из GitHub<a>hexlet-boilerplates/webpack-package</a></li>
3
<ol><li>Скопировать в свой проект заготовку из GitHub<a>hexlet-boilerplates/webpack-package</a></li>
4
<li>Установить зависимости, выполнив make install</li>
4
<li>Установить зависимости, выполнив make install</li>
5
<li>Установить Bootstrap.</li>
5
<li>Установить Bootstrap.</li>
6
<li>Скопировать в index.html верстку из демонстрационного проекта.</li>
6
<li>Скопировать в index.html верстку из демонстрационного проекта.</li>
7
<li>"Задеплоить на Vercel" (что бы это ни значило).</li>
7
<li>"Задеплоить на Vercel" (что бы это ни значило).</li>
8
</ol><p>Но мне хотелось пройти по всем шагам настройки окружения самостоятельно.</p>
8
</ol><p>Но мне хотелось пройти по всем шагам настройки окружения самостоятельно.</p>
9
<p>Я разобрался как смог, законспектировал и хочу поделиться тем, как у меня это получилось.</p>
9
<p>Я разобрался как смог, законспектировал и хочу поделиться тем, как у меня это получилось.</p>
10
<h3>Настройка проекта</h3>
10
<h3>Настройка проекта</h3>
11
<blockquote><p><em>Подробнее:</em>первый проект, шаг 1.</p>
11
<blockquote><p><em>Подробнее:</em>первый проект, шаг 1.</p>
12
</blockquote><p>Клонируем репозиторий</p>
12
</blockquote><p>Клонируем репозиторий</p>
13
<p>git clone [адрес проекта]</p>
13
<p>git clone [адрес проекта]</p>
14
<p>Инициализируем проект, отвечая на вопросы. В качестве имени пакета указываем<em>@hexlet/code</em>.</p>
14
<p>Инициализируем проект, отвечая на вопросы. В качестве имени пакета указываем<em>@hexlet/code</em>.</p>
15
<p>npm init</p>
15
<p>npm init</p>
16
<blockquote><p><em>Примечание.</em>Не забудьте про файл .gitignore, куда нужно внести каталоги и файлы, которые не относятся непосредственно к проекту. Например,<em>node_modules</em></p>
16
<blockquote><p><em>Примечание.</em>Не забудьте про файл .gitignore, куда нужно внести каталоги и файлы, которые не относятся непосредственно к проекту. Например,<em>node_modules</em></p>
17
</blockquote><h3>CodeClimate и Eslint</h3>
17
</blockquote><h3>CodeClimate и Eslint</h3>
18
<blockquote><p><em>Подробнее:</em>первый проект, шаг 4.</p>
18
<blockquote><p><em>Подробнее:</em>первый проект, шаг 4.</p>
19
</blockquote><p>Зарегистрируем репозиторий на сайте<a>CodeClimate</a>. Там в настройках для этого репозитория ищем коды для бейджей. Нам нужен код markdown для бейджа<em>Maintainability</em>. Добавляем этот бейдж в<em>README.md</em>. Тут тоже ничего нового.</p>
19
</blockquote><p>Зарегистрируем репозиторий на сайте<a>CodeClimate</a>. Там в настройках для этого репозитория ищем коды для бейджей. Нам нужен код markdown для бейджа<em>Maintainability</em>. Добавляем этот бейдж в<em>README.md</em>. Тут тоже ничего нового.</p>
20
<p>Установим линтер<em>Eslint</em>в зависимости для разработки, а для него - базовую конфигурацию airbnb и поддержку импортов</p>
20
<p>Установим линтер<em>Eslint</em>в зависимости для разработки, а для него - базовую конфигурацию airbnb и поддержку импортов</p>
21
<p>npm install -D eslint eslint-config-airbnb-base eslint-plugin-import</p>
21
<p>npm install -D eslint eslint-config-airbnb-base eslint-plugin-import</p>
22
<p>Настроим<em>Eslint</em>, создав файлы<em>.eslintrc.yml</em>. Можно сделать это с нуля, воспользовавшись<a>официальной документацией</a>, можно запустить кофигуратор npm init @eslint/config и ответить на вопросы, а можно подсмотреть в<a>hexlet-boilerplates/webpack-package</a>.</p>
22
<p>Настроим<em>Eslint</em>, создав файлы<em>.eslintrc.yml</em>. Можно сделать это с нуля, воспользовавшись<a>официальной документацией</a>, можно запустить кофигуратор npm init @eslint/config и ответить на вопросы, а можно подсмотреть в<a>hexlet-boilerplates/webpack-package</a>.</p>
23
<blockquote><p><em>Примечание.</em>Не забудьте про файл .eslintignore, куда нужно внести каталог<em>node_modules</em>с загруженными пакетами, чтобы сконцентрироваться только на ваших файлах</p>
23
<blockquote><p><em>Примечание.</em>Не забудьте про файл .eslintignore, куда нужно внести каталог<em>node_modules</em>с загруженными пакетами, чтобы сконцентрироваться только на ваших файлах</p>
24
</blockquote><h3>Webpack</h3>
24
</blockquote><h3>Webpack</h3>
25
<p>Теперь приступим к тому, чего не было в прошлых учебных проектах. Устанавливаем<em>Webpack</em>.</p>
25
<p>Теперь приступим к тому, чего не было в прошлых учебных проектах. Устанавливаем<em>Webpack</em>.</p>
26
<p>Полезные ссылки:</p>
26
<p>Полезные ссылки:</p>
27
<ul><li><a>Инструкция на Хекслете</a></li>
27
<ul><li><a>Инструкция на Хекслете</a></li>
28
<li><a>Официальное руководство</a></li>
28
<li><a>Официальное руководство</a></li>
29
<li>Инструкция, которая покрывает<a>установку Webpack и Bootstrap</a></li>
29
<li>Инструкция, которая покрывает<a>установку Webpack и Bootstrap</a></li>
30
</ul><p>Необходимо установить пакеты webpack (собственно он) и webpack-cli (утилиты командной строки). Так как они нужны только на этапе разработки, то устанавливать следует в<em>devDependencies</em>(флаг -D или --save-dev)</p>
30
</ul><p>Необходимо установить пакеты webpack (собственно он) и webpack-cli (утилиты командной строки). Так как они нужны только на этапе разработки, то устанавливать следует в<em>devDependencies</em>(флаг -D или --save-dev)</p>
31
<p>npm install -D webpack webpack-cli</p>
31
<p>npm install -D webpack webpack-cli</p>
32
<p>Теперь нам нужно создать три файла:</p>
32
<p>Теперь нам нужно создать три файла:</p>
33
<ul><li><em>index.html</em>- стартовую веб-страницу. Сюда не нужно добавлять CSS- и JS- файлы. Их будет добавлять сам Webpack при каждой сборке приложения. В этом файле будет располагаться вся верстка RSS-агрегатора. Если вы не сильны в верстке, то можно просто скопировать код из демонстрационного проекта.</li>
33
<ul><li><em>index.html</em>- стартовую веб-страницу. Сюда не нужно добавлять CSS- и JS- файлы. Их будет добавлять сам Webpack при каждой сборке приложения. В этом файле будет располагаться вся верстка RSS-агрегатора. Если вы не сильны в верстке, то можно просто скопировать код из демонстрационного проекта.</li>
34
<li><em>src/index.js</em>, содержащий логику приложения. Он будет выполняться при загрузке страницы. Сейчас там достаточно прописать что-то вроде console.log('Hello, World!’), чтобы потом удостоверится, что все работает.</li>
34
<li><em>src/index.js</em>, содержащий логику приложения. Он будет выполняться при загрузке страницы. Сейчас там достаточно прописать что-то вроде console.log('Hello, World!’), чтобы потом удостоверится, что все работает.</li>
35
<li><em>webpack.config.js</em>- конфигурационный файл Webpack. Сюда, в частности, нужно прописать пути до двух файлов.</li>
35
<li><em>webpack.config.js</em>- конфигурационный файл Webpack. Сюда, в частности, нужно прописать пути до двух файлов.</li>
36
</ul><p>Содержимое файлов также можно подглядеть в<a>hexlet-boilerplates/webpack-package</a>и разобраться с тем, как они устроены.</p>
36
</ul><p>Содержимое файлов также можно подглядеть в<a>hexlet-boilerplates/webpack-package</a>и разобраться с тем, как они устроены.</p>
37
<p>Вариант из<a>инструкции по установке Webpack на Хекслете</a>- запустить инициализацию<em>Webpack</em>. Я не рекомендую использовать флаг -force, а ответить на все вопросы (подробнее - в той же инструкции).</p>
37
<p>Вариант из<a>инструкции по установке Webpack на Хекслете</a>- запустить инициализацию<em>Webpack</em>. Я не рекомендую использовать флаг -force, а ответить на все вопросы (подробнее - в той же инструкции).</p>
38
<p>npx webpack init</p>
38
<p>npx webpack init</p>
39
<p>В этом случае предложат установить пакет<em>@webpack-cli/generators</em>. Соглашаемся. Отвечаем на вопросы. Перезаписывать файл<em>package.json</em>не нужно. Вы можете просмотреть, что предлагают там заменить, выбрав ответ<em>d</em>, и увидеть, что перезапишется имя проекта, а еще добавятся скрипты для запуска. Эти скрипты не нужны, так как мы чуть позже создадим<em>Makefile</em>со всеми необходимыми командами. Наш файл README.md тоже не стоит перезаписывать, там бейджи (отвечаем<em>n</em>).</p>
39
<p>В этом случае предложат установить пакет<em>@webpack-cli/generators</em>. Соглашаемся. Отвечаем на вопросы. Перезаписывать файл<em>package.json</em>не нужно. Вы можете просмотреть, что предлагают там заменить, выбрав ответ<em>d</em>, и увидеть, что перезапишется имя проекта, а еще добавятся скрипты для запуска. Эти скрипты не нужны, так как мы чуть позже создадим<em>Makefile</em>со всеми необходимыми командами. Наш файл README.md тоже не стоит перезаписывать, там бейджи (отвечаем<em>n</em>).</p>
40
<p>Обратите внимание: в конце работы скрипт покажет список файлов, которые он добавляет или изменяет.</p>
40
<p>Обратите внимание: в конце работы скрипт покажет список файлов, которые он добавляет или изменяет.</p>
41
<blockquote><p><em>Примечание.</em>После настройки пакет @webpack-cli/generators можно смело удалить командой npm remove @webpack-cli/generators</p>
41
<blockquote><p><em>Примечание.</em>После настройки пакет @webpack-cli/generators можно смело удалить командой npm remove @webpack-cli/generators</p>
42
</blockquote><h3>Установка плагинов</h3>
42
</blockquote><h3>Установка плагинов</h3>
43
<p>Все плагины для Webpack сначала устанавливаются как пакеты с помощью<em>npm</em>(все как обычно), а потом (это что-то новое) прописываются в файл<em>webpack.config.js</em>. Инструкции к тому, что именно нужно прописывать, можно всегда найти в документациях по плагинам. Например,<a>здесь</a>можно посмотреть, как установить<em>HtmlWebpackPlugin</em>.</p>
43
<p>Все плагины для Webpack сначала устанавливаются как пакеты с помощью<em>npm</em>(все как обычно), а потом (это что-то новое) прописываются в файл<em>webpack.config.js</em>. Инструкции к тому, что именно нужно прописывать, можно всегда найти в документациях по плагинам. Например,<a>здесь</a>можно посмотреть, как установить<em>HtmlWebpackPlugin</em>.</p>
44
<p>В созданном<em>webpack.config.js</em>он уже прописан. Однако сам плагин не установлен. Устанавливаем его в<em>devDependencies</em>.</p>
44
<p>В созданном<em>webpack.config.js</em>он уже прописан. Однако сам плагин не установлен. Устанавливаем его в<em>devDependencies</em>.</p>
45
<p>npm install -D html-webpack-plugin</p>
45
<p>npm install -D html-webpack-plugin</p>
46
<p>Стоит изучить webpack.config.js, пройтись по свойствам<em>module.exports</em>:</p>
46
<p>Стоит изучить webpack.config.js, пройтись по свойствам<em>module.exports</em>:</p>
47
<ul><li><em>mode</em>- режим сборки:<em>development</em>или<em>production</em>;</li>
47
<ul><li><em>mode</em>- режим сборки:<em>development</em>или<em>production</em>;</li>
48
<li><em>entry</em>- точка входа (<em>src/index.js</em>);</li>
48
<li><em>entry</em>- точка входа (<em>src/index.js</em>);</li>
49
<li><em>output</em>- каталог, куда собирается проект (<em>dist</em>);</li>
49
<li><em>output</em>- каталог, куда собирается проект (<em>dist</em>);</li>
50
<li><em>devServer</em>- настройки для локального сервера;</li>
50
<li><em>devServer</em>- настройки для локального сервера;</li>
51
<li><em>plugins</em>- используемые плагины. Сюда добавляются объекты - экземпляры класса, которые импортируются из плагина (импорт происходит выше). Плюс, здесь прописываются параметры для плагинов. Это все указывается в документации к плагинам;</li>
51
<li><em>plugins</em>- используемые плагины. Сюда добавляются объекты - экземпляры класса, которые импортируются из плагина (импорт происходит выше). Плюс, здесь прописываются параметры для плагинов. Это все указывается в документации к плагинам;</li>
52
<li><em>module</em>- модули, обеспечивающие работу с разными форматами файлов. Свойство rules содержит список объектов с двумя обязательными свойствами:<ul><li><em>test</em>- регулярные выражения, выбирающие необходимые файлы;</li>
52
<li><em>module</em>- модули, обеспечивающие работу с разными форматами файлов. Свойство rules содержит список объектов с двумя обязательными свойствами:<ul><li><em>test</em>- регулярные выражения, выбирающие необходимые файлы;</li>
53
<li><em>use</em>- массив объектов. Загрузчики (<em>loader</em>) и их опции. Если загрузчики без опций, то можно их просто перечислить в свойстве<em>use</em>в виде массива строк.</li>
53
<li><em>use</em>- массив объектов. Загрузчики (<em>loader</em>) и их опции. Если загрузчики без опций, то можно их просто перечислить в свойстве<em>use</em>в виде массива строк.</li>
54
</ul></li>
54
</ul></li>
55
</ul><h3>Запуск локального сервера</h3>
55
</ul><h3>Запуск локального сервера</h3>
56
<p>Для этого необходимо установить плагин<em>webpack-dev-server</em>в<em>devDependecies</em>. После попробуем запустить проект.</p>
56
<p>Для этого необходимо установить плагин<em>webpack-dev-server</em>в<em>devDependecies</em>. После попробуем запустить проект.</p>
57
<p>npx webpack serve</p>
57
<p>npx webpack serve</p>
58
<p>Если все получилось, в консоль будет выведено<em>compiled successfully</em>. Мы увидим окно браузера с файлом<em>index.html</em>из проекта, в который<em>Webpack</em>дописал строку вызова скрипта<em>main.js</em>. Проверив консоль браузера, убедимся, что сработал код из файла<em>src/index.js</em>.</p>
58
<p>Если все получилось, в консоль будет выведено<em>compiled successfully</em>. Мы увидим окно браузера с файлом<em>index.html</em>из проекта, в который<em>Webpack</em>дописал строку вызова скрипта<em>main.js</em>. Проверив консоль браузера, убедимся, что сработал код из файла<em>src/index.js</em>.</p>
59
<p>Теперь при внесении изменений в файлы проекта, Webpack будет пересобирать проект на лету. И это очень удобно. А остановить работу локального сервера в консоли можно через стандартное сочетание клавиш<em>Ctrl + C</em>.</p>
59
<p>Теперь при внесении изменений в файлы проекта, Webpack будет пересобирать проект на лету. И это очень удобно. А остановить работу локального сервера в консоли можно через стандартное сочетание клавиш<em>Ctrl + C</em>.</p>
60
<h3>Makefile</h3>
60
<h3>Makefile</h3>
61
<p>Теперь можно создать<em>Makefile</em>и добавить команды для удобной работы. Добавьте туда:</p>
61
<p>Теперь можно создать<em>Makefile</em>и добавить команды для удобной работы. Добавьте туда:</p>
62
<ul><li>npm ci, команду для разворачивания окружения</li>
62
<ul><li>npm ci, команду для разворачивания окружения</li>
63
<li>npx eslint, команду для вызова линтера</li>
63
<li>npx eslint, команду для вызова линтера</li>
64
<li>npx webpack serve, сборку проекта для разработки</li>
64
<li>npx webpack serve, сборку проекта для разработки</li>
65
<li>и команды для сборки проекта в режиме production (с максимально сжатым и оптимизированным кодом): rm -rf dist - для начала удалим старую сборку, если она есть NODE_ENV=production npx webpack - и, собственно, сборка</li>
65
<li>и команды для сборки проекта в режиме production (с максимально сжатым и оптимизированным кодом): rm -rf dist - для начала удалим старую сборку, если она есть NODE_ENV=production npx webpack - и, собственно, сборка</li>
66
</ul><blockquote><p><em>См. пример Makefile в</em><a>hexlet-boilerplates/webpack-package</a></p>
66
</ul><blockquote><p><em>См. пример Makefile в</em><a>hexlet-boilerplates/webpack-package</a></p>
67
</blockquote><h3>Установка Bootstrap</h3>
67
</blockquote><h3>Установка Bootstrap</h3>
68
<p>Теперь установим Bootstrap. Вот<a>инструкция</a>.</p>
68
<p>Теперь установим Bootstrap. Вот<a>инструкция</a>.</p>
69
<p>Так как Bootstrap нужен не только для разработки, но и для работы приложения, его надо устанавливать в обычные dependencies, то есть без флага -D.</p>
69
<p>Так как Bootstrap нужен не только для разработки, но и для работы приложения, его надо устанавливать в обычные dependencies, то есть без флага -D.</p>
70
<p>npm install bootstrap</p>
70
<p>npm install bootstrap</p>
71
<p>Ему потребуются дополнительные пакеты для работы с CSS, их нужно установить в<em>devDependencies</em>. Подглядывая в boilerpalte, я не стал устанавливать autoprefixer</p>
71
<p>Ему потребуются дополнительные пакеты для работы с CSS, их нужно установить в<em>devDependencies</em>. Подглядывая в boilerpalte, я не стал устанавливать autoprefixer</p>
72
<p>npm install -D css-loader postcss-loader sass sass-loader style-loader</p>
72
<p>npm install -D css-loader postcss-loader sass sass-loader style-loader</p>
73
<p>Bootstrap ориентирован на работу с<em>Sass</em>, поэтому будет разумно установить и его тоже. Sass - препроцессор css-файлов, который расширяет их функционал. Файлы, с которым работает препроцессор, имеют расширение<em>.scss</em>и из них генерируются<em>.css</em>в процессе сборки.</p>
73
<p>Bootstrap ориентирован на работу с<em>Sass</em>, поэтому будет разумно установить и его тоже. Sass - препроцессор css-файлов, который расширяет их функционал. Файлы, с которым работает препроцессор, имеют расширение<em>.scss</em>и из них генерируются<em>.css</em>в процессе сборки.</p>
74
<p>Теперь нужно создать собственный файл<em>.scss</em>(например,<em>src/styles.scss</em>), добавить в него импорт стандартных стилей bootstrap, прописав</p>
74
<p>Теперь нужно создать собственный файл<em>.scss</em>(например,<em>src/styles.scss</em>), добавить в него импорт стандартных стилей bootstrap, прописав</p>
75
<p>@import "~bootstrap/scss/bootstrap";</p>
75
<p>@import "~bootstrap/scss/bootstrap";</p>
76
<p>А его, в свою очередь, импортировать в<em>index.js</em>вместе с самим<em>Bootstrap</em></p>
76
<p>А его, в свою очередь, импортировать в<em>index.js</em>вместе с самим<em>Bootstrap</em></p>
77
<p>import './styles.scss'; import 'bootstrap';</p>
77
<p>import './styles.scss'; import 'bootstrap';</p>
78
<p>Для корректной работы элементов<em>Bootstrap</em>в html-коде<em>index.html</em>требуется следующий тег: <meta name="viewport" content="width=device-width, initial-scale=1"></p>
78
<p>Для корректной работы элементов<em>Bootstrap</em>в html-коде<em>index.html</em>требуется следующий тег: <meta name="viewport" content="width=device-width, initial-scale=1"></p>
79
<p>Добавляем необходимые записи в конфигурацию<em>webpack.config.js</em>. В свойство<em>modules</em>необходимо прописать обработку файлов<em>.scss</em>(подсмотрите в boilerplate, там это реализовано лаконичнее, чем в инструкции на сайте Bootstrap).</p>
79
<p>Добавляем необходимые записи в конфигурацию<em>webpack.config.js</em>. В свойство<em>modules</em>необходимо прописать обработку файлов<em>.scss</em>(подсмотрите в boilerplate, там это реализовано лаконичнее, чем в инструкции на сайте Bootstrap).</p>
80
<blockquote><p><em>Примечания</em>Если использовать только встроенные стили, возможно, использовать<em>Sass</em>нет смысла, и можно обойтись импортом обычного css, который находится в<em>/node_modules/bootstrap/dist/css/bootstrap.css</em>. Импортировать<em>всю</em>библиотеку<em>Bootstrap</em>- не оправдано (хотя все будет работать корректно), так как она очень большая, а в проекте используются лишь некоторые ее модули. Их можно импортировать выборочно. Подробнее об этом и об оптимизации также можно почитать в документации Bootstrap</p>
80
<blockquote><p><em>Примечания</em>Если использовать только встроенные стили, возможно, использовать<em>Sass</em>нет смысла, и можно обойтись импортом обычного css, который находится в<em>/node_modules/bootstrap/dist/css/bootstrap.css</em>. Импортировать<em>всю</em>библиотеку<em>Bootstrap</em>- не оправдано (хотя все будет работать корректно), так как она очень большая, а в проекте используются лишь некоторые ее модули. Их можно импортировать выборочно. Подробнее об этом и об оптимизации также можно почитать в документации Bootstrap</p>
81
</blockquote><p>На этом начальная настройка окружения окончена. Теперь можно еще раз проверить, что все работает корректно, пройтись линтером отправить все изменения на GitHub.</p>
81
</blockquote><p>На этом начальная настройка окружения окончена. Теперь можно еще раз проверить, что все работает корректно, пройтись линтером отправить все изменения на GitHub.</p>
82
<h3>Vercel</h3>
82
<h3>Vercel</h3>
83
<p>Здесь все очень интуитивно. Необходимо зарегистрироваться на сайте, добавить свой репозиторий из GitHub (можно не все, а только нужное) и нажать Import. Далее сконфигурировать проект, указав команду для сборки, затем каталог, куда она производится, а также команду для установки. Используются команды из<em>Makefile</em>.</p>
83
<p>Здесь все очень интуитивно. Необходимо зарегистрироваться на сайте, добавить свой репозиторий из GitHub (можно не все, а только нужное) и нажать Import. Далее сконфигурировать проект, указав команду для сборки, затем каталог, куда она производится, а также команду для установки. Используются команды из<em>Makefile</em>.</p>
84
<p>Теперь после каждого обновления репозитория на GitHub Vercel будет собирать проект в режиме production и публиковать его.</p>
84
<p>Теперь после каждого обновления репозитория на GitHub Vercel будет собирать проект в режиме production и публиковать его.</p>