Автор оригинала: FreeCodeCamp Community Member.
Rohit Kumar.
Вот что мы будем строить в этом руководстве: хорошая реакстранная карта, как этот.
В этом руководстве мы будем использовать рендеринг на стороне сервера для доставки HTML-ответа, когда пользователь или гусеник попадают в URL-адрес страницы. Мы будем справиться с последними запросами на стороне клиента.
Зачем нам это нужно?
Позвольте мне вести вас к ответу.
В чем разница между рендерингом на боковом клиенте и рендеринге сервера?
В Клиентский рендеринг, Ваш браузер загружает минимальную страницу HTML. Он отображает JavaScript и заполняет его контент.
Серверный рендеринг, С другой стороны, делает компоненты реагирования на сервере. Выходность является HTML контент.
Вы можете объединить эти два, чтобы создать приложение Isomorphic.
Минусы рендеринга реагируют на сервер
- SSR может повысить производительность, если ваше приложение мало. Но это также может ухудшить производительность, если это тяжело.
- Это увеличивает время отклика (и может быть хуже, если сервер занят).
- Это увеличивает размер ответа, что означает, что страница занимает больше времени для загрузки.
- Это увеличивает сложность применения.
Когда вы должны использовать рендеринг боковых серверов?
Несмотря на эти последствия SSR, существуют некоторые ситуации, в которых вы можете и использовать его.
1 SEO
Каждый сайт хочет появиться в поисках. Поправьте меня если я ошибаюсь.
К сожалению, поисковая система Scrawlers еще не понимают/визуализации JavaScript.
Это означает, что они видят пустую страницу, независимо от того, насколько полезно ваш сайт.
Многие люди говорят, что гусеничный гугл Теперь отображает JavaScript Отказ
Чтобы проверить это, я развернул приложение на Heroku. Вот что я видел на консоли поиска Google:
Пустая страница.
Это была самая большая причина, по которой я исследовал рендеринг сервера. Особенно, когда это Страница краеугольного камня Такие как посадочная страница, блог и так далее.
Для проверки, если Google оказывает ваш сайт, посетите:
Поисковая консольная панель инструментов> ползает> Привлечение в Google. Введите URL-адрес страницы или оставьте его пустым для домашней страницы.
Выберите Fetch и Render. После завершения нажмите, чтобы увидеть результат.
2 Повысить производительность
В SSR производительность приложения зависит от ресурсов сервера и скорости сети пользователя. Это делает это очень полезным для контент-тяжелых сайтов.
Например Скажите, что у вас есть мобильный телефон среднего цена с медленной скоростью Интернета. Вы пытаетесь получить доступ к сайту, который загружает 4 МБ данных, прежде чем увидеть что-нибудь.
Вы сможете увидеть что-нибудь на вашем экране в течение 2-4 секунд?
Вы бы снова посетили этот сайт?
Я не думаю, что вы бы.
Еще одно серьезное улучшение в Первое время взаимодействия пользователя Отказ Это разница во времени, когда пользователь попадает в URL, когда они видят контент.
Вот сравнение. Я проверил его на разработке Mac.
Реагируйте на сервере
Первое время взаимодействия составляет 300 мс. Гидрата заканчивается на 400 мс. Событие нагрузки выходит примерно на 500 мс. Вы можете увидеть это, проверив изображение выше.
Реагируйте на браузере клиента
Первое время взаимодействия составляет 400 мс. Событие нагрузки выходит на 470 мс.
Результат говорит сам по себе. Есть разница в 100 мс в первом времени взаимодействия пользователя для такого небольшого приложения.
Как это работает? – (4 простых шага)
- Создайте свежий магазин Redux на каждом запросе.
- Необязательно отправлять некоторые действия.
- Получите государство из магазина и выполните SSR.
- Отправить состояние, полученное на предыдущем шаге вместе с ответом.
Мы будем использовать состояние, переданное в ответ на создание начального состояния на стороне клиента.
Прежде чем начать, клон/скачать полный пример из github и использовать его для справки.
Начало работы, создавая наше приложение
Во-первых, откройте свой любимый редактор и Shell. Создайте новую папку для вашего приложения. Давайте начнем.
npm init --yes
Заполните детали. После Package.json Создан, скопируйте зависимости и скрипты ниже в него.
Установите все зависимости бегом:
npm install
Вам нужно настроить Babel и WebPack для нашего сценария сборки для работы.
Babel преобразует ESM и реагирует в узел и код понятого браузера.
Создать новый файл .babelrc. и положить линию ниже в нем.
{
"presets": ["@babel/env", "@babel/react"]
}
WebPack сочиняет наше приложение и его зависимости в один файл. Создайте другой файл webpack.config.js С следующим кодом в нем:
const path = require('path');module.exports = {
entry: {
client: './src/client.js',
bundle: './src/bundle.js'
},
output: {
path: path.resolve(__dirname, 'assets'),
filename: "[name].js"
},
module: {
rules: [
{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
]
}
}Два файла вывода процесса сборки:
Активы/Bundle.js– Приложение Pure Client Side.Активы/Client.js– Клиентский собеседник для SSR.
SRC/ Папка содержит исходный код. Компилированные файлы Babel входят в Виды/ Отказ Виды Каталог будет создан автоматически, если нет.
Почему нам нужно скомпилировать исходные файлы?
Причина в синтаксисе Разница между ESM & Commonjs Отказ При написании React и Redux мы сильно используем импорт и экспортируйте во всех файлах.
К сожалению, они не работают в узле. Здесь приходит Бабел, чтобы спасти. Сценарий ниже рассказывает Babel скомпилировать все файлы в SRC каталог и положить результат в взгляды.
"babel": "babel src -d views",
Теперь узел может запустить их.
Скопируйте предварительно обработанные и статические файлы
Если вы уже клонировали репозиторий, скопируйте из него. Иначе D Onload SSR -static.zip Файл из Dropbox Отказ Извлеките его и сохраните эти три папки в каталоге вашего приложения. Вот что они содержат.
- Реагировать
Приложениеи компоненты проживают вSRC/компонентыОтказ - Redux файлы в
SRC/Redux/Отказ Активы/Медиа/: Содержать статические файлы, такие какstill.cssи изображения.
Серверная сторона
Создайте два новых файла с именем server.js и template.js внутри SRC/ папка.
1 src/server.js.
Волшебство происходит здесь. Это код, который вы искали.
import React from 'react';
import { renderToString } from 'react-dom/server';
import { Provider } from 'react-redux';
import configureStore from './redux/configureStore';
import App from './components/app';
module.exports = function render(initialState) {
// Model the initial state
const store = configureStore(initialState);
let content = renderToString( );
const preloadedState = store.getState();
return {
content,
preloadedState
};
};Вместо того, чтобы рендеринг нашего приложения нам нужно завернуть его в функцию и экспортировать его. Функция принимает начальное состояние приложения.
Вот как это работает.
- Пройти
инициациякConfigureStore ()ОтказConfigureStore ()Возвращает новый экземпляр магазина. Держи его внутримагазинПеременная. - Позвоните
RENDERTOSTRING ()Способ, обеспечивающий наше приложение в качестве ввода. Он делает наше приложение на сервере и возвращает HTML. Теперь переменнаяСодержаниехранит HTML. - Получите государство из магазина Redux, позвонив
getstate ()намагазинОтказ Держите его в переменнойПрелогайтеОтказ - Вернуть
СодержаниеиPredoadedStateОтказ Мы передам их на наш шаблон, чтобы получить финальную страницу HTML.
2 SRC/Template.js.
template.js Экспортирует функцию. Требуется Название , Государство и Содержание в качестве ввода. Он вводит их в шаблон и возвращает Final HTML-документ.
Пройти по состоянию, шаблон прикреплен Государство к окно .__ State__ внутри