Недавно столкнулся с интересным багом в Next.js. Если на странице not-found
делать навигацию через router.push(pathname)
, теряются все переменные окружения, которые мы инициализируем через библиотеку next-runtime-env
(значение window.__ENV
становится undefined
).
В проекте мы используем next-runtime-env
, так как придерживаемся подхода Build once, deploy many — это позволяет держать один Docker-образ, в который при запуске прокидываются нужные переменные окружения. Next.js из коробки не поддерживает такое поведение, ведь он хочет собирать env-переменные на этапе сборки приложения.
Баг проявился на not-found
странице, где у нас есть кнопка, позволяющая создать элемент в один клик, если что-то не найдено. Этот же компонент кнопки используется и на других страницах, и вот что интересно: на остальных страницах router.push(pathname)
работает корректно, а на not-found
— нет.
Сначала я подумал, что проблема кроется в next-runtime-env
. Наверное, библиотека переопределяется при обновлении страницы, потому что скрипт, устанавливающий переменные в window.__ENV
, размещён в root layout. Я также пробовал версионировать Next.js, предполагая, что баг связан с определёнными версиями фреймворка, но это не дало результатов. В итоге, временным решением стало использование window.location.href
, что предотвращало рефреш страницы и помогало сохранить переменные.
Однако на этом история не закончилась.