Мета роботи
Навчитися формулювати точні технічні промпти для ШІ-асистентів на розробку складної обчислювальної бізнес-логіки на чистому JavaScript (Vanilla JS). Опанувати фундаментальні навички інженера з тестування (Quality Assurance, QA). Навчитися працювати з вкладкою Console у Chrome Developer Tools, проводити стрес-тестування інтерфейсів, виявляти логічні помилки, копіювати логи багів та змушувати ШІ реалізовувати захисний код для обробки виняткових ситуацій (Edge-cases). Закріпити навички автоматичного деплою проєкту.
Раніше, якщо користувач вводив в калькулятор вартості послуг замість цифри літеру або ставив знак мінус, сайт або видавав легендарну помилку NaN (Not a Number), або зависав, змушуючи перезавантажувати браузер. Сьогодні розробник не просто пише код за допомогою ШІ-асистентів, він виступає в ролі QA Engineer (інженера з тестування). ШІ-асистент (ChatGPT/Claude) миттєво напише логіку, але саме розробник повинен провести її стрес-тестування через DevTools, виявити приховані баги, «крайні випадки» (Edge Cases) та змусити ШІ написати захисний, стійкий до критичних помилок код.
Стек інструментів для роботи
- Середовище кодингу: VS Code.
- ШІ-асистенти. ChatGPT (OpenAI), Claude (Anthropic) або Gemini.
- Інструменти тестування. Chrome Developer Tools (вкладка Console/Інспектор).
- Система контролю версій та автоматичний деплой: Git, GitHub, Vercel/GitHub Pages.
Інтерактивні віджети
Інтерактивний віджет (Widget) — це самостійний динамічний елемент вебсторінки (калькулятор, трекер, інтерактивна карта), який реагує на дії користувача в реальному часі без перезавантаження сторінки. На сучасних лендингах та корпоративних сайтах віджети є головним інструментом утримання уваги та збору лідів (потенційних клієнтів).
Інтерактивний віджет — це автономний, ізольований або напівізольований програмний модуль, інтегрований у вебсторінку, який забезпечує специфічний функціонал та взаємодіє з користувачем без необхідності перезавантаження всієї сторінки.
З технічної сторони сучасний кастомний віджет базується на тріаді:
- HTML (Структура). Окремий контейнер (найчастіше <div class="widget-container">), який містить елементи введення даних (<input>, <select>, <input type="range">) та зони для виведення результату.
- CSS (Інтерфейс). Ізольовані стилі (часто з використанням унікальних префіксів), які гарантують, що дизайн віджета не буде порушено під дією глобальних стилів сайту.
- JavaScript (Бізнес-логіка). Він перехоплює дії користувача (події/events), миттєво обробляє дані в оперативній пам'яті браузера і за допомогою DOM-маніпуляцій оновлює інтерфейс.
Анатомія роботи кастомного віджета (на прикладі калькулятора)
Більшість віджетів, які буде створено за допомогою ШІ (ChatGPT, Claude, Gemini), працюють за єдиним подієво-орієнтованим архітектурним патерном:
- Ініціалізація (Data Binding). Скрипт знаходить елементи інтерфейсу в дереві документа за допомогою класичних методів або сучасних аналогів: document.getElementById() чи document.querySelector().
- Слухачі подій (Event Listeners). На елементи введення вішаються «прослуховувачі». Для текстових полів це подія input (спрацьовує при кожному натисканні клавіші), для випадних списків чи повзунків — change.
- Збір та нормалізація. Щойно користувач змінив значення, JS зчитує властивість .value. Все, що приходить з полів HTML — це завжди є рядком (string). Програма має явно перетворити його на число за допомогою parseInt() або parseFloat().
- Калькуляція (Pure Functions). Обчислення результату за заданою бізнес-формулою.
- Рендеринг (UI Update). Запис готового результату в елемент виведення за допомогою властивості .textContent або .innerHTML.
На веб-сторінках зустрічаються два принципово різних типів віджетів:
Зовнішні інтегровані віджети
Це готові рішення, які надають великі платформи (Google Maps, YouTube, LiqPay, Facebook, Weather Informers). Такі віджети розглянуто в лабораторній роботі №7.
- Платформа надає фрагмент коду, зазвичай це тег <iframe>.
- Розробник не витрачає час на розробку логіки. Платформа гарантує безпеку (наприклад, обробка платежів відбувається на стороні банку) та стабільність.
- Водночас, зовнішні віджети можуть бути важкими для завантаження сторінки (істотно зменшують показники Google PageSpeed Insights). Часто обмежено можливості кастомізації дизайну, користувач не може стилізувати вміст <iframe> власним CSS через політику безпеки браузерів.
Кастомні віджети
Це віджети, які розробник створює з нуля під конкретний бізнес (наприклад, конструктор кухонних меблів, калькулятор вартості клінінгу, трекер накопичень).
- Пишеться унікальна логіка під технічне завдання та вимоги клієнта.
- Забезпечується ідеальна інтеграція в дизайн-систему сайту, досягається максимальна швидкість роботи. Розробник має повний контроль над кодом.
- Водночас, програмний код потребує ретельного тестування, оскільки будь-яка помилка в коді може зупинити роботу інших скриптів на сторінці.
Якщо звернутися до ШІ, наприклад ChatGPT: "Напиши калькулятор кредиту", він надасть красивий та робочий код. Але цей код буде розрахований на ідеальний сценарій (Happy Path).
ШІ часто забуває про специфіку веб-середовища:
- Асинхронність та стани. Якщо віджет повинен підтягувати, наприклад, курс валют з зовнішнього API, ШІ може написати запит без обробки помилки мережі (try...catch). Якщо сервер банку з якихось причин не доступний — віджет зависне в стані "Loading...".
- Конфлікти ділянок видимості. Якщо ШІ напише змінні через старий var або оголосить функції в глобальній ділянці видимості (window), а розробник захоче поставити два таких калькулятори на одну сторінку — вони почнуть перезаписувати дані один одного. Сучасний стандарт вимагає ізоляції коду (через ES-модулі або замикання).
Чек-ліст для проєктування ідеального віджета
Перед тим, як змусити ШІ кодити, архітектор проекту повинен продумати три рівні взаємодії:
- UX (Зручність). Динамічний відгук на кожну дію. Користувач не повинен тиснути на кнопку «Розрахувати» після кожної цифри. Використання події input замість click на кнопці.
- UI (Візуалізація). Стан доступності (Accessibility/aria-* атрибути) та стани елементів. Акцентування кольором фокусу на полях, блокування кнопки надсилання, якщо форма порожня.
- Fail-Safe (Стійкість). Обмеження діапазонів введення безпосередньо в HTML та дублювання цього в JS. Атрибути min="1" max="100" для input типу number.
Захисне програмування, Edge Cases та Критичні помилки
Штучний інтелект за замовченням генерує код для ідеального сценарію «Happy Path», коли користувач вводить саме те, що від нього очікують. Проте, в реальному світі користувачі:
- Вводять текст або спецсимволи туди, де мають бути лише цифри.
- Залишають поля порожніми.
- Вставляють від’ємні значення, нулі або астрономічні числа.
- Швидко і хаотично клікають на кнопки, викликаючи умови перегонів.
Захисне програмування (Defensive Programming) — це філософія та методологія проєктування програмного забезпечення, за якої код пишеться з усвідомленням того, що будь-які зовнішні чинники (користувачі, сторонні API, мережа чи навіть інші розробники) можуть поводитися некоректно, непередбачувано або вороже. Головна мета захисного програмування — мінімізувати наслідки помилок. Програма не повинна «падати» (завершувати роботу аварійно), видавати користувачеві технічні помилки («червоний екран смерть») чи пошкоджувати дані. Замість цього вона має ефективно обробляти аномалії, продовжувати роботу в безпечному режимі або виводити зрозумілі людські попередження.
Три золоті правила захисного коду
- Правило №1. Ніколи не довіряти вхідним даним. Будь-які дані, що надходять ззовні конкретного методу чи функції, вважаються «брудними» за замовченням. Це стосується:
- Значень з текстових полів форм (<input>).
- Даних, що приходять з бази даних або стороннього API (fetch).
- Параметрів, які передаються у функції іншими розробниками.
- Правило №2. Передбачати граничні випадки (Edge Cases). Програма має бути протестована не лише на ідеальному сценарії, коли користувач вводить все правильно. Потрібно заздалегідь відповісти на запитання:
- Що буде, якщо передати від'ємне число? null? undefined?
- Що буде, якщо користувач надішле порожній рядок або натисне кнопку надсилання форми 50 разів поспіль?
- Що станеться, якщо сервер повернув помилку 500 замість даних?
- Правило №3. Fail-Fast або Fail-Safe. Залежно від критичності системи, застосовують одну з двох стратегій:
- Fail-Fast (Швидка відмова). Програма миттєво зупиняє виконання та повідомляє про помилку на етапі розробки, щоб розробник міг її виправити.
- Fail-Safe (Безпечна відмова). У фінальному продукті програма загладжує помилку, використовує резервні значення за замовченням і продовжує працювати, не заважаючи користувачеві.
Захисне програмування — це не просто написання додаткових умов if. Це професійне ставлення до коду. Якщо написати код захищеним способом один раз, розробник позбавляється необхідності виправляти неочікувані «баги» в майбутньому, коли сайтом користуватимуться реальні люди на різноманітних пристроях.
Edge Case (граничний випадок, виняток) — це ситуація, яка виникає за межами звичайних операційних параметрів системи, але є теоретично і практично можливою. Це не баг в синтаксисі коду, це логічна прогалина в архітектурі додатка.
В контексті веб-віджетів та калькуляторів, які розробляються в лабораторній роботі №11, граничні випадки поділяються на кілька категорій:
А. Граничні значення чисел
Наприклад, в калькуляторі вартості розробки сайту користувач має ввести кількість сторінок.
- Happy Path. Користувач вводить 5 або 12.
- Edge Case 0. Користувач вводить 0. Чи може бути сайт з 0 сторінок? Якщо код просто помножить 0 на ціну сторінки, підсумкова вартість буде 0. Але робота менеджера, хостинг і дизайн-система все одно коштують грошей.
- Edge Case - "Мінус". Користувач вводить -5 сторінок. Якщо JavaScript не заблокує це, сайт покаже, що компанія тепер винна гроші користувачу.
- Edge Case Максимум. Користувач вводить 999999999999. Відбудеться переповнення інтерфейсу, текст пошириться за межі блоку, або JS видасть Infinity (нескінченність).
Б. Некоректні типи даних
- Happy Path. В полі «Вік» очікується число 20.
- Edge Case. Користувач копіює та вставляє туди текст "двадцять", або спецсимволи $%^&*, або взагалі залишає поле порожнім і тисне «Розрахувати».
- Базовий ШІ-код спробує виконати математичну операцію з цим рядком. В результаті користувач побачить на екрані типове NaN (Not a Number). Для клієнта сайту NaN — це ознака того, що сервіс зламався, і йому не можна довіряти.
В. Поведінкові та інтерфейсні Edge Cases
- Double-Clicking (Подвійний клік). Користувач натискає кнопку «Оформити замовлення» три рази поспіль, оскільки в нього повільний інтернет. Захищений код має заблокувати кнопку після першого кліку. Незахищений код надішле 3 однакові запити в базу даних і спише гроші з картки клієнта тричі.
Якщо Edge Case — це неправильна логіка, то Критична помилка (Runtime Error) — це технічна катастрофа всередині браузера. Це ситуація, коли JavaScript натрапляє на команду, яку він фізично не може виконати, і повністю зупиняє роботу потоку.
Якщо в JS виникає критична помилка, всі наступні скрипти на сторінці перестають працювати. Перестає відкриватися мобільне меню, не працюють слайдери, ламаються інші форми. Сторінка стає «мертвою».
Найпопулярніші критичні помилки, які висвічуються на вкладці Console DevTools під час стрес-тестування ШІ-коду:
- TypeError: Cannot read properties of null (reading 'value')
- ШІ спробував прочитати дані з інпуту, якого немає на сторінці (наприклад, id елемента змінено в HTML, а в JS-коді залишився старий).
- ReferenceError: X is not defined
- Код намагається звернутися до змінної або функції, яку забули оголосити або оголосили не в тій ділянці видимості.
- Uncaught (in promise) Error
- Віджет намагався асинхронно отримати дані (наприклад, курс валют чи погоду), але запит заблокував браузер через політику CORS або пропав інтернет. ШІ не написав обробник .catch() або блок try...catch, і додаток «впав».
Для того, щоб перетворити «крихкий» ШІ-код на стійкий бізнес-продукт, потрібно змусити ШІ впровадити три рівні захисту.
Рівень 1. HTML5 Валідація (Перша лінія оборони)
Забороняти некоректне введення ще на рівні розмітки. Замість базового <input type="text"> змусити ШІ використовувати специфічні атрибути:
HTML <input type="number" id="quantity" min="1" max="100" required>
Рівень 2. JS Валідація та Нормалізація (Головний щит)
Перед будь-яким розрахунком JavaScript повинен «очистити» та перевірити дані. Обов'язково використовувати перевірку на isNaN та приведення типів.
JavaScript
// Зчитуємо значення та примусово перетворюємо на число
let pages = parseFloat(document.getElementById('pages').value);
// Перевірка на Edge Cases
if (isNaN(pages) || pages <= 0) {
showError("Будь ласка, введіть коректну кількість сторінок (більше 0)");
return; // Зупиняємо виконання функції, рятуємо додаток від NaN
}
Рівень 3. Санкціонування
Якщо користувач вводить текст, він може спробувати ввести туди шкідливий скрипт (XSS-атака), наприклад: <script>steal_cookies()</script>. Якщо потім віджет виводить цей текст на екран через .innerHTML, браузер виконає цей код.
Ніколи не виводити дані користувача через .innerHTML. Використовувати лише .textContent або .innerText — вони автоматично екранують шкідливий код, перетворюючи його на звичайний безпечний текст.
Вміння працювати з Edge Cases — це те, що відрізняє джуніора (який радіє, що код запустився з першого разу) від мідла та сініора (які знають, що код буде протестовано в екстремальних умовах). В звіті до лабораторної роботи №11 студент має показати саме цей процес: як знайдено слабке місце в згенерованому ШІ алгоритмі та як навчалася модель писати захищений код.
Консоль розробника Chrome DevTools Console
Chrome DevTools Console (Консоль розробника) — це один з найважливіших інструментів арсеналі веброзробника та інженера з тестування (QA). Вона вбудована безпосередньо в браузер Google Chrome і виконує дві основні функції:
- Логування та діагностика, що показує помилки в коді, попередження, системні повідомлення, а також дані, які розробник навмисно виводить для перевірки.
- Інтерактивне середовище надає можливість в реальному часі писати та виконувати JavaScript-код, взаємодіючи з поточною вебсторінкою.
Способи відкривання вкладки Console в Chrome
- Гарячі клавіші F12 (або Fn+F12 на деяких ноутбуках), далі обрати вкладку Console.
- Через контекстне меню. Клікнути правою кнопкою миші в будь-якому місці сторінки, вибрати Inspect (Переглянути код) та перейти на вкладку Console.
Основні типи повідомлень в консолі
Повідомлення поділяються на чотири головні рівні.
- Errors (Помилки) — червоний колір. Критичні проблеми, через які JavaScript-код повністю або частково перестав працювати (наприклад, ReferenceError чи TypeError). Якщо калькулятор показує NaN або кнопка не реагує на клік, в консолі обов'язково з'явиться червоний запис.
- Warnings (Попередження) — жовтий колір. Неприємні, але не критичні помилки. Зазвичай це повідомлення про те, що якась технологія є застарілою або сайт використовує неефективні ресурси.
- Info/Logs (Інформація/Логи) — білий або сірий колір. Звичайні текстові повідомлення, які розробники виводять для самоперевірки.
- User Input/Output. Власні команди тестувальника (позначаються символом >) та відповіді системи на них (<).
Головні сценарії користування консоллю
1. Стрес-тестування інтерфейсів та пошук багів (QA-фаза)
Тестувальник або розробник відкриває консоль і починає вводити в форми на сайті некоректні дані (наприклад, -5 сторінок, пусті рядки, спецсимволи).
- Якщо додаток зламався, консоль зафіксує помилку.
- Консоль можна розгорнути (стрілка ліворуч від помилки) і побачити Stack Trace (трасування стеку) — точний рядок в файлі .js, де сталася аварія. Цей текст копіюють і передають розробникам (або ШІ-асистенту) для виправлення коду.
2. Виведення даних за допомогою console.log()
Найпростіший спосіб дізнатися, що відбувається всередині програми — прописати логування в JavaScript-файлі проєкту:
JavaScript
let totalPrice = pagesCount * 1000;
console.log("Поточна кількість сторінок:", pagesCount);
console.log("Розрахована вартість:", totalPrice);
Кожного разу, коли спрацьовуватиме цей код, в консолі браузера з'являтимуться актуальні значення змінних.
3. Виконання JavaScript-коду в реальному часі
Консоль — це повноцінний REPL-інтерфейс. Можна клікнути на порожній рядок біля знаку > і написати будь-який код.
- Наприклад, швидко порахувати: Math.round(2.6) і натиснути Enter. Консоль відразу видасть результат: 3.
- Створити спливаюче вікно: alert('Привіт з консолі!');.
4. Робота з елементами сторінки (DOM)
Керувати сайтом можна прямо з консолі.
- Написати document.title = "Новий заголовок сайту"; і вкладка в браузері миттєво змінить ім'я.
- Знайти елемент ціни та дізнатися його вміст:
JavaScript
console.log(document.getElementById('total-price').textContent);
Якщо обрати будь-який елемент на сторінці через вкладку Elements (Інспектор), то в консолі можна звернутися до нього через швидку змінну $0. Наприклад, $0.style.backgroundColor = 'red'; пофарбує виділений елемент в червоний колір.
Корисні поради та інструменти консолі
- Очищення консолі. Якщо на екрані забагато тексту, натиснути комбінацію Ctrl+L або на іконку перекресленого кола (Clear console) в лівому верхньому кутку панелі.
- Збереження логів. Якщо перейти на іншу сторінку або перезавантажити сайт, консоль за замовченням очиститься. Якщо поставити галочку біля Preserve log (в налаштуваннях консолі — шестірня праворуч), історія помилок не зникне навіть після перезавантаження сторінки.
- Фільтрація. У верхній панелі консолі можна вимкнути відображення "Warnings" або "Info", щоб бачити виключно червоні "Errors". Також є рядок пошуку (Filter) для пошуку конкретного багу за ключовим словом.
Покроковий хід виконання роботи
В лабораторній роботі №11 студент створює власний інтерактивний віджет, інтегрує його в лендинг з попередніх лабораторних робіт. За допомогою ШІ реалізує JavaScript-логіку віджету.
Ланцюжок створення віджету: UX → UI → бізнес-логіка → генерація коду → Happy Path → QA → Edge Cases → Defensive Programming → повторне тестування → інтеграція → деплой.
Віджет повинен бути пов'язаний з тематикою власного вебпроєкту. Приклади:
- Калькулятор вартості створення сайту.
- Калькулятор вартості туристичної подорожі.
- Калькулятор вартості ремонту.
- Калькулятор вартості доставки.
- Конструктор кавового напою.
- Конфігуратор автомобіля.
- Калькулятор тренувань.
- Калькулятор вартості послуги.
- Квіз з підрахунком результату.
- Трекер накопичень.
- Конфігуратор товару.
- Планувальник або генератор рекомендацій.
Віджет повинен мати не менше трьох параметрів, які впливають на результат.
- Приклад Калькулятора вартості розробки сайту
- Приклад Кав'ярня в стилі BrewLab
Етап 1. Вибір ідеї та визначення функціональності віджета
- Обрати тип віджета. Студент повинен визначити, який інтерактивний елемент буде реалізовано. Потрібно, щоб віджет був логічно пов'язаний з тематикою власного лендингу.
- Якщо проєкт присвячений вебстудії, тоді Калькулятор орієнтовної вартості створення вебсайту.
- Якщо проєкт присвячений кав'ярні, тоді Конструктор власного кавового напою.
- Якщо проєкт присвячений подорожам, тоді Калькулятор розрахунку вартості подорожі.
- Описати бізнес-логіку. До початку написання коду студент повинен визначити:
- Які дані вводить користувач?
- Які параметри він може вибрати?
- Що саме розраховує віджет?
- Яка формула використовується?
- Що відображається користувачу?
- Створити таблицю бізнес-правил. Перед написанням JavaScript студент формує таблицю.
Наприклад: Калькулятор вебсайту Кількість сторінок → input number Тип дизайну → select SEO → checkbox Адаптивність → checkbox Підтримка → checkbox Розрахунок Загальна вартість
| Параметр | Тип | Значення | Вплив |
| Кількість сторінок | number | 1–50 | +1000 грн/сторінка |
| Дизайн | select | шаблон/індивідуальний | +0/+5000 |
| SEO | checkbox | true/false | +1500 |
| Адаптивність | checkbox | true/false | +2000 |
Ця таблиця стане основою для промпту до ШІ.
Етап 2. Проєктування UX віджета
- Перед створенням коду необхідно продумати, як користувач взаємодіятиме з віджетом.
- Визначити елементи керування. Залежно від задачі можна використовувати:
- <input type="number">, <input type="range">, <select>, <input type="checkbox">, <input type="radio">, текстове поле, кнопки.
- Бажано використовувати різні типи елементів, щоб продемонструвати роботу з різними DOM-подіями.
- Визначити події, коли повинен оновлюватися результат. Наприклад:
- input при введенні;
- change після зміни select, checkbox або range;
- click для окремих кнопок.
- Для калькулятора бажано використовувати миттєвий перерахунок, а не змушувати користувача щоразу натискати кнопку «Розрахувати».
- Приклад промпту
Ти — UX/UI Designer та Frontend Developer. Проаналізуй майбутній інтерактивний віджет для мого вебпроєкту. Віджет: калькулятор вартості створення сайту. Користувач повинен вибирати: 1. кількість сторінок; 2. тип дизайну; 3. SEO; 4. адаптивність; 5. технічну підтримку. Запропонуй оптимальну структуру UI. Для кожного параметра вкажи: - тип HTML-елемента; - рекомендовану подію JavaScript; - спосіб відображення результату. Не пиши JavaScript-код. Спочатку опиши UX-логіку.
Етап 3. Створення UI-каркасу віджета
- Створити HTML-структуру. Віджет додається до існуючого лендингу.
- Необхідно створити окрему секцію <section>. Всередині розміщуються заголовок, поля введення, параметри, повідомлення про помилки, блок результату.
- Стилізувати віджет за допомогою Tailwind CSS. Віджет повинен відповідати дизайн системі, що створена в попередніх лабораторних роботах. Не потрібно створювати нову палітру кольорів або нову систему компонентів.
- Приклад промпту
Створи UI-каркас інтерактивного віджета для мого лендингу. Використовуй: - HTML5; - Tailwind CSS; - існуючу Design System. Віджет має містити: 1. заголовок; 2. поле кількості сторінок; 3. select типу дизайну; 4. checkbox SEO; 5. checkbox адаптивності; 6. блок загальної вартості; 7. область повідомлень про помилки. Використовуй семантичний HTML. Поки що НЕ пиши JavaScript. Всі елементи повинні мати унікальні id. Віджет повинен бути адаптивним та працювати за принципом mobile-first.
Етап 4. Формування технічного завдання для JavaScript
Студент не повинен одразу писати промпт «Напиши калькулятор», спочатку необхідно сформувати технічну специфікацію.
- Описати алгоритм, Наприклад:
- Визначити очікувані результати, що згодом надасть можливість перевірити правильність алгоритму. Наприклад:
- 1 сторінка + шаблон = 4000 грн.
- 5 сторінок + індивідуальний дизайн + SEO = 13500 грн.
basePrice = 3000 pages = кількість сторінок design: template = 0 custom = 5000 SEO = 1500 responsive = 2000 total = basePrice + pages * 1000 + designPrice + SEO + responsive
Етап 5. Створення системного промпту для JavaScript
- Приклад комплексного промпту.
- Отриманий код зберегти в файлі widget.js
- Підключити файл JavaScript до HTML <script src="js/widget.js"></script>. Перевірити, що JavaScript завантажується без помилок.
- Перевірити Happy Path, використовувати тільки правильні значення. Наприклад:
- сторінок = 5
- дизайн = індивідуальний
- SEO = так
- адаптивність = так
- Перевірити, чи правильно обчислюється результат.
Ти — Senior JavaScript Developer та QA Engineer. Мені потрібно реалізувати бізнес-логіку інтерактивного калькулятора вартості вебсайту. ## HTML В сторінці вже існують: #pages-count #design-type #seo-opt #responsive-opt #total-price #error-pages Не змінюй HTML без необхідності. ## Бізнес-логіка Базова вартість: 3000 грн. Кожна сторінка: +1000 грн. Тип дизайну: шаблон = 0 грн індивідуальний дизайн = 5000 грн SEO: +1500 грн. Адаптивність: +2000 грн. ## Поведінка Результат повинен оновлюватися автоматично при зміні input/select/checkbox. Використовуй: - addEventListener; - input; - change; - textContent. Не використовуй jQuery. Код повинен бути Vanilla JavaScript. ## Вимоги - перевіряй вхідні дані; - не допускай NaN; - не допускай Infinity; - не допускай від'ємних значень; - обробляй порожні поля; - використовуй min/max; - передбач обробку Edge Cases. Спочатку поясни алгоритм, а потім надай JavaScript-код.
Етап 7. Перевірка JavaScript через Інструменти розробника Chrome DevTools
- Відкрити Chrome → F12 → Console
- Перевірити Errors, Warnings, Logs.
- Увімкнути Preserve log, щоб повідомлення не втрачалися після перезавантаження сторінки.
- Перевірити DOM через Console, чи JavaScript знаходить потрібні елементи.
- Наприклад document.getElementById('total-price')
- або document.querySelector('#pages-count')
Етап 8. Створення план тестування якості QA Test Plan
Тепер студент переходить від ролі розробника до ролі QA Engineer.
- Створити тест-кейси. Доцільно перевірити щонайменше такі ситуації:
| № | Тест | Очікуваний результат |
| 1 | правильне число | коректний розрахунок |
| 2 | порожнє поле | повідомлення про помилку |
| 3 | 0 | помилка |
| 4 | -5 | помилка |
| 5 | дуже велике число | помилка |
| 6 | дробове число | нормалізація |
| 7 | зміна select | перерахунок |
| 8 | checkbox | перерахунок |
| 9 | швидка зміна значень | стабільна робота |
| 10 | відсутній DOM-елемент | відсутність критичного падіння |
Етап 9. Стрес-тестування Гранічних випадків Edge Cases
- Тест на пусте поле. Повністю витерти цифру з поля введення кількості. Що відображає калькулятор? Зазвичай ціна перетворюється на NaN або падає в нуль, а в консолі може виникнути помилка типу ReferenceError.
- Тест на від'ємні значення. Ввести в поле сторінок -5 або -500. Що сталося з ціною? Якщо сайт повертає від'ємну вартість і компанія тепер «винна гроші» клієнту, тоді це є критичним багом безпеки (Critical Business Logic Bug).
- Тест на аномальні значення. Ввести 9999999999999999. Чи поширюється текст за межі блоку дизайну?
- Тест на вживання дробових чисел, наприклад: 2.5. Визначити, чи допускає бізнес-логіка дробові значення. Якщо ні, тоді необхідно округлювати або повідомляти про помилку.
- Скопіювати всі негативні результати UI та тексти помилок з консолі (якщо вони виникли).
Етап 10. Аналіз помилок в Console
- Знайти Runtime Errors. Особливу увагу звернути на TypeError, ReferenceError, SyntaxError, RangeError, Uncaught, NaN, Infinity
- Якщо виникла помилка, тоді розгорнути повідомлення, знайти файл, знайти номер рядка, скопіювати повідомлення, скопіювати Stack Trace.
- Передати знайдені баги до ШІ в зрозумілому вигляді "контекст + відтворення помилки + очікуваний результат".
- Приклад промпту
Ти — Senior QA Engineer та JavaScript Developer. Я протестував інтерактивний віджет і знайшов помилку. ## Сценарій В поле #pages-count я ввів: -5 ## Фактичний результат Віджет показав: -2000 грн ## Очікуваний результат Від'ємна кількість сторінок повинна бути заборонена. Користувач повинен побачити повідомлення: "Введіть кількість сторінок від 1 до 50". ## Console [вставити повідомлення Console] ## Завдання Проаналізуй причину помилки. Потім запропонуй мінімальне виправлення JavaScript. Не переписуй весь файл. Покажи тільки змінений фрагмент та поясни, чому виникла помилка.
Це значно якісніший підхід, ніж повторна генерація всього JavaScript-файлу.
Етап 12. Реалізація Захисного програмування Defensive Programming
Необхідно реалізувати щонайменше три рівні захисту.
- Рівень 1. HTML5. Використати:
- Рівень 2. JavaScript. Перевіряти дані перед розрахунком:
- Рівень 3. Безпечне відображення.
- Якщо дані походять від користувача, для виведення неперевіреного тексту не використовувати innerHTML.
- Використовувати: textContent
- Попросити ШІ провести аудит Defensive Programming
- Помилка повинна бути зрозумілою для користувача.
- Не показувати NaN, TypeError, undefined.
- Замість цього "Введіть кількість сторінок від 1 до 50."
- Приклад промпту
- Після виправлення коду необхідно повторити всі тест-кейси.
- Не можна перевіряти тільки ту помилку, яку було виправлено. Виправлення однієї проблеми може зламати іншу частину віджета.
- Якщо віджет інтегрується в лендинг, необхідно переконатися, що він не ламає інші компоненти.
- Перевірити шапку, мобільне меню, форми, слайдери, галереї та інші JavaScript-компоненти.
- Приклад промпту
<input type="number" min="1" max="50" required>
const pages = parseInt(value, 10);
if (Number.isNaN(pages) || pages < 1 || pages > 50) {
// повідомлення про помилку
}
Проведи аудит JavaScript-коду мого віджета з точки зору Defensive Programming. Перевір: 1. порожні значення; 2. NaN; 3. Infinity; 4. від'ємні значення; 5. нуль; 6. надмірно великі числа; 7. дробові значення; 8. відсутні DOM-елементи; 9. неправильні значення select; 10. повторне швидке введення. Не змінюй код. Для кожної проблеми вкажи: Edge Case → Причина → Можливий наслідок → Рекомендований захист.
Покращ UI повідомлень про помилки в інтерактивному віджеті. Вимоги: - повідомлення повинно знаходитися безпосередньо під відповідним полем; - використовуй Tailwind CSS; - помилкове поле повинно мати помітний focus/error стан; - повідомлення повинно бути зрозумілим звичайному користувачу; - технічні повідомлення JavaScript не повинні відображатися користувачу. Не змінюй бізнес-логіку.
Проаналізуй JavaScript віджета з точки зору ізоляції коду. Перевір: - глобальні змінні; - глобальні функції; - конфлікти id; - повторне оголошення змінних; - можливість розміщення двох екземплярів віджета на одній сторінці. Запропонуй спосіб ізоляції коду за допомогою сучасного Vanilla JavaScript. Не використовуй jQuery.
Етап 17. Інтеграція в лендинг та фінальний аудит якості QA
- Перевірити дизайн. Віджет повинен:
- відповідати дизайн системі;
- мати узгоджену типографіку;
- використовувати існуючі кольори;
- мати відповідні заокруглення форм;
- використовувати існуючі кнопки;
- коректно працювати на вузькому екрані.
- Перевірити адаптивність, щонайменше на ширині 320 px, 375 px, 768 px, 1024 px, 1280 px, 1440 px.
- Особливу увагу звернути на input, select, кнопки, блок результату, повідомлення про помилки.
- Після завершення роботи виконати комплексний аудит.
Ти — Senior Frontend Developer, QA Engineer та Accessibility Specialist. Проведи фінальний аудит інтерактивного віджета. Перевір: ## UX - зрозумілість інтерфейсу; - логіку взаємодії; - зрозумілі повідомлення. ## JavaScript - DOM; - events; - валідацію; - обчислення; - Edge Cases; - Runtime Errors. ## Security - безпечне виведення даних; - innerHTML; - textContent. ## Accessibility - labels; - keyboard navigation; - focus; - aria-атрибути. ## Responsive - mobile; - tablet; - desktop. ## Architecture - глобальні змінні; - ізоляцію коду; - можливість повторного використання. Не переписуй код. Сформуй таблицю: Проблема | Рівень критичності | Причина | Рекомендація.
Етап 5. Публікація та реліз на хостингу за допомогою Git
Після того, як проєкт повністю готовий та протестований, зафіксувати цей фінальний реліз.
- В терміналі VS Code перевірити стан робочої області: git status
- Додати всі оновлені компоненти: git add .
- Зробити фінальний інженерний комміт: git commit -m "feat: додано інтерактивний віджет з повним захистом від Edge Cases (QA-перевірено)"
- Надіслати код в репозиторій GitHub: git push origin main
- Завдяки налаштованому раніше CI/CD пайплайну на сервісі Vercel або Netlify, сторінка автоматично перезбереться в хмарі за лічені секунди. Перейти за живим посиланням та перевірити роботу віджета зі смартфона.
Етап 20. Перевірка продакшн-версії
- Відкрити опублікований сайт. Перевірити:
- віджет працює;
- розрахунки правильні;
- помилки обробляються;
- Console не містить помилок;
- адаптивність працює;
- інші компоненти лендингу не зламані.
- Особливо важливо протестувати саме продакшн-версію, а не лише локальний сайт.
Очікуваний результат
Головним результатом лабораторної роботи є віджет, який студент вміє спроєктувати, згенерувати за допомогою ШІ, протестувати, знайти в ньому слабкі місця, виправити їх та довести до стабільного продакшн-стану.
ІНТЕРАКТИВНИЙ ВІДЖЕТ
│
┌─────────────┼─────────────┐
↓ ↓ ↓
UX UI Бізнес-логіка
│ │ │
└─────────────┼─────────────┘
↓
Master Prompt
↓
ШІ-генерація
↓
Happy Path
↓
QA Testing
↓
Edge Cases
↓
Defensive Programming
↓
Debugging
↓
Regression Testing
↓
Production Release
ШІ є ідеальним помічником, але фінальне слово за архітектором. Якщо ШІ видає гарний з виду інтерфейс, варто увімкнути свій внутрішній UX/QA-фільтр. Подивитися на код очима користувача, який випадково або навмисно захоче зламати форму. Справжній професіоналізм полягає не в написанні коду, який працює, коли все добре, а в написанні коду, який продовжує гідно працювати, коли все йде не за правилами.
Зміст звіту та технічні фінальні артефакти
- Титульний лист з назвою лабораторної роботи, даними студента.
- Посилання на віддалений репозиторій на GitHub та живе посилання на сайт в інтернеті (Vercel або Netlify).
- Опис обраного віджета та його бізнес-логіки.
- appy Path. Показати приклад правильного розрахунку.
- Edge Cases. Навести щонайменше 5 тестів.
- Таблицю тест-кейсів (QA Log) за формою:
- Що вводили | Яка була помилка/поведінка спочатку | Як її виправили завдяки ШІ-перевірочним гвардам.
- Фінальний лістинг коду (чистий JavaScript-блок валідації та розрахунку).
- Скріншот вкладки Console з Chrome DevTools, який підтверджує відсутність помилок під час тестування некоректних даних.
- Промпт-паспорт (Prompt Log). Тексти запиту на генерацію логіки віджета.
Критерії оцінювання лабораторної роботи
- Логіка та складність віджета. Віджет повинен мати щонайменше 3 параметри впливу на фінальний результат (наприклад: інпут введення, селект вибору та чекбокс додаткової опції).
- Обробка помилок та Edge Cases. Ідеальна стійкість програми до некоректного введення. Повна відсутність значень NaN, Infinity або від'ємних фінансових підсумків на екрані.
- Культура тестування та промпт-паспорт в звіті. Наявність чітко заповненого журналу тестування помилок в звіті студента.
- Якість UI/UX відображення помилок. Динамічне увімкнення/вимкнення класів Tailwind CSS (наприклад, червона рамка для невалідного інпуту та текстове попередження користувачу).
- Чистота консолі та деплой. Працююче хмарне посилання, відсутність помилок розгортання та чиста консоль розробника.
Контрольні запитання
- Що таке інтерактивний віджет в контексті веброзробки? Наведіть приклади.
- Поясніть різницю між Happy Path та Edge Case.
- Що таке Defensive Programming (захисне програмування)?
- Які основні Edge Cases ви тестували в своєму віджеті? Назвіть мінімум 4 випадки.
- Що означає поява NaN в результаті розрахунку? Чому це виникає?
- Як ви захищали код від порожнього поля та від’ємних значень?
- Яку роль має подія input та change при створенні інтерактивного віджета?
- Як ви перевіряли роботу віджета? Які інструменти використовували?
- Що потрібно робити, якщо в консолі з’являється помилка TypeError: Cannot read properties of null?
- Наведіть приклад хорошого промпту до ШІ для виправлення Edge Cases.
- Чому важливо обмежувати максимальне значення в полях (наприклад, max="500")?
- Як ви інтегрували віджет в свій основний лендинг?
- Які коміт-сообщення ви використовували під час фінального релізу? Наведіть приклади.
- Як відбувається автоматичний деплой після git push?
- Які головні висновки ви зробили з цієї лабораторної роботи щодо якості коду?
Глосарій термінів. Розробка інтерактивних віджетів та обробка Edge Cases
Рекомендовано для вивчення перед захистом Лабораторної роботи №11
- Інтерактивний віджет — самостійний програмний модуль на вебсторінці (наприклад, калькулятор, квіз чи конструктор), який виконує обчислення та миттєво оновлює користувацький інтерфейс (UI) без повного перезавантаження сторінки.
- Vanilla JS (Чистий JavaScript) — мова програмування JavaScript в своєму первинному вигляді, без використання сторонніх бібліотек (наприклад, jQuery) чи фреймворків.
- DOM (Document Object Model) — програмний інтерфейс, який представляє HTML-документ у вигляді дерева об'єктів, що надає JavaScript можливість динамічно змінювати вміст, структуру та стилі сторінки.
- Chrome Developer Tools (Інструменти розробника) — вбудований в браузер Google Chrome комплекс інструментів для веброзробників, що надає можливість інспектувати HTML/CSS, відстежувати мережеві запити та налагоджувати JavaScript.
- Chrome DevTools Console (Консоль розробника) — вбудований в браузер інструмент налагодження коду, куди виводяться всі системні логи, попередження та червоні треки критичних помилок JavaScript.
- DOM-маніпуляції (Document Object Model Manipulations) — процес динамічної зміни структури, вмісту або стилів вебсторінки за допомогою JavaScript-коду (наприклад, оновлення підсумкової ціни в текстовому блоці за допомогою .textContent).
- Слухач подій (Event Listener) — спеціальний метод в JavaScript (addEventListener), який «стежить» за елементом інтерфейсу та очікує певної дії від користувача (клік, введення тексту, вибір інпуту) для миттєвого запуску пов'язаної з ним функції розрахунку.
- Приведення типів (Type Casting/Coercion) — примусове перетворення даних з одного типу в інший. В інпутах форм дані завжди зчитуються як рядок (String), тому їх обов'язково потрібно приводити до чисел (Number) за допомогою функцій parseInt() або parseFloat().
- Баг (Bug) — помилка в коді програми, яка призводить до її некоректної роботи, неочікуваної поведінки інтерфейсу або порушення бізнес-логіки.
- Critical Business Logic Bug (Критичний баг бізнес-логіки) — серйозна помилка в логіці програми, яка призводить до фінансових, репутаційних або експлуатаційних збитків (наприклад, коли калькулятор повертає від'ємну вартість послуги).
- NaN (Not a Number) — спеціальний стан числового типу даних в JavaScript, який свідчить про те, що результат математичної операції є невизначеним або не може бути обчислений (наприклад, при спробі помножити рядок на число).
- Захисне програмування (Defensive Programming) — підхід до проектування архітектури коду, за якого розробник за замовченням припускає, що вхідні дані будуть некоректними чи шкідливими, і заздалегідь створює «щити» (валідацію), що не дозволяють програмі вийти з ладу.
- Defensive Guards (Захисні перевірки/Валідатори) — спеціальні умовні конструкції та фільтри в коді, які перевіряють вхідні дані на відповідність правилам до того, як запуститься основний обчислювальний алгоритм.
- Стрес-тестування інтерфейсів — метод тестування програмного забезпечення, спрямований на перевірку надійності та стійкості додатка в умовах нетипових, некоректних або екстремальних вхідних даних.
- Happy Path («Щасливий шлях») — ідеальний сценарій виконання програми, за якого користувач вводить виключно очікувані, коректні дані та діє чітко за передбаченим розробником алгоритмом без помилок.
- Edge Case (Граничний випадок, виняток) — аномальна або специфічна ситуація взаємодії з інтерфейсом, яка виникає на межах або поза межами звичайних параметрів (введення тексту в числове поле, від'ємні значення, порожні відправки).
- Валідація даних (Data Validation) — процес перевірки введеної користувачем інформації на відповідність встановленим правилам (наприклад, перевірка чи число є більшим за нуль) перед тим, як пустити ці дані далі в обчислювальну формулу.
- Overflow (Переповнення) — ситуація, коли вхідне або розраховане значення перевищує допустимі межі інтерфейсу або типи даних, спричиняючи візуальне ламання дизайну (вихід тексту за межі блоку) або збій обчислень.
- Runtime Error (Помилка часу виконання/Виняток) — критична технічна помилка, яка виникає безпосередньо під час роботи скрипту в браузері (наприклад, TypeError) і повністю зупиняє потік виконання JavaScript на сторінці, якщо її не було оброблено.
- XSS-атака (Cross-Site Scripting/Міжсайтовий скриптинг) — тип вразливості вебдодатків, при якому в сторінку впроваджується шкідливий JavaScript-код від користувача. Виникає, якщо виводити неперевірені дані через .innerHTML замість безпечного .textContent.
- XSS-захист (Cross-Site Scripting Protection) — комплекс заходів для запобігання впровадженню зловмисного коду на сторінку, В контексті лабораторної роботи реалізується через безпечне виведення результатів за допомогою .textContent замість небезпечного .innerHTML.
- Деплой (Deployment/Розгортання) — процес перенесення та публікації протестованого коду з локального комп'ютера розробника на віддалений публічний вебсервер або хмарний хостинг.
- Live Demo (Жива демонстрація) — публічна адреса (URL-посилання) повністю працюючої версії вебдодатка, розгорнутої на хмарному хостингу в реальному часі, яка використовується для фінального релізу або презентації клієнту/викладачу.
- CI/CD Пайплайн (Continuous Integration/Continuous Delivery) — процес автоматизації збирання, тестування та розгортання (деплою) проєкту в хмарі відразу після того, як розробник відправляє оновлений код в репозиторій.
- DevOps — набір практик, інструментів і принципів, який об'єднує процеси розробки (Development) та експлуатації (Operations) для швидкого, надійного й автоматизованого створення, тестування, розгортання та супроводу програмних продуктів.