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

  • экран с результатами обновлялся каждые 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);

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


«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.

ТелеграмПодкастБесплатные учебники

Читать дальше

FormControl и FormGroup в Angular

FormControl и FormGroup в Angular

Если вы разрабатываете веб-приложение, вам рано или поздно придётся собирать данные от пользователя. К счастью, реактивные формы в Angular позволяют делать это без лишней сложности — без нагромождения директив и с минимальным количеством шаблонного кода. Более того, их просто валидировать, так что можно обойтись даже без end-to-end тестов.

Говоря проще, form control’ы в Angular дают полный контроль разработчику — ничего не происходит автоматически, и каждое решение по вводу и управлению принимается явно и осознанно. В этом руководстве мы покажем, как объединять form control’ы в form group’ы, чтобы структурировать форму и упростить доступ к её элементам — как к логическим блокам. Чтобы лучше понять, как работают form group’ы в Angular, мы шаг за шагом соберём реактивную форму.

Для работы с примером скачайте стартовый проект с GitHub и откройте его в VS Code. Если ещё не обновляли Angular, поставьте актуальную на момент написания версию — Angular v18.

Читать дальше
JS
  • 1 июня 2025
AOT против JIT-компилятора: что лучше для разработки на Angular?

AOT против JIT-компилятора: что лучше для разработки на Angular?

Angular — один из самых популярных фреймворков для фронтенда — предлагает два подхода к компиляции: предварительная компиляция и динамическая компиляция во время выполнения. Оба метода играют важную роль в оптимизации приложений на Angular и повышении их производительности. В этом материале мы рассмотрим различия между ними, их преимущества и разберёмся, когда стоит использовать каждый из подходов.

Читать дальше
JS
  • 25 мая 2025
Динамические формы в Angular 19: пошаговое руководство

Динамические формы в Angular 19: пошаговое руководство

Формы — неотъемлемая часть большинства веб-приложений: будь то регистрация, ввод данных или опросы. Модуль реактивных форм в Angular отлично подходит для создания статичных форм, но во многих случаях требуется, чтобы форма могла динамически адаптироваться в зависимости от действий пользователя или внешних данных.

В этой статье мы рассмотрим, как создавать динамические формы с использованием автономных компонентов в Angular 19, применяя модульный подход, который избавляет от необходимости использовать традиционные модули Angular. В сопроводительном репозитории на GitHub для оформления форм используется Tailwind CSS, однако в статье внимание сосредоточено исключительно на логике динамических форм. Tailwind и связанные с ним настройки намеренно не включены в примеры, чтобы сохранить акцент на основной теме.

Читать дальше
JS
  • 25 мая 2025
Как обнаружить изменения в Angular: пошаговая инструкция

Как обнаружить изменения в Angular: пошаговая инструкция

Как разработчики на Angular, мы нередко задумываемся, как фреймворк отслеживает изменения в данных и затем отображает их во вьюхе. Этот процесс называется стратегией обнаружения изменений в Angular. В этом материале мы разберёмся, как это работает, и научимся выбирать подходящую стратегию для разных сценариев.

Читать дальше
JS
  • 24 мая 2025
Компоненты в Angular 18: пошаговое руководство

Компоненты в Angular 18: пошаговое руководство

Angular развивается стремительно, и с выходом версии 18 появились новые возможности, которые разработчики могут использовать в своей работе. Одним из ключевых изменений в Angular 18 стало удаление традиционного файла app.module.ts — ему на смену пришли standalone-компоненты. Если вы только начинаете работать с Angular или переходите с более ранней версии, это пошаговое руководство поможет вам разобраться в базовых принципах компонентов в Angular 18. Независимо от вашего уровня — новичок вы или опытный разработчик — этот туториал покажет, как создавать, управлять и эффективно использовать компоненты в Angular.

Читать дальше
JS
  • 19 мая 2025
Полное руководство по Angular @if

Полное руководство по Angular @if

Одно из самых заметных нововведений в Angular — это встроенный синтаксис для управляющих конструкций, который появился в версии 17. Он решает одну из самых частых задач, с которой сталкивается каждый разработчик: показывать или скрывать элементы на странице в зависимости от условия. Раньше для этого использовали привычную структурную директиву *ngIf. Теперь у нас есть более современная альтернатива — синтаксис @if, часть нового подхода к управлению шаблоном.

В этом гайде мы сравним оба варианта, разберёмся, чем @if лучше, и покажем, как можно перейти на него автоматически. Также поговорим об одной распространённой ошибке — о том, как не стоит использовать @if вместе с пайпом async.

Читать дальше
JS
  • 18 мая 2025
Модули Angular для организации кода и ленивой загрузки

Модули Angular для организации кода и ленивой загрузки

Модули — один из ключевых инструментов Angular для построения масштабируемых и поддерживаемых приложений. В этой статье мы подробно рассмотрим:

  • что такое модули в Angular;
  • зачем они нужны;
  • как их использовать для структурирования кода;
  • как реализовать «ленивую» загрузку модулей;
  • и чем отличаются Feature, Core и Shared модули.

Если вы только начинаете изучать Angular или хотите углубить свои знания, эта статья поможет вам лучше понять, как правильно организовать архитектуру Angular-приложения.

Читать дальше
JS
  • 12 мая 2025
Навигация в Angular: RouterLink, Router.navigate и Router.navigateByUrl

Навигация в Angular: RouterLink, Router.navigate и Router.navigateByUrl

Директива RouterLink позволяет настраивать переходы между маршрутами прямо в шаблоне Angular. А методы Router.navigate и Router.navigateByUrl, доступные в классе Router, дают возможность управлять навигацией программно — прямо из кода компонентов.

Разберёмся, как работают RouterLink, Router.navigate и Router.navigateByUrl.

Читать дальше
JS
  • 11 мая 2025
Полное руководство по Lazy Loading в Angular

Полное руководство по Lazy Loading в Angular

Если вы создаёте большое Angular-приложение, вам наверняка важно, чтобы оно загружалось быстро. Представьте, что вы устраиваете вечеринку и хотите подавать закуски не сразу, а по мере прихода гостей, чтобы не перегрузить кухню. «Ленивая» загрузка в Angular работает примерно так же: вместо того чтобы загружать всё приложение целиком сразу, вы подгружаете только те части, которые нужны — и только когда они нужны.

В этом пошаговом руководстве мы разберём, как реализовать lazy loading в Angular.

Читать дальше
JS
  • 10 мая 2025