Разница между WEB 1.0 и WEB 2.0 в контексте NodeJS

В контексте NodeJS разница между WEB 1.0 и WEB 2.0 проявляется в том, как сервер формирует ответ и кто отвечает за отображение контента.

WEB 1.0: сервер отдаёт HTML-файл

Сервер просто читает файл с диска и отправляет его как есть.

const fs = require('fs');
const http = require('http');

http.createServer((req, res) => {
  if (req.url === '/') {
    fs.readFile('./index.html', (err, data) => {
      if (err) {
        res.writeHead(404, { 'Content-Type': 'text/html' });
        res.end('<h1>404 Not Found</h1>');
      } else {
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.end(data);
      }
    });
  }
}).listen(3000);

— index.html — это готовый HTML-документ, написанный заранее.
— Нет данных из базы. Нет персонализации.
— При изменении контента — нужно менять файл на диске.
— Это статика. NodeJS здесь выступает как простой файловый сервер.

WEB 2.0: сервер отдаёт JSON, клиент рендерит UI

Сервер не отдаёт HTML — он отдаёт данные.

http.createServer((req, res) => {
  if (req.url === '/api/tasks') {
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify([
      { id: 1, title: 'Почитать', completed: false },
      { id: 2, title: 'Написать код', completed: true }
    ]));
  }
}).listen(3000);

— Клиент (браузер или мобильное приложение) делает запрос: fetch('/api/tasks')
— Получает JSON
— С помощью JavaScript (React, Vue, Vanilla JS) строит список задач в DOM
— При обновлении — новый запрос, новый JSON, обновление интерфейса

Это — чистый CSR (Client-Side Rendering).

SSR (Server-Side Rendering): HTML генерируется на сервере

Сервер динамически создаёт HTML на основе данных, и отправляет его уже готовым.

http.createServer((req, res) => {
  if (req.url === '/') {
    const tasks = [
      { id: 1, title: 'Почитать', completed: false },
      { id: 2, title: 'Написать код', completed: true }
    ];

    let html = `
      <!DOCTYPE html>
      <html>
        <body>
          <h1>Задачи</h1>
          <ul>
            ${tasks.map(t => `<li ${t.completed ? 'style="text-decoration:line-through"' : ''}>${t.title}</li>`).join('')}
          </ul>
          <script src="/app.js"></script>
        </body>
      </html>
    `;

    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end(html);
  }
}).listen(3000);

— Браузер получает полный HTML — сразу видит контент.
— После загрузки скрипта app.js — React (или другой фреймворк) «подключается» к этому HTML и добавляет интерактивность — это называется гидратация.
— SEO работает: поисковики видят полный контент.
— Пример: Next.js, Nuxt.js — NodeJS-сервер генерирует HTML на лету.

CSR (Client-Side Rendering): сервер отдаёт только оболочку

Сервер отдаёт минимальный HTML — без контента.

http.createServer((req, res) => {
  if (req.url === '/') {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end(`
      <!DOCTYPE html>
      <html>
        <body>
          <div id="root"></div>
          <script src="/bundle.js"></script>
        </body>
      </html>
    `);
  }
}).listen(3000);

— Браузер получает пустой div#root
— Загружается bundle.js (мега-файл с React, логикой, компонентами)
— Только после загрузки и выполнения JS — рендерится список задач
— Пока JS не загрузился — пользователь видит пустую страницу
— SEO сложный: поисковики могут не дождаться выполнения JS

Ключевое отличие

  • WEB 1.0 — HTML как файл.
  • CSR — HTML как результат работы JS на клиенте.
  • SSR — HTML как результат работы JS на сервере (с последующей гидратацией).

NodeJS позволяет реализовывать все три подхода.
WEB 1.0 — для статики.
CSR — для SPA и мобильных веб-приложений.
SSR — для SEO-чувствительных сайтов (магазины, новости, лендинги).

Выбор зависит от цели: скорость отображения, SEO, сложность, масштабируемость.