Как создать собственное приложение с серверным рендерингом?

Как работает асинхронная перезагрузка страницы с использованием SSR и гибридного режима? Есть ли доступные статьи или руководства, которые демонстрируют примеры самостоятельной реализации SSR с асинхронной перезагрузкой страницы, без привязки к конкретному фреймворку?
  • 17 января 2024 г. 10:20
Ответы на вопрос 2
Создание собственного веб-приложения с серверным рендерингом (Server-Side Rendering, SSR) требует понимания того, как работает веб и что происходит при SSR. Для демонстрации будем использовать Node.js в качестве серверной платформы и пример с асинхронной загрузкой данных, но без использования готовых фреймворков типа Next.js или Nuxt.js.

### Основные шаги для реализации SSR:

1. **Создать веб-сервер на Node.js:** Это можно сделать с помощью популярных библиотек, таких как Express.js или Koa.js, которые упростят обработку HTTP-запросов.

2. **Рендеринг HTML на сервере:** Вам потребуется шаблонизатор (например, EJS, Pug или Handlebars), чтобы сгенерировать HTML на основе ваших данных на сервере.

3. **Асинхронная загрузка данных на сервере:** Перед рендерингом страницы вам необходимо загрузить все необходимые данные асинхронно (используя `fetch`, `axios` или любую другую библиотеку для выполнения HTTP-запросов).

4. **Отправка сгенерированных HTML-страниц клиенту:** После загрузки данных и рендеринга страницы HTML отправляется клиенту, который затем может взаимодействовать с загруженной страницей.

5. **Гидрация на клиенте:** Если ваше приложение также представляет собой одностраничное приложение (SPA), то JavaScript, выполняемый на клиенте, "гидрирует" страницу, придавая ей динамическое поведение. Это означает, что клиентский JavaScript подключает обработчики событий и активирует интерактивные компоненты приложения.

### Пример реализации SSR на Node.js:

```javascript
const express = require('express');
const fetch = require('node-fetch');
const ejs = require('ejs');

const app = express();

// Настройка EJS для рендеринга HTML
app.set('view engine', 'ejs');

// Обработка запроса к корню сайта
app.get('/', async (req, res) => {
  // Асинхронно получаем данные, например, из API
  const apiUrl = 'https://example.com/data';
  const response = await fetch(apiUrl);
  const data = await response.json();
  
  // Рендерим страницу с использованием данных
  res.render('index', { data });
});

// Запускаем сервер
const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});
```

### Ресурсы для изучения:

- **Официальные документации библиотек и инструментов:** Лучше всего начинать с чтения официальной документации по Node.js, Express.js и выбранной библиотеке для HTTP-запросов (например, `fetch`).
- **Статьи и учебные пособия:** Ищите статьи и руководства от разработчиков, делящихся опытом создания SSR-приложений без фреймворков. Вероятно, что большинство статей будут связаны с использованием React, Vue или Angular на сервере, но принципы будут те же.
- **Сообщество разработчиков:** Форумы вроде Stack Overflow, Reddit или сайты типа Medium могут дать вам много сведений и примеров кода от других разработчик
SSR - это когда сервер отдает уже готовый HTML без необходимости дополнительной загрузки скриптов и прочего. Т.е. статическая страница с формами. 
Как это работает:
- Есть изначальная страница
- Клиент тыкает на кнопку
- Отправляется запрос на сервер
- Сервер отдает HTML страницу с уже данными и другой информацией

Что такое заполненные данные:
- Если это постраничный вывод списка, то уже готовая страница списка - при нажатии на "Следующая страница" сервер отдает HTML где есть эта следующая страница с захардожеными числами
- Если это таблица (tr/td/td), то полностью заполненная таблица

Нет здесь никакой магии.
P.S. js может быть, но смысл в том, что клиенту отдается уже готовая страница с заполненными данными.

Это может быть полезно в случаях:
- Когда выполнение js запрещено (безопасность)
- Когда конечные пк (пользователей) слабые для js
- Когда проще сделать так (например, ты не знаешь js)
Похожие вопросы