Вставьте исходный код страницы — и увидите её глазами нашего
обходчика: заголовок, описание, канонический адрес, заголовки первого уровня,
объём видимого текста и то, сколько весит разметка. Ровно те же выражения,
что и в нашем коде, — не «похожая логика», а её копия, сверяемая тестом.
Почему вставить, а не ввести адрес. Сходить по адресу
страница не может: браузер запрещает, а сервер, который сделал бы это за вас,
узнал бы, какие адреса вы проверяете. Исходный код открывается в браузере
сочетанием Ctrl+U (⌥⌘U на Mac).
")
.reduce((sum, m) => sum + new TextEncoder().encode(m).length, 0),
text: html.replace(/<(script|style)[^>]*>[\s\S]*?<\/\1>/gi, " ")
.replace(TAG, " ").replace(/\s+/g, " ").trim()
};
}
// RU: Замечания — те же пороги, что в нашем аудите: заголовок до 70 символов,
// описание до 180, один h1. Пороги названы числами прямо в тексте замечания:
// «слишком длинный» без числа заставляет гадать, насколько.
// EN: The remarks use the same thresholds as our own audit: a title up to 70 characters, a
// description up to 180, one h1. The thresholds are named as numbers inside the remark: "too
// long" without a number leaves people guessing by how much.
const TITLE_MAX = 70;
const DESCRIPTION_MAX = 180;
function pageRemarks(page) {
const remarks = [];
if (!page.title) remarks.push("нет заголовка — в выдаче он и есть ссылка");
else if (page.title.length > TITLE_MAX) {
remarks.push("заголовок длиннее " + TITLE_MAX + " символов (" + page.title.length +
"): хвост обрежется в выдаче");
}
if (!page.description) remarks.push("нет описания: сниппет соберётся из текста наугад");
else if (page.description.length > DESCRIPTION_MAX) {
remarks.push("описание длиннее " + DESCRIPTION_MAX + " символов (" +
page.description.length + ")");
}
if (page.h1.length === 0) remarks.push("нет h1: у страницы нет главного заголовка");
if (page.h1.length > 1) remarks.push("h1 больше одного (" + page.h1.length +
"): непонятно, о чём страница");
if (!page.canonical) remarks.push("нет канонического адреса: дубликаты разойдутся по индексу");
if (page.text.length < 200) {
remarks.push("видимого текста " + page.text.length +
" символов: индексировать почти нечего");
}
return remarks;
}
// ==== /ЯДРО ====
const $ = id => document.getElementById(id);
const NAMES = {title: "Заголовок", description: "Описание", canonical: "Канонический адрес",
h1: "Заголовки h1", scripts: "Скриптов", bytes_html: "Размер разметки, байт",
inline_css: "Стили в странице, байт", inline_js: "Скрипты в странице, байт"};
$("run").addEventListener("click", () => {
const page = inspectPage($("html").value);
const remarks = pageRemarks(page);
const box = $("out");
box.className = "verdict " + (remarks.length ? "no" : "yes");
box.innerHTML = remarks.length
? "Замечаний: " + remarks.length + "
" +
remarks.map(x => "· " + x).join(" ") + "
"
: "Замечаний нет
Страница читается так, как задумана.
";
const rows = ["
Поле
Что видим
"];
for (const key of Object.keys(NAMES)) {
const value = Array.isArray(page[key]) ? page[key].join(" · ") : page[key];
rows.push("