Привет, Хабр! Это моя первая публикация и хотелось бы начать с чего-то полезного для сообщества. С места в карьер… Я запилил расширение для VSCode, которое поможет автоматизировать создание файловой структуры компонентов.

Для тех кому удобнее в видео формате, вот ссылка на скринкаст. Рассказываю плюс минус тоже самое, но волнительно и неловко.

vscode component creator
vscode component creator

Предыстория

Но прежде давайте познакомимся, Меня зовут Димой. Тружусь я fullstack разработчиком в торговой компании. Пилю сервисы на nestjs, а фронт на nextjs. Малость девопсю и очень аккуратно тыкаю в питон.

Недавно столкнулся с проблемой того что устал создавать папки, подпапки с одной и той же структурой. Например простейший React компонент:

∟ComponentName
  ∟ComponentName.tsx
  ∟ComponentName.props.ts
  ∟ComponentName.module.css
  ∟index.ts

Мало файлы создать, нужно еще прописать интерфейс пропсов, импортировать его в tsx компонент, прописать дефолтные экспорты, импортировать стили и многое другое. Устал…

В общем лень это двигатель прогресса, поэтому решился покопаться в маркетплейсе и найти что-то, что будет делать все это за меня. Ничего годного мне найти не удалось (может просто плохо искал), что-то меня все время не устраивало. Либо расширение было привязано строго к движку, либо структура была неизменной, либо вообще работа непонятной. Поскольку комфортного велосипеда для себя я не нашел, решил что сварю свой.

Собственно ТАДА!!! (в голову проигрываем звуки фанфар :) ). на мою первую попытку в open source.

Вкратце

В: Зачем?

О: Потому что лень!

В: Что делает?

О: Создает файловую структуру с необходимым наполнением.

В: Чем лучше других?

О: Тут уже загибаем пальцы. Не привязан к языку и фреймворку. Можно создавать собственные шаблоны. Шаблонов может быть сколько угодно. Для каждого проекта свой шаблон. Может создавать как плоские, так и глубокие структуры. А еще умеет в разные стили написания (camel case, pascal case, kebab case и т.д.).

Первый шаблон

Если Вы дочитали до этого момента, то скорее всего хотели бы попробовать. Давайте вместе пройдемся по возможностям расширения.

Прежде всего, после установки расширения нужно скачать один из предложенных шаблонов или создать свой. Для того чтобы скачать шаблон нажмите Ctrl/Cmd + Shift + P, и во всплывающем меню введите: Component Creator: Download Template (шаблонов пока не много, будем понемногу пополнять).

Но это не наш путь. Мы создадим собственный шаблон для React компонентов! 

Для начала в корне проекта нужно создать директорию .vscode/cch-template. Эта дефолтная директория, откуда будут браться шаблоны. В ней мы создадим директорию с названием React FC, это будет названием нашего шаблона. В примере попробуем воссоздать структуру описанную в самом начале поста.

Внутри папки React FC создаем еще одну, с названием {{pascalCase}} (что заменит название компонента в формате pascal case). Далее, в этой папке создаем структуру файлов, которая будет выглядеть следующим образом:

template
template

Наполняем файлы:

/* {{pascalCase}}.module.css */
.wrapper {
}
/* {{pascalCase}}.props.ts */
import { DetailedHTMLProps, HTMLAttributes } from 'react';

export interface {{pascalCase}}Props extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement> {}
/* {{pascalCase}}.tsx */
import React, { FC } from 'react';
import { {{pascalCase}}Props } from '.';
import styles from './{{pascalCase}}.module.css'

export const {{pascalCase}}: FC<{{pascalCase}}Props> = (props) => {
  return (<div className={styles.wrapper} {...props}>
    {{pascalCase}} component is mounted!
  </div>);
};
/* index.ts */
export * from './{{pascalCase}}';
export * from './{{pascalCase}}.props';

Ну вот и все. Шаблон готов!

  1. Выбираем необходимую директорию, кликаем по ней правой кнопкой мыши;

  2. В контекстном меню выбираем пункт “New Component ????”;

  3. Вводим название компонента через пробел;

  4. Наслаждаемся собственным превосходством :)

result
result

Как Вы уже поняли конструкции типа {{pascalCase}} {{camelCase}} и так далее нужны для того чтобы вставлять преобразованное название компонента в название или структуру файла. Подробнее о всех стилях форматирования можно посмотреть в описание самого расширения.

