Skip to content

LiquidAssContainer/stopwatch-test-task

Repository files navigation

Build status

Stopwatch Test Task

GitHub Pages

Тестовое задание с созданием секундомеров, сделанное на Vue 3.

Доступные скрипты

  • yarn — первоначальная установка зависимостей
  • yarn dev — запуск dev-сервера
  • yarn build — сборка для production
  • yarn preview — превью локальной production-сборки

Реализация

Стек

Как и требуется в ТЗ, тестовое задание сделано на Vue 3 и чистом JavaScript (хотя я был бы не против использовать TypeScript). Стили написаны с использованием препроцессора Sass. Сборщик — Vite, менеджер пакетов — Yarn, сборка автоматически деплоится на GitHub Pages с помощью AppVeyor.

Архитектура

В качестве архитектурной методологии я выбрал Feature Sliced Design. Прежде всего это касается декомпозиции приложения по слоям (pages, shared и т. д.), но разделение на сегменты типа ui или model отсутствует, по сути каждый компонент является Single File Component.

Для большего удобства импортов (в рамках FSD) присутствует большое количество бойлерплейтных файлов index.js, но использованние сниппетов облегчило их создание.

Состояние и логика

Я решил не использовать стейт-менеджер, поскольку в рамках данной задачи вполне можно обойтись локальным состоянием в виде reactive-массива, который используется дочерними элементами компонента StopwatchesPage.

Главная составляющая логики — секундомеры — реализованы при помощи функции setInterval, которая каждые 20 мс (можно и чаще/реже) проверяет разницу между timestamp секундомера и текущим временем и меняет значение time (количество прошедших секунд после старта), если после предыдущего обновления успела пройти секунда. Реализовал именно так, потому что сами по себе setTimeout и setInterval имеют погрешность, которая со временем сильно испортит точность.

Соответствие ТЗ

По ТЗ и макету не предполагается кнопка для удаления секундомера, но я её добавил, т. к. она напрашивалась.