BLACK FRIDAY

осталось 5 дней

Скидка 10% и подарок на выбор — при покупке одной программы
При покупке двух программ  — вторая со скидкой 50%
Проект модуля #2

Роутер

Алгоритмы и структуры данных

Напишите древовидную библиотеку, повысьте навыки работы с деревьями и научитесь улучшать скорость работы алгоритма.

2-4
недели

Цель

Роутер — проект, в котором мы прокачаем работу с древовидными структурами. Эта тема изучалась на курсе по деревьям, а здесь она раскрывается на задаче, которую решают современные фреймворки. В ходе разработки мы создадим абстракцию, чтобы удобно обходить дерево и накапливать результаты работы.

Архитектура

Роутер — один из самых используемых компонентов на любом сайте, через который на него обращаются. От производительности роутера зависит как быстро будет работать сайт. Например, если на нагруженный ресурс поступает тысячи запросов в секунду и есть много маршрутов, то он может загружаться существенное время. Поэтому здесь важны устройство и скорость роутера.

Чтобы он работал эффективно, разработчики используют специальные структуры данных, например, выражают внутреннюю структуру в виде префиксного дерева.

Описание

У каждой страницы сайта есть URL-адрес. Когда мы обращаемся к сайту, движок, на котором он написан, анализирует URL-адрес и пытается найти функцию, чтобы сгенерировать ответ. За этот процесс отвечает роутинг, который реализован в виде отдельного компонента — роутера. Он выбирает функцию в зависимости от URL-адреса.

Роутеры часто реализуются в виде отдельных библиотек, которые потом используются внутри сайта. Это хорошая практика, и в этом проекте мы напишем такую библиотеку. В итоге наш роутер можно будет использовать на реальных сайтах.

Пример реальной библиотеки:

// https://adonisjs.com/docs/4.1/routing
// Определение маршрута /
// Вторым параметром передается обработчик
// Он просто возвращает строку Hello Hexlet
Route.get('/', () => 'Hello Hexlet');
// Определение маршрута /about
Route.get('/about', () => 'About Hexlet');

// Где-то запускаем сайт example.com
// и делаем запрос
curl example.com
Hello Hexlet
curl example.com/about
About Hexlet

Пример использования нашей библиотеки:

import makeRouter from '@hexlet/code';

const routes = [
  {
    path: '/hello', // маршрут
    method: 'POST', // метод HTTP
    handler: () => 'Hello!', // обработчик
  },
  {
    path: '/hello/:name', // динамический маршрут
    handler: ({ name }) => `Hello ${name}!`,
    constraints: { name: /\w+/ }, // ограничения накладываемые на динамический маршрут
  },
];

const router = makeRouter(routes); // инициализируем наши маршруты

// Запрос из сети
// На самом деле, всё гораздо сложнее и в реальности сам HTTP запрос обрабатывает сервер на сайте
// Далее он сам прокидывает запрос в роутер
// Мы просто говорим, что запрос должен состоять из пути и метода
const request = { path: 'hello/Hexlet', method: 'GET' };

// Вызываем наш роутер с запросом из "сети"
const result = router.serve(request); // { path: 'hello/Hexlet', method: 'GET', handler: [Function handler], params: { name: 'Hexlet' } }
// Вызываем обработчик с параметрами, который вернул роутер
result.handler(result.params); // Hello Hexlet!
Сколько стоят проекты?

Проекты входят в стоимость обучения на любом плане: самостоятельном, групповом и индивидуальном. Дополнительно платить не нужно.

Зачем проходить проекты?

Проекты дают опыт разработки в реальной среде. Проходите каждый проект сразу после изучения курсов, которые стоят в учебном плане перед ним, — это отличный способ глубже разобраться в материале.

Проекты — портфолио программиста. Их код останется в вашем аккаунте на GitHub и будет преимуществом при поиске работы.

Чтобы узнать о том, что такое проекты и в чём их польза, прочитайте нашу статью «Анатомия проектов Хекслета».

Что делать, если возникли трудности во время выполнения проекта?

Задавайте вопросы в разделе «Обсуждение» на странице шага, на котором возникли трудности, или вашему наставнику. Изучите вопросы других студентов в «Обсуждениях»: там собрана большая база знаний, ей можно и нужно пользоваться. Попросите о помощи в нашем Slack-чате в канале #hexlet-projects.

Кто проверяет проекты?

Автоматизированные тесты и линтер. В групповом и индивидуальном форматах наставник дополнительно проверит то, что тестами проверить невозможно (архитектуру проекта, правильность именования, удачность решений), и проведёт код-ревью, чтобы сделать проект ещё качественнее.

У меня другой вопрос

Нажмите на виджет в правом нижнем углу экрана и поищите ответ в нашей справке. Или сразу пишите на support@hexlet.io — вам ответит живой человек из команды Хекслета.