Back

Универсальные маршруты для обработки 404 ошибок в React Router

Универсальные маршруты для обработки 404 ошибок в React Router

Когда пользователи переходят по несуществующим маршрутам в вашем React-приложении, они не должны видеть пустой экран или ошибку браузера. Правильно реализованное решение для обработки 404 страниц с универсальными маршрутами в React Router гарантирует, что пользователи получат четкую обратную связь и варианты навигации, улучшая как пользовательский опыт, так и SEO-показатели.

Эта статья демонстрирует, как реализовать универсальные маршруты в React Router v6+ для обработки несовпадающих URL с помощью пользовательских 404 страниц или перенаправлений. Вы научитесь создавать компоненты NotFound, настраивать маршруты с подстановочными знаками и выбирать между отображением пользовательских страниц ошибок и перенаправлением пользователей к существующему контенту.

Ключевые выводы

  • Используйте path="*" как последний маршрут в вашей конфигурации для перехвата несовпадающих URL
  • Пользовательские 404 страницы обеспечивают лучший пользовательский опыт, чем стандартные ошибки браузера
  • Компонент <Navigate> предлагает альтернативный подход с перенаправлением для более простых приложений
  • Всегда тестируйте обработку 404 ошибок как вручную, так и с помощью автоматизированных тестов
  • Соответствие бренду и полезные опции навигации повышают эффективность 404 страниц

Почему обработка 404 ошибок важна для React-приложений

Пользовательский опыт

Пользовательские 404 страницы предотвращают путаницу пользователей, когда они сталкиваются с неработающими ссылками или неправильно набранными URL. Вместо стандартных ошибок браузера пользователи получают брендированные, полезные сообщения, которые поддерживают их вовлеченность в ваше приложение.

Непрерывность навигации

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

SEO-преимущества

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

Установка React Router

Для браузерных React-приложений установите пакет react-router-dom:

npm install react-router-dom

Примечание: В React Router v7 большинство API также можно импортировать напрямую из react-router. Для веб-приложений react-router-dom остается стандартом, поскольку включает DOM-специфичные привязки и поддерживает совместимость с существующим кодом v6.

Создание пользовательского компонента NotFound

Начните с создания специального компонента для функциональности универсального маршрута 404 страницы React Router:

// components/NotFound.jsx
import React from 'react'
import { Link } from 'react-router-dom'

function NotFound() {
  return (
    <div className="not-found-container">
      <h1>404 - Страница не найдена</h1>
      <p>Страница, которую вы ищете, не существует.</p>
      <div className="not-found-actions">
        <Link to="/" className="home-link">
          Вернуться на главную
        </Link>
        <Link to="/contact" className="contact-link">
          Связаться с поддержкой
        </Link>
      </div>
    </div>
  )
}

export default NotFound

Этот компонент предоставляет четкие сообщения и действенные варианты навигации. Компоненты Link из React Router обеспечивают правильную клиентскую навигацию без полной перезагрузки страницы.

Настройка универсального маршрута

Реализуйте маршрут с подстановочным знаком, используя path="*" в конце конфигурации маршрутов:

// App.jsx
import React from 'react'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import Home from './pages/Home'
import About from './pages/About'
import Services from './pages/Services'
import NotFound from './components/NotFound'

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/services" element={<Services />} />
        
        {/* Универсальный маршрут для обработки 404 */}
        <Route path="*" element={<NotFound />} />
      </Routes>
    </BrowserRouter>
  )
}

export default App

Маршрут path="*" должен появляться последним в списке ваших маршрутов. React Router сопоставляет маршруты сверху вниз, поэтому размещение универсального маршрута в конце гарантирует, что он срабатывает только тогда, когда никакие другие маршруты не совпадают.

Альтернатива: подход с перенаправлением с использованием Navigate

Вместо отображения пользовательской 404 страницы вы можете перенаправить пользователей к существующему маршруту:

import React from 'react'
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import Home from './pages/Home'
import About from './pages/About'
import Services from './pages/Services'

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/services" element={<Services />} />
        
        {/* Перенаправление несовпадающих маршрутов на главную */}
        <Route path="*" element={<Navigate to="/" replace />} />
      </Routes>
    </BrowserRouter>
  )
}

