Проблема с React SSR и hydrate, когда DOM слишком похож

#javascript #reactjs #webpack #server-side-rendering

#javascript #reactjs #webpack #рендеринг на стороне сервера

Вопрос:

У меня небольшая проблема, и я надеюсь, что, возможно, здесь я мог бы найти решение.

У нас есть веб-сайт, который мы создали с помощью React, мы используем этот пакет для рендеринга на стороне сервера и помещаем результирующие файлы в S3.

https://github.com/markdalgleish/static-site-generator-webpack-plugin

Затем мы делаем ReactDOM.hydrate, как

 if (typeof document !== 'undefined') {
    ReactDOM.hydrate(
        <BrowserRouter context={{}} initialEntries={['/']} initialIndex={0}>
            { renderRoutes(Routes) }
        </BrowserRouter>,
        document.getElementById('root')
    );
}
  

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

Обычно все в порядке, но если DOM в результате SSR и новый слишком похожи, он ломается. Например.

 <nav>
    {!isLoggedin amp;amp; <a href="/login">Login</a>}
    {isLoggedin amp;amp; <a href="/options">Options</a>}
</nav>
  

В конкретном случае, подобном этому, isLoggedIn всегда имеет значение false для SSR, поэтому кнопка входа будет отображаться первой. Затем hydrate изменится, чтобы отобразить кнопку options; появится слово options, но ссылка на href останется прежней, что плохо.

Я пытался использовать атрибут key или изменять некоторые другие свойства, они игнорируются, но я не нашел способа предотвратить это, кроме изменения DOM, но это не всегда возможно, как в том примере с меню.

Любые советы или указатели приветствуются!

Ответ №1:

Упомянутая вами программа содержит всего около 200 строк кода, подумайте о том, чтобы прочитать ее:https://github.com/markdalgleish/static-site-generator-webpack-plugin/blob/master/index.js кроме того, не похоже, что «наличие одного и того же dom» является проблемой, поскольку на первый взгляд в коде отсутствуют процедуры сравнения dom, возможно, проблема в чем-то другом, а не в «наличии одного и того же dom».