
Введение
В этом сообщении блога мы рассмотрим, как реализовать рендеринг на стороне сервера (SSR) с помощью Redux в ваших приложениях React для предварительной загрузки начального состояния. Предварительно загрузив состояние вашего приложения, вы можете улучшить его производительность и удобство для пользователей.
Что такое рендеринг на стороне сервера (SSR)?
Рендеринг на стороне сервера — это метод, который позволяет вам визуализировать ваше приложение React на сервере перед его отправкой клиенту. Это предоставляет клиенту полностью отображаемую HTML-страницу, которую можно немедленно отобразить, не дожидаясь запуска клиентского JavaScript.
Преимущества использования SSR с Redux
- Быстрая начальная загрузка. За счет рендеринга приложения на сервере пользователи могут быстрее просматривать контент, поскольку им не нужно ждать, пока загрузится и выполнится клиентский JavaScript.
- Улучшенная поисковая оптимизация. Поисковые системы могут лучше индексировать и ранжировать ваши страницы, поскольку они получают полностью отображаемый HTML-контент.
- Улучшение взаимодействия с пользователем. Состояние предварительной загрузки помогает сократить количество "скачков" содержимого и изменения макета при загрузке приложения, обеспечивая более плавное взаимодействие с пользователем.
Настройка базового приложения React с Redux
Давайте настроим базовое приложение React с Redux, прежде чем углубляться в SSR. Мы будем использовать популярную команду create-react-app для создания нового проекта:
npx create-react-app redux-ssr-example cd redux-ssr-example
Теперь установите необходимые пакеты Redux:
npm install redux react-redux
Реализация SSR с помощью Redux
В этом разделе мы реализуем SSR для нашего приложения React. Сначала установите необходимые зависимости:
npm install express
Затем создайте новый файл с именем server.js в корне вашего проекта и добавьте следующий код:
const express = require("express");
const path = require("path");
const fs = require("fs");
const { renderToString } = require("react-dom/server");
const { createStore } = require("redux");
const { Provider } = require("react-redux");
const App = require("./src/App").default;
const rootReducer = require("./src/reducers");
const app = express();
app.use(express.static(path.join(__dirname, "build")));
app.get("/*", (req, res) => {
const store = createStore(rootReducer);
const html = renderToString(
<Provider store={store}>
<App />
</Provider>
);
const preloadedState = store.getState();
const finalHtml = `
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Redux SSR Example</title>
<link href="/static/css/main.css" rel="stylesheet">
</head>
<body>
<div id="root">${html}</div>
<script>
window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace(
/</g,
"\\u003c"
)}
</script>
<script src="/static/js/main.js"></script>
</body>
</html>
`;
res.send(finalHtml);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is listening on port ${PORT}`);
});
Этот код настраивает сервер Express для обслуживания вашего приложения React. Он создает хранилище Redux, отображает приложение в строку и встраивает предварительно загруженное состояние в ответ HTML.
Состояние предварительной загрузки для ваших приложений React
Чтобы использовать предварительно загруженное состояние в клиентском приложении React, измените файл src/index.js следующим образом:
import React from "react";
import { hydrate } from "react-dom";
import { createStore } from "redux";
import { Provider } from "react-redux";
import rootReducer from "./reducers";
import App from "./App";
const preloadedState = window.__PRELOADED_STATE__;
delete window.__PRELOADED_STATE__;
const store = createStore(rootReducer, preloadedState);
hydrate(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("root")
);
Здесь мы используем hydrate вместо ReactDOM.render, чтобы присоединить прослушиватели событий к отображаемому сервером HTML. Мы также получаем предварительно загруженное состояние от window.__PRELOADED_STATE__ и передаем его как начальное состояние createStore.
Теперь обновите раздел scripts в файле package.json, чтобы включить серверный скрипт:
"scripts": {
"start": "node server.js",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
Наконец, создайте приложение React и запустите сервер:
npm run build npm start
Ваше серверное приложение React с предварительно загруженным состоянием Redux теперь запущено и работает! Посетите https://localhost:3000, чтобы увидеть свое приложение в действии.
Заключение
В этом сообщении блога мы рассмотрели преимущества рендеринга на стороне сервера с помощью Redux и способы его реализации в приложении React. Предварительно загрузив состояние, вы можете улучшить производительность вашего приложения, SEO и общее взаимодействие с пользователем. Обладая этими знаниями, вы теперь можете создавать более эффективные и надежные приложения React, используя Redux и рендеринг на стороне сервера.