Как я проверяю, видит ли поиск SPA на JavaScript

20.10.2026 · 7 мин чтения
Тёмная стеклянная плита с коралловой кромкой на чёрном фоне
Когда сайт собран как одно приложение на JavaScript, я начинаю с ответа сервера. Человек на экране уже видит разделы, текст и меню. В первом HTML этого набора может не оказаться. Ниже мой обычный проход: что приходит роботу до отрисовки, чем готовый документ отличается от пустой оболочки и как я сверяю заголовок, текст и ссылки. Фраза в ответе сервера ещё не место в поиске. Это только знак, что страница доехала как документ.

Зачем я отдельно смотрю такой сайт

Такой сайт я для себя называю SPA: одно приложение, которое держит разделы внутри общей оболочки. На адрес приезжает один HTML. Дальше скрипты подменяют куски — каталог, статью, карточку. Строка браузера может обновиться, а сервер при этом новую страницу не собирает. Фильтр срабатывает сразу, переход внутри сайта не моргает пустым экраном. Человеку так спокойнее.
Робот просит конкретный адрес и читает то, что пришло в ответ. Отрисовку скриптов часть поисковых систем делает отдельным проходом, часть пропускает. Второй проход я не ставлю вместо проверки первого документа. Пока в исходном HTML нет заголовка, текста и ссылок, вопрос для меня открыт.
Имя сборки на эту проверку не влияет. Свой код и готовый каркас задают один вопрос: есть ли у публичного адреса собственный документ. В проход беру раздел услуги, карточку и статью. Кабинет, корзина и экраны после входа живут для человека, который уже вошёл. В сверку с поиском я их не кладу.

Что робот получает до отрисовки

Беру адрес, который должен открываться сам, и вставляю его в строку браузера. Клик по меню внутри приложения часто меняет только экран. Прямой заход показывает ответ именно на этот адрес. Если по клику карточка полная, а прямой заход отдаёт страницу ошибки, у адреса нет своего документа на сервере.
Дальше смотрю два вида одного URL. Готовый экран — страница после скриптов, так её видит человек. Исходный код — ответ до отрисовки. Дерево в инспекторе элементов собирается уже после скриптов, поэтому заголовок и абзацы там находятся почти всегда. Для сверки с первым ответом сервера я открываю исходный код.
В этом коде ищу заголовок окна, главный заголовок в теле, основной текст и ссылки с адресами. Скрипты в голове документа пробелом не считаю. Пробел там, где без них пропадает смысл страницы. Короткий файл с контейнером, списком скриптов и надписью о загрузке — оболочка: робот на первом шаге получил её.
Что открываюЧто в нём лежитЧто для меня значит
Готовый экран в браузереСтраница после скриптовТак сайт видит человек
Исходный код того же адресаОтвет сервера до отрисовкиТак выглядит первый документ
Тот же раздел, открытый напрямуюСвой HTML или снова оболочкаЕсть ли у адреса собственная страница
Пустая тёмная рамка рядом со сплошной плитой с коралловым краем
Слева ответ-оболочка, справа документ, в котором содержание уже лежит.

Чем серверный HTML отличается от пустой оболочки

Готовый серверный HTML читается и без скриптов. В исходном коде уже лежат название раздела, абзацы и ссылки на соседние страницы. Смысл страницы на месте, даже если представить скрипты выключенными. Такой документ я и жду от публичного адреса.
Пустая оболочка устроена наоборот. На публичные адреса приезжает общий каркас, а содержание дорисовывается потом. На экране сайт выглядит целым. В первом ответе это короткий файл, и на главной он часто совпадает с файлом внутреннего адреса. Одинаковый короткий ответ на разных адресах для меня знак: разделы ещё не стали отдельными документами.
  • В исходном коде контейнер и файлы скриптов, а заголовка раздела нет
  • У главной и у внутреннего адреса один и тот же короткий title
  • Фраза с экрана в исходном коде не находится
  • Пункты меню собраны кнопками, адреса у них нет
  • Прямой заход на раздел отдаёт ту же оболочку или страницу ошибки
Отличие фиксирую по адресу. Главная бывает документом, а карточки живут только в скриптах. Общая оболочка на публичные адреса — тема для разговора с разработкой.

Как я проверяю заголовок

