Иногда страницу нужно просто перезагрузить. Полностью. Не компонент, не блок, а именно целиком. Без обсуждений, без лишней логики. Например, чтобы:

  • экран с результатами обновлялся каждые 10 секунд;
  • интерфейс на стенде показывал последние данные без кнопок;
  • страницы в интранете не устаревали, пока никто не смотрит.

Это можно сделать в любой связке: HTML, JS, Python, PHP, Go, Node.js — не важно. Ну и если говорить совсем прямо, то совсем разных способов всего три, а остальное просто вариации.

Фронтенд. Просто и честно

Вы контролируете браузер и можете напрямую ему сказать: обновляй страницу каждые 10 секунд.

Вариант 1. Чистый JavaScript

Самый простой вариант — setTimeout' с указанием задержки и locaiton.reload ()'.

<script>
  setTimeout(() => {
    location.reload();
  }, 10000); // каждые 10 секунд
</script>

Если нужно повторять бесконечно, используйте setInterval:

<script>
  setInterval(() => {
    location.reload();
  }, 10000);
</script>

Лучше setInterval — он очевиднее: не требует самому снова ставить setTimeout.

Вариант 2. Автоперезагрузка без JS

<meta http-equiv="refresh" content="10">

Работает вообще без JS, как говорится, «на чистом HTML». Если задача — просто крутить страницу на Raspberry Pi с открытым браузером — подходит идеально.

Вариант 3. React / Vue / любой SPA

Тот же setInterval:

useEffect(() => {
  const id = setInterval(() => {
    window.location.reload();
  }, 10000);
  return () => clearInterval(id);
}, []);

Даже в самых модных UI-фреймворках обновление страницы — не сложнее, чем в 2002 году.

Бэкенд. Если хочется контролировать обновление с сервера

Здесь подход другой: сделать так, чтобы клиент обновился, но не сам по себе, а по нашей команде. Хотя перезагружается всё равно браузер.

Node.js (Express)

res.send(\`
  <html>
    <head><meta http-equiv="refresh" content="10"></head>
    <body>Лидерборд тут</body>
  </html>
\`);

Этот способ хорош, если вы отдаёте полностью статичную страницу и хотите, чтобы обновление происходило без участия JavaScript. Работает надёжно, поддерживается даже в очень старых браузерах. Но вы не сможете гибко управлять таймером с сервера или отменить его динамически.

res.send(\`
  <script>
    setInterval(() => location.reload(), 10000);
  </script>
\`);

Более гибкий способ через JS: можно легко изменить интервал, добавить условия (например, перезагружать только при определённом флаге), остановить таймер, если нужно. Подходит, если вы рендерите страницу на сервере, но хотите контролировать поведение уже на клиенте.

Python (Flask)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '''
    <html>
      <head><meta http-equiv="refresh" content="10"></head>
      <body>Лидерборд тут</body>
    </html>
    '''

Преимущества те же, что у варианта с meta выше. Если в будущем потребуется гибкость — например, включать/выключать автообновление, менять интервал или обновлять не всю страницу, а данные — лучше сразу использовать шаблонный движок (Jinja2) и подключать JS с setInterval. Тогда легко будет переключиться с «перезагрузки страницы» на «подгрузку данных».


PHP

<?php
header("Refresh:10");
?>
<html>
<body>Лидерборд тут</body>
</html>

Этот способ хорош своей лаконичностью — всего одна строка PHP-кода, и страница будет автоматически перезагружаться каждые 10 секунд. Заголовок Refresh — это простой, но неофициальный способ указать браузеру обновить страницу. Он не входит в стандарт HTTP, но поддерживается большинством браузеров, особенно если вы отдаёте контент как text/html.

Однако есть и минусы:

  • у Refresh нет гибкости: нельзя отменить его динамически, нельзя обновить только часть страницы;
  • он работает только при первом ответе — вы не сможете поменять интервал через JavaScript без полной перерисовки страницы;
  • не все клиенты/прокси любят нестандартные заголовки, особенно если вы используете строгую конфигурацию сервера.

Go (net/http)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, \`
    <html>
      <head><meta http-equiv="refresh" content="10"></head>
      <body>Лидерборд тут</body>
    </html>\`)
}

Работает на любом Go-сервере, не требует шаблонов.

Если хотите обновлять только по изменению версии

Дополнительный пункт, если не хочется перезагружать зря. Простая идея: сервер пишет новую версию в файл или строку — клиент следит и реагирует. Но используйте на свой страх и риск.

let lastVersion = null;

setInterval(() => {
  fetch('/version.txt')
    .then(res => res.text())
    .then(version => {
      if (version !== lastVersion) {
        location.reload();
        lastVersion = version;
      }
    });
}, 10000);

Если браузер должен перезагружаться — он это может, просто отдайте команду. Можно не запоминать детали. Главное — знать: в любом языке или технологии можно сказать «обновись», и браузер поймёт.