Мета роботи
Навчитися формулювати точні технічні промпти для ШІ-асистентів на розробку складної обчислювальної бізнес-логіки на чистому 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) для пошуку конкретного багу за ключовим словом.
Покроковий хід виконання роботи
Етап 1. Верстка UI-каркасу віджета (HTML + Tailwind CSS)
Оберати віджет відповідно до бізнес-тематики (або узгодити з викладачем). Додати нову секцію на лендинг.
Нижче наведено два приклади реалізації UI-структури:
Приклад А. Калькулятор вартості послуг (для IT-агентства/фрілансу)
HTML <section class="py-12 bg-white text-gray-800"> <div class="max-w-xl mx-auto p-6 bg-gray-50 rounded-2xl shadow-md"> <h3 class="text-2xl font-bold text-center mb-6">Калькулятор розробки сайту</h3> <div class="mb-4"> <label class="block text-sm font-medium mb-1">Кількість сторінок:</label> <input type="number" id="pages-count" value="1" class="w-full p-2 border border-gray-300 rounded-xl focus:border-blue-500 focus:outline-none"> <p id="error-pages" class="text-xs text-red-500 mt-1 hidden"></p> </div> <div class="mb-4"> <label class="block text-sm font-medium mb-1">Тип дизайну:</label> <select id="design-type" class="w-full p-2 border border-gray-300 rounded-xl focus:outline-none"> <option value="template">Шаблонний (0 грн)</option> <option value="custom">Унікальний преміум (+5000 грн)</option> </select> </div> <div class="mb-6"> <label class="inline-flex items-center"> <input type="checkbox" id="seo-opt" class="rounded text-blue-500"> <span class="ml-2 text-sm">Додати базову SEO-оптимізацію (+1500 грн)</span> </label> </div> <div class="p-4 bg-blue-50 rounded-xl text-center"> <span class="text-gray-600 block text-sm font-medium">Попередня вартість:</span> <span id="total-price" class="text-3xl font-black text-blue-600">3000</span> <span class="text-xl font-bold text-blue-600">грн</span> </div> </div> </section>
Приклад Б. Конструктор кавового міксу або доставки їжі
HTML <section class="py-12 bg-gray-900 text-white"> <div class="max-w-xl mx-auto p-6 bg-gray-800 rounded-2xl shadow-xl"> <h3 class="text-2xl font-bold text-center mb-6 text-amber-400">Кастомний Кава-Міксер</h3> <div class="mb-4"> <label class="block text-sm font-medium mb-1">Основа (Мл):</label> <input type="number" id="coffee-base" value="100" class="w-full p-2 bg-gray-700 border border-gray-600 rounded-xl text-white focus:outline-none focus:border-amber-400"> <p id="error-base" class="text-xs text-red-400 mt-1 hidden"></p> </div> <div class="mb-4"> <label class="block text-sm font-medium mb-1">Молоко:</label> <select id="milk-type" class="w-full p-2 bg-gray-700 border border-gray-600 rounded-xl text-white"> <option value="none">Без молока (0 грн)</option> <option value="cow">Коров'яче (+15 грн)</option> <option value="almond">Мигдалеве рослинне (+35 грн)</option> </select> </div> <div class="mb-6 space-y-2"> <label class="block text-sm font-medium">Топпінги:</label> <label class="inline-flex items-center mr-4"> <input type="checkbox" value="caramel" class="syrup-chck text-amber-500 rounded"> <span class="ml-2 text-sm">Карамель (+10 грн)</span> </label> <label class="inline-flex items-center"> <input type="checkbox" value="vanilla" class="syrup-chck text-amber-500 rounded"> <span class="ml-2 text-sm">Ваніль (+10 грн)</span> </label> </div> <div class="grid grid-cols-2 gap-4 text-center"> <div class="p-3 bg-gray-700 rounded-xl"> <span class="text-xs text-gray-400 block">Калорійність:</span> <span id="coffee-cal" class="text-xl font-bold text-amber-400">40</span> ккал </div> <div class="p-3 bg-gray-700 rounded-xl"> <span class="text-xs text-gray-400 block">Ціна:</span> <span id="coffee-price" class="text-xl font-bold text-green-400">45</span> грн </div> </div> </div> </section>
Етап 2. ШІ-генерація першої версії логіки (Happy Path)
- Відкрити ChatGPT або Claude. Дати промпт написати базовий скрипт розрахунку (завантажити HTML форми як контекст).
- Задати промпт:
- Зберегти отриманий код в файлі widget.js, підключити до сторінки. Перевірити, що в ідеальних умовах (коли користувач вводить правильні дані) все працює.
«Напиши JavaScript-код для обчислення вартості/параметрів віджета на основі події input та change для всіх полів. Базова ціна сторінки 3000 грн. Кожна наступна сторінка +1000 грн. Реалізуй миттєве оновлення тексту в тегах результатів».
Цей ідеальний сценарій в інженерії називається Happy Path.
Етап 3. Стрес-тестування та виявлення багів (QA-фаза)
Відкрити сайт в браузері Chrome, натиснути F12 і перейти на вкладку Console. Спробувати зламати віджет наступними методами.
- Тест на пусте поле. Повністю витерти цифру з поля введення кількості. Що відображає калькулятор? (Зазвичай ціна перетворюється на NaN або падає в нуль, а в консолі може виникнути помилка типу ReferenceError).
- Тест на від'ємні значення. Ввести в поле сторінок -5 або -500. Що сталося з ціною? (Якщо сайт повертає від'ємну вартість і компанія тепер «винна гроші» клієнту — це критичний баг безпеки / Critical Business Logic Bug).
- Тест на аномальні значення. Ввести 9999999999999999. Чи поширюється текст за межі блоку дизайну?
- Скопіювати всі негативні результати UI та тексти помилок з консолі (якщо вони виникли).
Етап 4. Написання захисного коду через ШІ
- Повернутися до ШІ-асистента. Надіслати йому виявлені проблеми за допомогою професійного інженерного промпту.
- Оновити файл widget.js згенерованим захисним кодом. Повторити тести. Переконатися, що тепер інтерфейс є добре захищеним, а вкладка Console залишається абсолютно чистою.
"Дій як Senior QA Engineer та JavaScript Developer. Ми провели тестування першої версії віджета й виявили наступні Edge Cases та критичні баги: 1. При очищенні поля введення ціна ламається і показує NaN. 2. При введенні від'ємних чисел (наприклад, -5) калькулятор видає від'ємну суму. 3. При введенні дробових чисел (наприклад, 2.5 сторінки) логіка веде себе некоректно. Перепиши JavaScript код, додавши захисні перевірки (Defensive Guards). Якщо поле пусте або менше за 1, автоматично вважати значення рівним 1 (або показувати красивий текст помилки червоним кольором під полем і блокувати розрахунок). Дробові числа автоматично округлюй до найближчого цілого за допомогою Math.round() або Math.ceil(). Забезпеч повну стабільність віджета. Код має бути написаний на чистому JS без jQuery."
Етап 5. Публікація та реліз на хостингу за допомогою Git
Після того, як проєкт повністю готовий та протестований, зафіксувати цей фінальний реліз.
- В терміналі VS Code перевірити стан робочої області: git status
- Додати всі оновлені компоненти: git add .
- Зробити фінальний інженерний комміт: git commit -m "feat: додано інтерактивний віджет із повним захистом від Edge Cases (QA-перевірено)"
- Надіслати код в репозиторій GitHub: git push origin main
- Завдяки налаштованому раніше CI/CD пайплайну на сервісі Vercel або Netlify, сторінка автоматично перезбереться в хмарі за лічені секунди. Перейти за живим посиланням та перевірити роботу віджета зі смартфона.
ШІ — це ідеальний помічник, але фінальне слово за архітектором. Якщо ШІ видає гарний з виду інтерфейс, варто увімкнути свій внутрішній UX/QA-фільтр. Подивитися на код очима користувача, який випадково або навмисно захоче зламати форму. Справжній професіоналізм полягає не в написанні коду, який працює, коли все добре, а в написанні коду, який продовжує гідно працювати, коли все йде не за правилами.»
Приклад Калькулятора розробки сайту (відкрити в новому вікні)
- UI-каркас. Калькулятор вартості сайту з полем кількості сторінок, вибором типу дизайну та чотирма чекбоксами опцій. Права колонка є живим кошторисом з розділенням по статтях та оцінкою термінів.
- Happy Path. Базова ціна 3 000 грн, кожна наступна сторінка +1 000 грн, дизайн і опції додаються миттєво на події input/change.
- Defensive Guards (всі 5 граничних випадків закрито):
- Порожнє поле → червоне повідомлення, розрахунок заблокований.
- Від'ємні числа → помилка "мінімум 1 сторінка".
- Дробові числа → Math.round(), значення оновлюється в полі.
- NaN → перевірка isNaN(val) перед будь-яким розрахунком.
- Overflow 9999999999 → обмеження max 500, повідомлення з підказкою.
Приклад Кав'ярня в стилі BrewLab (відкрити в новому вікні)
- Конструктор.
- Слайдер об'єму 50–500 мл (крок 10 мл) замість поля вводу унеможливлює NaN та від'ємні значення на рівні UI.
- Основа — еспресо, американо, cold brew (різна базова ціна й калорії).
- Молоко — без, коров'яче, вівсяне, мигдалеве
- 4 топінги — карамель, ваніль, шоколадна крихта, збиті вершки
- Жива реакція.
- SVG-чашка змінюється — молочний шар з'являється при виборі молока, з'являються крапки топінгів.
- Назва напою формується автоматично (еспресо + коров'яче = Капучіно, cold brew + мигдалеве = Мигдальний Cold Brew тощо)
- Легенда шарів підсвічує лише активні інгредієнти
- Defensive Guards (4 рівні захисту):
- clamp(50, 500) — неможливо вийти за межі об'єму.
- Math.round() — жодних дробових мл.
- ?.dataset ?? fallback — якщо radio зняти через DevTools, TypeError не виникає.
- || 200 та || 35 — за замовченням для всіх числових значень.
Зміст звіту та технічні фінальні артефакти
- Титульний лист з назвою лабораторної роботи, даними студента.
- Посилання на віддалений репозиторій на GitHub та живе посилання на сайт в інтернеті (Vercel або Netlify).
- Короткий опис обраного віджета та його бізнес-логіки.
- Таблицю тест-кейсів (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) для швидкого, надійного й автоматизованого створення, тестування, розгортання та супроводу програмних продуктів.