Тест на готовность к веб-разработке
Блоки идут в порядке "сеть → архитектура → HTML → CSS → JS". Если проваливается блок 1, имеет смысл сначала раздел "Сеть и интернет"; если 3–5 — главы HTML/CSS/JS. Разбор открывайте после своих ответов.
После теста отметьте интерес к веб-направлению в Навигаторе новичка и профилей, чтобы увидеть баланс между frontend, backend и смежными сферами.
| Блок | Минимум перед углублением |
|---|---|
| 1–2 | Понимаете путь запроса и роли фронта/бэка |
| 3–5 | Можете набросать разметку, стили и простой скрипт |
1 — Сеть и HTTP
Вопросы
- Пользователь вводит
https://example.com/page— назовите четыре шага до отображения HTML (без мельчайших деталей TLS). - Ошибка браузера
DNS_PROBE_FINISHED_NXDOMAIN— что это значит простыми словами? - Чем домен отличается от хостинга?
- Сервер отвечает 404 на
/api/users, хотя "маршрут есть". Две правдоподобные причины. - Форма логина отправляет пароль — какой HTTP-метод обычно выбирают и почему не GET?
Задачи
Задача 1.
Сайт не открывается только у одного пользователя, у остальных работает. Две команды/действия для проверки DNS (названия достаточно).
Задача 2.
На хостинге лежит about.html, при открытии сайта виден список файлов, а не страница. В чём типичная причина и исправление?
Разбор: блок 1
Вопросы
- DNS → IP; TCP-соединение; HTTP-запрос; ответ + разбор HTML/CSS/JS браузером.
- DNS не нашёл имя (опечатка, домен не существует, сбой DNS у клиента).
- Домен — адрес; хостинг — сервер/место, где лежат файлы и крутится приложение.
- Другой путь (
/api/v1/users), другой порт/хост, фронт бьёт не туда; сервер не перезапущен; reverse proxy режет префикс. - POST — данные в теле запроса, не в URL и не в истории браузера.
Задачи
Задача 1.
nslookup example.com или dig example.com; смена DNS на 8.8.8.8 / 1.1.1.1 для проверки.
Задача 2.
Нет индексного файла (index.html). Переименовать главную страницу в index.html или настроить index в конфиге веб-сервера.
2 — Фронтенд, бэкенд, API
Вопросы
- Статический сайт и веб-приложение — в чём разница для пользователя?
- Что такое API между фронтом и бэком одной фразой?
- Заметки пропадают после F5. Какого компонента не хватает в архитектуре?
- POST на
/api/loginс другого origin — ошибка CORS. Кто должен разрешить запрос? - SSR и CSR — где собирается HTML первой версии страницы?
Задачи
Задача 1.
Опишите минимальный набор — UI (форма + список), HTTP-методы и эндпоинт, хранение для заметок после перезагрузки.
Задача 2.
Фронт на https://app.example.com, API на https://api.example.com. Какие заголовки CORS должен отдать бэкенд (названия, не обязательно все значения)?
Разбор: блок 2
Вопросы
- Статика — одни и те же файлы всем; приложение — данные и UI меняются от действий и сервера.
- Договорённый набор URL и форматов обмена (часто JSON).
- Бэкенд + БД (или хотя бы серверное хранилище); одного
localStorageдля "настоящего" приложения мало. - Сервер API — заголовки
Access-Control-Allow-*(часто middlewarecors). - SSR — на сервере; CSR — в браузере после загрузки JS.
Задачи
Задача 1.
Фронт: форма, fetch POST/GET /api/notes. Бэкенд — маршруты, модель { id, text }, SQLite/PostgreSQL.
Задача 2.
Access-Control-Allow-Origin (конкретный origin, не * с credentials), Access-Control-Allow-Methods, Access-Control-Allow-Headers; для preflight — ответ на OPTIONS.
3 — HTML
Вопросы
- Зачем теги
<main>,<article>,<nav>вместо одних<div>? <img>безalt— кому это мешает?- Как связать
<label>с полем ввода? target="_blank"безrel="noopener"— какой риск?- Незакрытый
<div>внутри<p>— почему это плохо?
Задачи
Задача 1.
Скелет статьи — шапка с <nav>, <main>, <article> с заголовком, автором, датой и абзацем текста (теги без CSS).
Задача 2.
Форма — email, пароль, "Войти", ссылка "Забыли пароль?" — с доступностью (label, type, required).
Разбор: блок 3
Вопросы
- Смысл для SEO и скринридеров; не только "коробки".
- Скринридеры, нет текста при ошибке загрузки картинки.
- Атрибут
forу label =idу input. - Новая вкладка может получить
window.opener— утечка контекста;noopenerразрывает связь. - Браузер "чинит" DOM непредсказуемо, ломается вёрстка и доступность.
Задачи
Задача 1–2.
См. эталон в главе HTML или минимальный вариант:
<header><nav><a href="/">Главная</a></nav></header>
<main>
<article>
<h1>Заголовок</h1>
<p><small>Автор, дата</small></p>
<p>Текст.</p>
</article>
</main>
<form action="/login" method="post">
<label for="email">Email</label>
<input id="email" name="email" type="email" required>
<label for="password">Пароль</label>
<input id="password" name="password" type="password" required>
<button type="submit">Войти</button>
<p><a href="/forgot">Забыли пароль?</a></p>
</form>
4 — CSS
Вопросы
box-sizing: border-box— что меняется приwidth: 80%?- Три способа подключить CSS к странице — какой предпочтителен для проекта?
- Зачем
@media (max-width: …)? - Одна строка карточек на десктопе, столбец на телефоне — Flexbox или Grid достаточно для сетки карточек?
- Почему злоупотребляют
!important?
Задачи
Задача 1.
.panel — 80% ширины родителя, padding 20px, border 2px, margin 10px — одно правило с учётом box-sizing.
Задача 2.
Сетка карточек: 1 колонка < 768px, 2 колонки 768–1023px, 3 колонки ≥ 1024px — только CSS (имена классов любые).
Разбор: блок 4
Вопросы
- В 80% входят padding и border, а не "раздувают" блок наружу.
- Внешний файл
<link>; инлайн — для редких исключений. - Адаптивная вёрстка под ширину экрана.
- Grid (
grid-template-columns) удобнее для 2D-сетки; flex тоже возможен с wrap. - Ломает каскад, усложняет переопределение и поддержку.
Задачи
Задача 1.
.panel {
box-sizing: border-box;
width: 80%;
padding: 20px;
border: 2px solid #ccc;
margin: 10px;
}
Задача 2.
.cards {
display: grid;
gap: 1rem;
grid-template-columns: 1fr;
}
@media (min-width: 768px) {
.cards { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
.cards { grid-template-columns: repeat(3, 1fr); }
}
5 — JavaScript
Вопросы
- Что такое DOM?
- Скрипт в
<head>безdefer— что может пойти не так? letиconstvs устаревшийvar— одно ключевое отличие области видимости.- Зачем
addEventListenerвместоonclick = …? fetchвозвращает Promise — что проверить кромеresponse.json()?
Задачи
Задача 1.
Кнопка #toggle, блок #content: по клику показать/скрыть (JS; лучше через класс .hidden в CSS).
Задача 2.
fetch('/api/status') → текст в #status; обработать !response.ok и catch.
Разбор: блок 5
Вопросы
- Дерево узлов HTML в памяти; JS меняет узлы — меняется страница.
- Скрипт выполнится до построения DOM —
getElementByIdвернётnull. var— функциональная область и hoisting;let/const— блочная.- Несколько слушателей,
removeEventListener, не затирает чужой обработчик. response.ok, статус, сетевые ошибки вcatch.
Задачи
Задача 1.
const btn = document.getElementById('toggle');
const box = document.getElementById('content');
btn.addEventListener('click', () => box.classList.toggle('hidden'));
Задача 2.
fetch('/api/status')
.then((response) => {
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.text();
})
.then((data) => {
document.getElementById('status').textContent = data;
})
.catch((err) => {
document.getElementById('status').textContent = `Ошибка: ${err.message}`;
});