Помимо описанного способа, компоненты можно также создавать прямо из кода. Выделив название, нажав правую кнопку мыши и выбрав пункт "New Component ????", расширение автоматически подставит название компонента.

Если нам потребуется создать компонент в другой директории, то в названии компонента поддерживается структура ../. Например указав в названии компонента ../../modals/user registration, расширение выйдет на два уровня выше, создаст директорию modals, и уже в нее создаст компонент.

Пример работы уже настроенного расширения. 20 файлов, общей сложностью в 5к+ символов за 3 минуты не запрягаясь.

В итоге создав несколько таких шаблонов для себя, можно стандартизировать и сильно ускорить разработку как на фронте, так и на беке. Плюс как Вы уже заметили, нет никакой привязки по языкам и фреймворкам. Таким-же образом можно создавать структуры для Python, Angular, Vue и т.д.

Если у Вас есть какие-то идеи о том как можно доработать или переработать компонент, всегда буду рад обсудить это в комментариях. Как я уже писал, это мой первый open-source проект, по этому я буду благодарен за Ваши звездочки и рад любому фидбеку! :)

Комментарии (10)


  1. hbn3
    04.10.2022 20:38
    +2

    Всё таки было бы хорошо провести сравнение с существующими решениями. Например с es7-react-js-snippets, тоже опенсоурс под MIT лицензией, более 6 миллионов скачиваний.

    Ну и самое интересное конечно не «dumb» ускорения делать, а поумнее.

    Например стоишь на имени класса — нажал кнопочку, он тебе по шаблону сделал компонент в котором например все публичные поля привязаны для редактирования.


    1. Max_JK
      04.10.2022 22:03
      +1

      Согласен, в идеале можно двигаться в сторону подхода intellij чтобы генерировались файлы сразу с нужной структурой, например написал <MyClass1/> и если такого компонента для импорта не найдется, то создается новый, либо чтобы можно было выносить часть кода в отдельный компонент выделив его рамкой как в полноценных ide вроде visual studio C#

      Также по стилям, при вводе <MyClass1 :class="style.container"/> создается новый стиль .container, если его нет, но тут уже нужно учитывать специфику языка jsx, vue template, css modules и т.д

      А для простой верстки обычные шаблоны тоже довольно удобны. я использую другое расширение, похожее на то что в статье но шаблоны задаются через json


      1. dsbasko Автор
        05.10.2022 07:16

        Тут все упирается в гибкость. Для каждого языка и фреймворка есть существует архитектура компонентов. Про реакт вообще молчу. Для этого придется создавать под каждый фреймворк отдельное расширение :)


    1. dsbasko Автор
      05.10.2022 07:11

      Что касается не dumb ускорения, тут согласен. Все упирается в идеи. На момент реализации расширения, для меня нынешняя реализация была максимально удобной.

      В какой-то степени статья больше нужна для сбора идей.


    1. dsbasko Автор
      07.10.2022 11:00

      Кстати сделал. В версии 2.1.3 можно выделить текст в коде и на основе него создать компонент по шаблону. Более того, в названии компонента поддерживаются конструкции типа ../. Указав название шаблона как "../../modals/register user", расширение выйдет на 2 уровня вверх, создаст директорию modals и в нее положит компонент.


  1. andrejsharapov
    05.10.2022 10:47

    Поправьте в примерах форматы текста, а то получается что у вас `Pascal` не отличается от `camel`: {{pascalCase}} {{camelCase}}


  1. Bronx
    07.10.2022 01:36
    +1

    Как насчёт добавить возможность загружать шаблоны из других репозиториев, или, например, привязать Gist как библиотеку шаблонов?


    1. dsbasko Автор
      07.10.2022 06:58

      Прекрасная идея подтягивать сниппеты с GitHub Gist, однако он не сильно подходит для шаблонов, так как нельзя создавать директории! Но темнеменее в задачи записал :)


      1. Bronx
        07.10.2022 07:44

        Да, к сожалению gist-ы подходят только для одноуровневых шаблонов. Многоуровневые можно брать из реп на GitHub и проч.


        Ещё вот не уверен, что это хорошая идея — складывать сниппеты в .vscode. Эта дот-директория самого VSCode. Расширения, по-идее, должны создавать свои собственные дот-директории и дот-конфиги в корне проекта/воркспейса.


  1. shsv382
    07.10.2022 10:30
    +1

    Класс! Давно не хватало такого, но до реализации руки не доходили! Сегодня опробую!