Свойство replace предотвращает появление недействительного URL в истории браузера, создавая более чистый опыт навигации.

Тестирование вашей реализации 404

Ручное тестирование

Перейдите к несуществующим маршрутам в вашей среде разработки:

  • http://localhost:3000/nonexistent
  • http://localhost:3000/invalid/path
  • http://localhost:3000/typo-in-url

Убедитесь, что ваш компонент NotFound отображается корректно или перенаправления функционируют как ожидается.

Автоматизированное тестирование

Создайте модульные тесты, чтобы убедиться, что ваши универсальные маршруты работают правильно:

import { render, screen } from '@testing-library/react'
import { MemoryRouter } from 'react-router-dom'
import App from './App'

test('renders 404 page for invalid routes', () => {
  render(
    <MemoryRouter initialEntries={['/invalid-route']}>
      <App />
    </MemoryRouter>
  )
  
  expect(screen.getByText('404 - Страница не найдена')).toBeInTheDocument()
})

Брендинг вашей 404 страницы

Согласованность дизайна

Сопоставьте стилизацию вашей 404 страницы с дизайн-системой вашего приложения. Используйте согласованные цвета, типографику и паттерны макета для поддержания согласованности бренда.

Полезный контент

Включите элементы, которые предоставляют ценность пользователям:

  • Функциональность поиска
  • Ссылки на популярные страницы
  • Недавние записи блога или продукты
  • Контактную информацию
  • Меню навигации по сайту

Соображения доступности

Убедитесь, что ваша 404 страница соответствует стандартам доступности:

  • Используйте семантические HTML-элементы
  • Обеспечьте правильную иерархию заголовков
  • Включите alt-текст для изображений
  • Обеспечьте достаточный цветовой контраст

Когда использовать перенаправления против пользовательских страниц

Выбирайте пользовательские 404 страницы когда:

  • Вы хотите сохранить недействительный URL в браузере
  • SEO требует правильных 404 кодов состояния
  • Пользователям нужны специфические рекомендации или опции поддержки
  • Ваше приложение имеет сложные структуры навигации

Выбирайте перенаправления когда:

  • Вы предпочитаете бесшовный пользовательский опыт вместо сообщений об ошибках
  • Ваше приложение имеет простую навигацию
  • Вы хотите минимизировать показатели отказов
  • Недействительные URL в основном из-за опечаток или устаревших ссылок

Заключение

Реализация универсальных маршрутов для обработки 404 ошибок в React Router улучшает пользовательский опыт, поддерживает поток навигации и поддерживает лучшие практики SEO. Выбор между пользовательскими компонентами NotFound или подходами с перенаправлением зависит от специфических потребностей вашего приложения и ожиданий пользователей.

Ключ в том, чтобы разместить ваш маршрут с подстановочным знаком (path="*") в конце конфигурации маршрутов и предоставить значимую обратную связь или опции навигации пользователям, которые сталкиваются с несовпадающими маршрутами.

Часто задаваемые вопросы

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

Нет, у вас может быть только один универсальный маршрут на компонент Routes. Однако вы можете реализовать вложенную маршрутизацию с отдельными универсальными маршрутами в разных разделах маршрутов при необходимости.

Используйте Navigate для простых перенаправлений, когда вы хотите бесшовный пользовательский опыт. Выбирайте пользовательские компоненты NotFound, когда вам нужны правильные 404 коды состояния для SEO или вы хотите предоставить специфические рекомендации пользователям.

В клиентских React-приложениях вы не можете напрямую контролировать HTTP коды состояния. Для правильной обработки SEO рассмотрите решения серверного рендеринга или убедитесь, что конфигурация вашего сервера возвращает 404 коды состояния для несовпадающих маршрутов.

Да, добавьте отслеживание аналитики в ваш компонент NotFound, используя useEffect для логирования, когда пользователи сталкиваются с 404 страницами, помогая вам выявлять неработающие ссылки или распространенные проблемы навигации пользователей.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers