Я недавно начал делиться статьями и документацией публично.
Раньше всё ограничивалось внутренними релизами: документацией, ресёрчами, роадмапами. Всё — внутри команды.
Но после того как я выпустил свой первый плагин для Vite, захотелось рассказать о нём миру, собрать обратную связь и понять, насколько он действительно полезен. А вдруг кто-то подкинет идею, баг, или просто скажет “спасибо”? В процессе написания статьи я вдруг осознал: мне это нравится. После публикации я уже думал о следующей теме — и понял, что таких тем у меня полно. Но сначала — вернёмся к этому плагину.
Как всё началось: вдохновение из NestJS
Я работаю разработчиком уже больше пяти лет. В основном — фронтенд, но с недавних пор начал осваивать и бэкенд. Сначала это был Node.js с Express, но затем мы в компании запустили новый проект: автоматизация звонков пользователям и анализ транскриптов через OpenAI. Я взялся за реализацию и выбрал для этого NestJS. Знаком был поверхностно, но быстро пришлось углубиться.
И вот, запускаю nest g resource, и в терминале появляется полноценный модуль. Я буквально сказал вслух:
«А почему такого нет в React?!»
Да, есть сниппеты, есть сторонние генераторы. Но я хотел шаблон. Я хотел: написал команду — и всё готово. Как в Nest.
Рутинная боль фронтенда
Потом я вернулся к новому внутреннему проекту — Telegram Web App на стеке Vite + TypeScript + React + Zustand. Простое, небольшое приложение. Начинаю писать — и тут снова:
• Создай папку
• Создай Component.tsx
• Добавь index.ts
• Пропиши интерфейс пропсов
• Подключи стили
• И так далее…
Когда прилетел дизайн на новую страницу — и всё это снова повторилось — у меня реально задёргался глаз. Я психанул, написал простой bash-скрипт с шаблоном, сделал его исполняемым, назвал create-component. И знаете что? Это было счастье.
Потом добавил create-store, create-page и так далее. Всё стало сильно удобнее. Но оставались проблемы:
• В каждом проекте шаблоны немного разные
• Структура у всех отличается
• Иногда нужно сгенерировать что-то новое, и приходится заново писать скрипт
Особенно тяжело было в одном “наследии 2010-х” — Angular 1.5 + React. Лучше бы вы не знали, как там устроена структура.
Vite deserves nest g
В какой-то момент я подумал:
“Я люблю Vite. Почему бы не сделать для него что-то вроде nest g resource, настраиваемое и расширяемое?”
Так и родился vite-plugin-create — плагин и CLI, который позволяет быстро генерировать компоненты, страницы, сторы и всё, что захочешь. Шаблоны — кастомизируемые. Нейминг — на выбор. Команда — одна.
⸻
Реализация: почему оказалось не так просто
Первым делом я решил начать с простого плагина — так родился vite-plugin-import-alias. Он был легче в реализации, и на нём я «набил руку» на публикации, npm, документации и реакциях от людей. Но уже тогда я знал — следующим будет vite-plugin-create.
На первый взгляд идея казалась простой. Я уже писал bash-скрипты, которые создавали компоненты, сторы и страницы по шаблону. Почему бы не повторить ту же логику, только красиво, внутри Vite-плагина?
Я представлял это так:
• Есть шаблоны файлов.
• Есть конфиг, где указаны имена, пути, стиль нейминга.
• А дальше — в index-файле плагина ловим команду vite create:component Button, и всё создаётся.
А вот и первое разочарование
Я быстро понял, что Vite не предоставляет API для добавления своих CLI-команд. Увы — нельзя добавить vite create:component, чтобы оно выглядело как “нативное расширение Vite”. Очень хотелось, чтобы всё выглядело как nest g resource, но пришлось признать: так просто не получится.
Решение: свой CLI
Я добавил bin/cli.ts и вынес туда команды. А в package.json прописал отдельную точку входа:
"bin": {
"vite-create": "./dist/bin/cli.js"
}
Теперь можно запускать всё через:
npx vite-create component Button
Это, конечно, не полноценное расширение Vite CLI, но и не костыль — выглядит нормально, работает стабильно.
⸻
Конфигурация и нейминг
Следующим шагом было решить: как задавать стиль имён?
Компоненты логично делать в PascalCase, но для других сущностей — кто-то захочет camelCase, кто-то kebab-case.
Я добавил параметр fileNameStyle в конфиг, где можно выбрать:
• pascalCase
• camelCase
• kebabCase
• original (оставить как есть)
По умолчанию используется PascalCase, но в будущем я хочу, чтобы для каждого генератора (component, store, page, и т.д.) можно было задавать свой стиль.
⸻
Конфиг и шаблоны
Одна из целей плагина — быть максимально простым и кастомизируемым. Чтобы начать пользоваться, не нужно думать: “куда положить шаблоны”, “что туда писать” и “в каком формате конфиг”.
Для этого я добавил команду:
npx vite-create init
Она создаёт:
• Директорию templates/ с базовым шаблоном компонента
• Файл vite-create.config.json — где уже есть пример генератора.
Конфиг задаёт, какие шаблоны использовать и куда класть файлы. Всё просто и читаемо.
{
"defaultPath": "src",
"fileNameStyle": "pascalCase",
"generators": {
"component": {
"path": "components/{{name}}",
"files": {
"{{name}}.tsx": "templates/component/component.tsx",
"index.ts": "templates/component/index.ts",
"{{name}}.module.scss": "templates/component/style.scss"
}
}
}
}
Шаблоны — это обычные .tsx, .scss и .ts файлы с Handlebars-переменными ({{name}}, {{PascalCaseName}}, и т.д.).
import styles from './{{name}}.module.scss';
export interface Props {
className?: string;
}
export const {{name}}: React.FC<Props> = ({ className }) => {
return <div className={styles.root}>{{name}} component</div>;
};
А вот как может выглядеть шаблон компонента — обычный .tsx с переменными.
⸻
Что делает vite-plugin-create уже сейчас
Генерирует компоненты (и не только) из ваших шаблонов
Поддерживает .tsx, .scss, .test.tsx и любые другие файлы
Подстраивается под ваши нейминг-правила (PascalCase, camelCase и т.д.)
Позволяет задать собственные генераторы:
vite-create my-thing
⸻
Roadmap
Вот что я планирую добавить в следующих версиях:
• ✅ Кастомные генераторы — пользователь сам решает, что он хочет создать, и задаёт структуру в конфиге
• ? Формат шаблонов по умолчанию — .tsx или .jsx по выбору (может даже через --jsx флаг)
• ? Шаблоны по директориям — например, отдельная логика для pages/, widgets/, shared/
• ⚙️ Параметры на уровне генераторов — чтобы у component был один стиль, у hook — другой
Возможно, в будущем появится и минимальный GUI — чтобы конфиг можно было настраивать не только руками, но и через простой визуальный интерфейс (например, в браузере или через CLI).
Если вы тоже устали от однотипной рутины при создании компонентов — попробуйте vite-plugin-create
Буду рад фидбеку, идеям и, конечно, вашим pull request'ам
Плагин полностью open source, MIT лицензия — если хотите внести вклад, идеи или улучшения — welcome!