Динамические маршруты Next.js: избегайте создания новых страниц для параметров пути

tl;dr: мне нужно вести себя как

Я использую Next.js 10. Мне бы хотелось иметь маршруты вроде mypage.com/users/123 а также mypage.com/users/445. Все мои поиски приводят меня к динамической маршрутизации, которая предлагает использовать эту структуру под pages папка:

      users/
   [user_id].js

В моем случае это не работает, потому что тогда на сервере создается новая страница для каждого пользователя. Мне нужна только одна статически сгенерированная страница под users/, который получает в качестве параметра на стороне клиента.

С параметрами запроса это просто. Я могу использовать эту структуру папок

      users/
   index.js

а затем, когда кто-то идет в mypage.com/users?user_id=123, обслуживается та же страница, а затем js-код на стороне клиента может получить доступ к user_id.

Возможное решение

Мое текущее решение (которое я считаю слишком сложным, но может кому-то помочь) добавляет rewrite на next.config.js, как это:

      module.exports = {
  rewrites() {
    return [{ source: '/users/:user_id', destination: '/users?user_id=:user_id' }];
  }
}

1 ответ

Если я правильно понимаю, вы не хотите создавать статические страницы для каждого пользователя.

Поэтому вам нужно использовать рендеринг на стороне сервера (SSR) вместо создания статического сайта (SSG). Для этого вам нужно использовать getServerSideProps вместо getStaticProps or getStaticPaths.

      // This gets called on every request
export async function getServerSideProps(context) {
  // Find user
  const user = await GetTheUserSomehow(context.params.user_id);

  // Pass data to the page via props
  return { props: { user: user } }
}

Ссылки для справки:

https://nextjs.org/docs/basic-features/pages#server-side-rendering

https://nextjs.org/docs/basic-features/pages#static-generation-recommended

Другие вопросы по тегам