Заголовок читаю в исходном коде, в двух местах. Первое — title в голове документа. Второе — главный заголовок в теле. Формулировки могут различаться, оба должны говорить о разделе, который открыт по этому адресу. Общее имя сайта в title допустимо как добавка. Заменой названия раздела оно не работает.
Потом кладу рядом экран. На экране заголовок про конкретную услугу, а в исходном коде только имя сайта — заголовок дорисовал скрипт. Для человека страница собрана. Для первого ответа робота это оболочка с чужим названием.
Так же открываю второй адрес напрямую и снова читаю title в его исходном коде. Одинаковый title на двух адресах значит, что у разделов нет своих заголовков в документе. Смена title уже после загрузки экрана этот пробел не закрывает: я смотрю то, что пришло до отрисовки.
Пустой title и title из одного имени бренда на всех адресах записываю отдельно. В первом HTML заголовка раздела нет.

Как я проверяю текст

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

Как я проверяю ссылки

Ссылкой считаю адрес, который открывается без приложения. В исходном коде ищу обычные ссылки с адресом в href. Кнопка, которая только слушает нажатие, на экране похожа на пункт меню. В документе перехода нет, и роботу идти некуда.
Беру несколько переходов: раздел из меню, соседнюю карточку, ссылку из текста. Для каждого записываю адрес и смотрю две вещи. Есть ли он в исходном коде страницы, с которой я начал. Открывается ли он напрямую и лежит ли в нём свой заголовок и свой текст.
Адрес с решёткой разбираю отдельно. Если после решётки меняется кусок внутри одного документа, отдельной страницы у раздела нет. Обычный путь сервер принимает как свой адрес: его можно вставить в строку и запросить ещё раз. Такой путь и попадает в мою записку как кандидат на документ.
В сверку беру внутренние переходы: по ним робот мог бы найти другие публичные адреса. Пока они живут только в скрипте, документы между собой не связаны.
Где смотрюЧто хочу увидеть
Пункт меню на экранеТот же адрес записан в исходном коде
Ссылка в тексте или карточкеПрямой заход отдаёт свой документ
Адрес с решёткойОтдельная страница или кусок одной оболочки
Кнопка без адресаНа экране переход есть, в первом HTML его нет
Три тёмных куба, соединённые тонкими коралловыми лучами
Ссылкой считаю адрес, записанный в документе.

Что я отдаю после проверки

Приложение я не переписываю и способ сборки не выбираю. На выходе короткая записка: адрес, чего не хватает в первом HTML, что при этом видно на экране. Пробел бывает в своём заголовке, в основном тексте или в ссылках с адресами. Иногда пробелов несколько, и я так и пишу, по каждому адресу отдельно.
Разработчику этого хватает, чтобы решить, как отдать готовый документ. Сервер может собрать HTML в ответ на запрос. Готовую копию страницы можно подготовить заранее и отдавать её на прямой заход. Оба пути про одно: на публичный адрес приезжает готовый документ. Какой путь короче в их коде, оставляю им.
Закрытые экраны в записку не кладу. Страница для вошедшего человека может оставаться оболочкой. Путать её с публичным разделом не стоит: у них разная задача. Публичный адрес, которым делятся и на который ведут из меню, я жду документом.

Порядок, которого я держусь

Порядок короткий. Готовый экран легко принять за готовность страницы для робота. Поэтому сначала документ, потом сравнение с тем, что нарисовано.
  1. Беру публичный адрес и открываю его напрямую.
  2. Читаю исходный код страницы, дерево после скриптов оставляю для сверки экрана.
  3. Сверяю title и главный заголовок с тем, что видно на экране.
  4. Ищу в коде фразу из основного текста, не из шапки.
  5. Проверяю, что внутренние переходы записаны адресами.
  6. Повторяю прямой заход на соседние разделы.
  7. Пишу, чего нет в первом HTML, и место в поиске не обещаю.
Тёмное кольцо над матовой плитой, снизу коралловый отсвет
Тот же проход повторяю на соседнем адресе, не только на главной.
Проверка отвечает на один вопрос: что робот получает до отрисовки. Совпадение экрана и документа — спокойная основа, чтобы дальше работать со страницей. Расхождение — повод отдать адрес в разработку. Ни совпадение, ни расхождение не говорят, что страница уже стоит в поиске или что её туда возьмут. Место в выдаче этой проверкой я не обещаю.
SEO

Сверю оболочку и документ

Возьму публичный адрес, сравню исходный код с экраном и покажу, на месте ли заголовок, текст и ссылки до отрисовки.
Интернет-маркетолог и автор материала
Читайте также