Как исправить `Предупреждение: текстовое содержимое не соответствует. Сервер: "Некоторые данные" Клиент: "Загрузка ..." `

Я получаю эту ошибку при начальной загрузке моего приложения SSR: Warning: Text content did not match. Server: "SOME DATA" Client: "Loading..." Как инициализировать клиентскую часть приложения, не устанавливая для флага loading значение true?

Я настраиваю SSR с помощью response, express и apollo. Я получаю правильно обработанный HTML-код с данными с сервера визуализации, но когда пакет клиента загружается, он пытается повторно получить данные. Установлена ​​гидратация, и все данные с сервера рендеринга вводятся в HTML-код страницы.

/index.js

<Query query = {GET_USERS} variables = {queryVariables}>
    {({
        loading,
        error,
        data
    }) => {
        if (loading) return <p>Loading...</p>;
        if (error) return `Error: ${error}`;
        return data.users.map(user => <p key = {user.id}>{user.login}</p>);
    }}
</Query>

/renderer.js

export default async (req, client) => {
    const serverSideApp = (
        <ApolloProvider client = {client}>
            <StaticRouter location = {req.path} context = {{}}>
                <div>{renderRoutes(RoutesList)}</div>
            </StaticRouter>
        </ApolloProvider>
    );
        return getDataFromTree(serverSideApp).then(() => {
            const content = renderToString(serverSideApp);

            return `
                  <html>
                      <head></head>
                      <body>
                          <div id = "root">${content}</div>
                          <script src = "bundle.js"></script>
                          <script>

    window.__APOLLO_STATE__=${serialize(client.extract())}
                          </script>
                      </body>
                  </html>
            `;
    })
};

/server.js

const app = express();

app.use(express.static("public"));

app.get("*", (req, res) => {
    const httpLink = createHttpLink({
        uri: "http://10.10.10.139:4000/",
        fetch
    });

    const client = new ApolloClient({
        link: httpLink,
        ssrMode: true,
        cache: new InMemoryCache()
    });

    renderer(req, client).then((html) => res.send(html));
});

app.listen(3000, () => {
    console.info("Server is up");
});

/client.js

const httpLink = createHttpLink({
    uri: "http://10.10.10.139:4000/"
});

const client = new ApolloClient({
    link: httpLink,
    cache: new InMemoryCache().restore(window.__APOLLO_STATE__)
});

ReactDOM.hydrate(
    <ApolloProvider client = {client}>
      <BrowserRouter>
        <div>{renderRoutes(RoutesList)}</div>
      </BrowserRouter>
    </ApolloProvider>,
    document.getElementById("root")
);

Я ожидаю, что клиентская сторона приложения будет обновлять значения на стороне сервера и не запускать флаг loading при начальной загрузке.

Привет, я столкнулся с той же проблемой - вы нашли решение, чтобы исправить это предупреждение?

Sidd 12.01.2019 16:40

@ Сидд привет! Еще нет. Пришлось переключиться на другой проект, поэтому не было времени углубляться в этот вопрос. А ты? Вы поняли, в чем проблема?

rreckonerr 05.02.2019 08:19
lihautan.com/hydrating-text-content
Sudarshana Dayananda 02.09.2020 03:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
13
3
11 207
2

Ответы 2

Из документации react-apollo раздел Пропуск запросов для SSR представляет механизм, который позволяет разработчикам явно помечать компонент, чтобы он либо загружал данные для этого компонента на сервер, или отображает компонент на сервере в состоянии «загрузка».

Попробуйте следующее:

// index.js

<Query query = {GET_USERS} ssr = {false} variables = {queryVariables}>
    {({
        loading,
        error,
        data
    }) => {
        if (loading) return <p>Loading...</p>;
        if (error) return `Error: ${error}`;
        return data.users.map(user => <p key = {user.id}>{user.login}</p>);
    }}
</Query>

При использовании nextjs с styled-jsxhttps://github.com/vercel/styled-jsx эта ошибка может возникнуть, если вы опустите атрибут jsx в теге style.

Хорошо (атрибут jsx обязателен):

<style jsx>{`...`}</style>

Плохой (опустить атрибут jsx):

<style>{`...`}</style>

Отсутствие атрибута jsx вызовет в консоли браузера следующее:

react-dom.development.js Warning: Text content did not match. Server: "..." Client: "..."

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