Описание вакансии
Обязанности:
- Разработка и развитие интерфейсов админки и кабинета продавца на Vue 3
- Развитие публичной витрины: вёрстка, клиентская логика на vanilla JS, работа с серверными шаблонами
- Оптимизация публичной части: скорость загрузки, Core Web Vitals, размер бандла и стилей
- Выделение общих компонентов админок в переиспользуемую библиотеку, снижение дублирования между приложениями
- Работа со сложными таблицами, формами и валидацией, загрузкой файлов (прайсы XLSX/CSV), дашбордами и графиками
- Интеграция с REST API: работа с состоянием (Pinia), обработка ошибок и состояний загрузки, согласование контрактов с backend-командой
- Адаптивная вёрстка: корректная работа на мобильных, планшетах и десктопе
- Работа с авторизацией и ролевой моделью на клиенте
- Написание и поддержка тестов (Vitest, Vue Test Utils)
- Участие в код-ревью, планировании задач и выработке архитектурных решений по frontend
- Совместная работа с backend-разработчиками, дизайнером и QA
Требования:
- Опыт коммерческой frontend-разработки от 3 лет
- Уверенное знание JavaScript (ES2020+): асинхронность, замыкания, event loop, модули, работа с DOM без фреймворка
- Опыт коммерческой разработки на Vue 3: Composition API, реактивность, жизненный цикл, композаблы (в проекте есть и Options API — легаси-компоненты)
- Опыт работы с экосистемой Vue: Vue Router, Pinia
- Опыт работы с UI-библиотеками — в проекте Ant Design Vue: кастомизация, темизация через Less-переменные, сложные таблицы и формы
- Сильная вёрстка: Tailwind CSS, препроцессоры (Less, Sass), flexbox/grid, адаптивность, кроссбраузерность
- Опыт интеграции с REST API: axios/fetch, обработка ошибок, работа с авторизацией
- Опыт работы с формами и валидацией (Yup или аналоги)
- Понимание производительности frontend: code splitting, lazy loading, работа с большими списками, оптимизация критического пути рендеринга
- Опыт работы с Vite: конфигурация, режимы, переменные окружения, алиасы
- Знание Git, npm/yarn
- Умение декомпозировать интерфейс на переиспользуемые компоненты и поддерживать их в порядке
- Способность разбираться в чужом коде и дорабатывать существующие приложения
- Умение самостоятельно разбираться в сложных задачах и аргументировать выбранный подход
Плюсом будет
- Опыт разработки e-commerce, каталогов, агрегаторов или маркетплейсов
- Опыт работы над дизайн-системой или UI-kit, поддержка нескольких приложений на общей библиотеке компонентов
- Опыт работы с серверным рендерингом и серверными шаблонизаторами, понимание прогрессивного улучшения
- Понимание SEO на стороне клиента: микроразметка (schema.org), Core Web Vitals, оптимизация изображений и шрифтов
- Опыт работы с TypeScript — в проекте пока чистый JS, но мы рассматриваем поэтапный переход
- Опыт написания тестов (Vitest, Vue Test Utils, Playwright/Cypress)
- Опыт работы с графиками и визуализацией данных (ApexCharts или аналоги)
- Опыт интеграции WYSIWYG-редакторов (CKEditor 5, TinyMCE) и карт (2GIS MapGL, Яндекс.Карты)
- Опыт настройки CI/CD для frontend-приложений (GitHub Actions)
- Внимание к деталям UI/UX: типографика, состояния интерфейса, доступность (a11y)
О проекте
Costo.ru — агрегатор интернет-магазинов и маркетплейсов России: каталог товаров, сравнение цен от десятков магазинов, характеристики, рейтинги и отзывы.
Проект состоит из трёх частей, и frontend в них устроен по-разному:
- costo.ru публичная витрина. Рендерится на сервере (PHP + шаблоны), клиентская часть — вёрстка и vanilla JS: Tailwind, Swiper, собственные слайдеры и компоненты. Здесь решают скорость загрузки и SEO.
- admin.costo.ru административная панель. Vue 3 SPA на Ant Design Vue: управление товарами, категориями, атрибутами, магазинами, контентом, модерация.
- seller.costo.ru кабинет продавца. Vue 3 SPA: управление товарами и прайсами, аналитика, документы, биллинг.
Ищем человека, которому интересны обе стороны: и вылизанная быстрая витрина, и сложные рабочие интерфейсы.
Чем интересна задача
Витрина — это SEO и скорость. Публичная часть рендерится на сервере, а значит каждый килобайт CSS и каждая лишняя перерисовка видны в Core Web Vitals и в позициях. Это редкий сейчас формат работы: не «накидать компонентов», а думать о том, что реально доедет до пользователя.
Админки — это сложные интерфейсы. Каталог с тысячами атрибутов, таблицы на большие объёмы данных, формы с нетривиальной валидацией, загрузка и разбор прайсов, дашборды с графиками, карты, WYSIWYG- редакторы.
Есть большая понятная задача. Admin и seller — два отдельных приложения с почти одинаковыми зависимостями и конфигами, выросшие копированием. Общей библиотеки компонентов нет, код между ними дублируется. Привести это в порядок — выделить общий UI-kit, избавиться от дублирования — работа для человека, который любит наводить порядок и видеть результат.
Честно о проекте
Мы не будем делать вид, что у нас всё идеально.
Три части — три разных подхода. Витрина на серверных шаблонах и vanilla JS, две админки на Vue 3. Придётся переключаться между контекстами.
Общей библиотеки компонентов нет. Admin и seller разошлись копированием: одинаковые зависимости, одинаковые конфиги, дублирующийся код. Это не «поддерживать существующий UI-kit», а создать его — задача
на реальный вклад в проект.
Версии частично отстали. Ant Design Vue 3.x, Vite 3.x, TypeScript отсутствует. Планы по обновлению есть, и новый человек может на них повлиять.
При этом инфраструктура рабочая. ESLint и Prettier настроены, Vitest с jsdom и @pinia/testing подключены, темизация через плагин препроцессора, автоимпорт компонентов, GitHub Actions с раздельными пайплайнами под production, staging и test. Есть mock-сервер по OpenAPI-спецификации — можно разрабатывать интерфейс, не
дожидаясь готовности backend.
Для нас особенно важно
Мы ищем разработчика, который думает не только о коде, но и о пользователе: витрина — лицо проекта, где решают скорость и удобство, а админка с кабинетом продавца — рабочие инструменты, за которыми люди проводят по несколько часов в день.
Нам важен человек, который наводит порядок, а не добавляет к беспорядку: не плодит дублирующие компоненты, думает о переиспользуемости и о том, как изменение отразится на соседнем приложении.
Мы нормально относимся к использованию AI-инструментов как к вспомогательным. Но нам принципиально важно, чтобы разработчик обладал сильной собственной экспертизой: мог самостоятельно спроектировать интерфейс, сверстать его, разобраться в баге и объяснить свои решения. Подход «код сгенерирован без понимания и проверки, без учёта архитектуры проекта и договорённостей внутри команды» нам не подойдёт.
Наш стек
- Основа: JavaScript (ES2020+), Vue 3 (Composition API + Options API в легаси), Vue Router, Pinia, vue-request
- UI: Ant Design Vue, Tailwind CSS, Less, Sass, FontAwesome
- Витрина: серверные PHP-шаблоны, vanilla JS, Tailwind, Swiper, Toastify
- Сборка: Vite, yarn
- Данные и формы: axios, Yup, Papaparse, dayjs
- Компоненты: ApexCharts, CKEditor 5, TinyMCE, 2GIS MapGL, SortableJS
- Качество кода: ESLint, Prettier, Vitest, Vue Test Utils
- Инфраструктура: Selectel, GitHub Actions, раздельные контуры, mock-сервер по OpenAPI
- Backend (для контекста): PHP 8.3, собственный фреймворк, MySQL, Redis, REST API
Формат работы
Мы работаем в офисе по понедельникам и пятницам, ориентировочно с 10:00 до 17:30. Офис находится в собственности компании — это не арендное пространство. Мы постарались сделать его максимально комфортным и уютным: скорее он напоминает небольшой бутик, чем классический офис.
Для кандидатов, которые привыкли к удалённой работе, хотим сразу обозначить важный момент. Мы понимаем желание брать несколько проектов одновременно, но также хорошо представляем объём задач в нашем продукте. Совмещать полноценную работу у нас с другими проектами, скорее всего, будет непросто.
Поэтому просим трезво оценивать свою загрузку и возможность уделять проекту достаточно внимания. Мы ищем человека, который сможет глубоко погрузиться в продукт и быть вовлечённым в его развитие.