Как посчитать время чтения текста (и добавить индикатор на сайт)

Инструкция по добавлению индикатора времени чтения текста на сайт.

Как посчитать время чтения текста (и добавить индикатор на сайт)
Дата публикации
22.06.24
Дата обновления
16.05.26
Время чтения
4 мин.

Индикатор времени чтения — простая деталь, которая улучшает пользовательский опыт: читатель сразу понимает, сколько времени займёт статья.

В этой статье разберём:

  • как считается время чтения;
  • какую скорость брать за основу;
  • как реализовать расчёт на JavaScript / TypeScript.

Как быстро посчитать время чтения текста

Базовая логика очень простая:

  • считаем количество слов в тексте;
  • делим на среднюю скорость чтения.

Формула расчёта

Формула выглядит так:

время чтения (мин) = количество слов / скорость чтения

Чтобы избежать значения 0 минут, результат обычно округляют вверх.

Пример расчёта

700 слов / 140 слов в минуту ≈ 5 минут

Какая скорость чтения считается нормальной

Единого стандарта нет, но обычно используют такие значения:

  • 100–120 слов/мин — сложный или технический текст
  • 130–160 слов/мин — обычные статьи
  • 180+ слов/мин — лёгкое чтение

Для блога с техническим контентом разумно брать около 140 слов в минуту — это даёт более реалистичную оценку.

Подсчёт количества слов

Начнём с функции подсчёта слов. Один из самых простых вариантов — использовать регулярное выражение:

export const countWords = (str: string) => {
  const words = str.match(/[ЁёА-я\w\d\’\'-]+/gi);
  return words ? words.length : 0;
};

Важный момент

Обратите внимание на часть:

ЁёА-я

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

Тесты для функции подсчёта слов

После этого я написал несколько тестов для функции countWords, вот один из них для примера:

it("should return correct value for cyrillic string", () => {
  // arrange
  const expectedResult = 1;
  const inputValue = "тест";

  // act
  const result = countWords(inputValue);

  // assert
  expect(result).toBe(expectedResult);
});

Расчёт скорости чтения

Теперь подсчитаем количество слов:

const AVERAGE_READ_SPEED = 140; //Слов в минуту

export const getReadTime = (content: string) => {
  return Math.ceil(countWords(content) / AVERAGE_READ_SPEED);
};

Не забудьте про округление

Обратите внимание на вызов:

Math.ceil()

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

Тесты для функции подсчёта времени чтения

it("should return 0 for an empty string", () => {
  // arrange
  const expectedResult = 0;
  const inputValue = "";

  // act
  const result = getReadTime(inputValue);

  // assert
  expect(result).toBe(expectedResult);
});

it("should return 1 for not empty string", () => {
  // arrange
  const expectedResult = 1;
  const inputValue = "тест";

  // act
  const result = getReadTime(inputValue);

  // assert
  expect(result).toBe(expectedResult);
});

Ограничения подхода

Важно понимать, что это приближённая оценка:

  • не учитывается сложность текста;
  • не учитываются изображения, код и форматирование;
  • скорость чтения у разных людей отличается.

Тем не менее, для большинства блогов такой расчёт даёт достаточно точный результат.

Где это может пригодиться

Индикатор времени чтения полезен не только разработчикам, но и:

  • авторам блогов;
  • копирайтерам;
  • SEO-специалистам;
  • редакторам;
  • студентам;

Это простой способ сделать контент более предсказуемым для читателя.

Как проверить результат

Если вы хотите быстро проверить любой текст без кода, можно воспользоваться текстовым калькулятором: вставить текст и сразу получить количество слов и примерное время чтения.

На этом всё! Спасибо за внимание!

Расскажите о вашем проекте

Связаться иначе

Часто задаваемые вопросы

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

Количество слов ÷ скорость чтения (слов в минуту), результат округляют вверх, чтобы не показывать «0 мин». Пример: 700 ÷ 140 ≈ 5 мин. Формула — в разделе быстрый расчёт.

Единого стандарта нет: для технических статей часто 100–120 сл/мин, для обычных — 130–160. В статье для блога взят ориентир ~140 сл/мин — см. нормальная скорость.

Регулярка должна включать ЁёА-я — иначе кириллица не попадёт в подсчёт. Функция countWords и тесты — в разделах подсчёт слов и кириллица.

Чтобы короткий текст не давал 0 минут: даже одно слово показывается как «1 мин». Код getReadTime — в разделе расчёт времени, про округление — отдельно.

Это приближение: не учитываются картинки, блоки кода, сложность и разная скорость читателей. Для большинства блогов этого достаточно — см. ограничения.

Вставьте текст в текстовый калькулятор — сразу увидите число слов и примерное время. Раздел как проверить результат.

Вам может быть интересно

Добавляем рекомендации постов и блок "Поделиться в соц. сетях"
Добавляем рекомендации постов и блок "Поделиться в соц. сетях"

Добавляем рекомендации постов и блок "Поделиться в соц. сетях"

4 мин.

Изучали различные блоги, аналогичные нашему и решили добавить блок "Поделиться в соц. сетях", а так же простейший механизм рекомендаций статей. Вот что из этого вышло...

Пост#туториалы
Добавляем пагинацию в статический блог на Next.js
Добавляем пагинацию в статический блог на Next.js

Добавляем пагинацию в статический блог на Next.js

4 мин.

Инструкция по добавлению пагинации постов в статическом блоге на Next.js...

Пост#туториалы#nextjs
Добавляем кнопку для сбора пожертвований (донатов) к блогу
Добавляем кнопку для сбора пожертвований (донатов) к блогу

Добавляем кнопку для сбора пожертвований (донатов) к блогу

6 мин.

Инструкция по добавлению кнопки для сбора пожертвований (донатов) к блогу...

Пост#туториалы
Добавляем поиск по тегам в статический блог на Next.js
Добавляем поиск по тегам в статический блог на Next.js

Добавляем поиск по тегам в статический блог на Next.js

5 мин.

Инструкция по добавлению простейшего поиска по тегам в статическом Next.js блоге...

Пост#туториалы#nextjs
Борьба с грамматическими ошибками в markdown файлах
Борьба с грамматическими ошибками в markdown файлах

Борьба с грамматическими ошибками в markdown файлах

3 мин.

Инструкция по использованию LTеX для борьбы с грамматическими ошибками в .md файлах...

Пост#инструменты
Добавляем поддержку MDX в Next.js приложение
Добавляем поддержку MDX в Next.js приложение

Добавляем поддержку MDX в Next.js приложение

3 мин.

Инструкция по добавлению поддержки MDX в Next.js приложение...

Пост#nextjs
Добавляем подсветку кода (синтаксиса) в статический блог на Next.js
Добавляем подсветку кода (синтаксиса) в статический блог на Next.js

Добавляем подсветку кода (синтаксиса) в статический блог на Next.js

4 мин.

Инструкция по добавлению подсветки кода (синтаксиса) в статическом блоге на Next.js...

Пост#туториалы#nextjs
Автопостинг в VK через RSS feed
Автопостинг в VK через RSS feed

Автопостинг в VK через RSS feed

4 мин.

Заметили в настройках сообщества в VK интересную настройку, связанную с фидами. И понеслось...

Пост#соцсети#фиды
Текстовый калькулятор
Текстовый калькулятор

Текстовый калькулятор

Утилита для подсчёта длины, количества слов и примерного времени чтения текста/статьи онлайн.

Инструмент#calculator