DEV Community

Eduardo Henrique Gris
Eduardo Henrique Gris

Posted on

1 1

Reduzindo trabalho manual em React com Hygen

Introdução

Na criação de novos componentes e módulos dentro de uma app React, normalmente se segue um padrão de projeto, de estrutura de pastas e tipos de arquivos. Partindo da criação de um novo componente, pode-se proceder por exemplo das seguintes formas: duplicar as pastas e arquivos de outro componente presente na app, renomeando os nomes dos arquivos, atualizando imports e substituindo código para corresponder as definições do novo componente ou criar as pastas e arquivos na mão. Mas como seria possível melhorar a eficiência desse processo de criação de um novo componente para ser menos manual?

Hygen

Hygen é uma lib de geração automática de código, a qual a partir de definição de templates permite a geração de arquivos e definir o local dentro da aplicação que esses arquivos serão criados.

Setup

Para adicionar o Hygen na aplicação é necessário rodar o seguinte comando:

yarn add --dev hygen

Para iniciar o Hygen no projeto:

npx hygen init self

Ele vai gerar uma pasta _templates onde estarão duas pastas com alguns arquivos iniciais para uso do Hygen. Nessa pasta _templates será onde definiremos os templates para geração de arquivos.

Image description

A seguir será necessário criar um gerador de código a partir do seguinte comando, onde no lugar de nome_do_gerador é colocado o nome que representa ele (por exemplo pode ser colocado component para um gerador de componentes):

npx hygen generator new nome_do_gerador

Esse comando vai gerar uma estrutura de pastas _templates/nome_do_gerador/new, com um template inicial de exemplo. Dentro de nome_do_gerador/new, será definido todos os templates que serão usados ao executar o gerador no terminal. O template inicial (hello.ejs.t) de exemplo vem com o seguinte código:

---
to: app/hello.js
---
const hello = ```
Hello!
This is your first hygen template.

Learn what it can do here:

https://github.com/jondot/hygen
```

console.log(hello)

Enter fullscreen mode Exit fullscreen mode

Onde to: define o local que o novo arquivo será criado e abaixo dele está o código que vai ser gerado. Todos os arquivos de template seguem o padrão nome_do_template.ejs.t.
Para rodar o gerador e criar novos arquivos a partir dos templates definidos dentro dele, sugiro criar em package.json um script para execução de hygen nome_do_gerador new, segue um exemplo partindo de um gerador com nome_do_gerador igual component:

"scripts": {
  (...),
  "create-component": "hygen component new"
},
Enter fullscreen mode Exit fullscreen mode

Para execução do gerador seria executar:

yarn create-component

Após executar esse comando, todos os templates dentro de component/new irão gerar novos arquivos.

Além de criação de novos arquivos o Hygen permite a injeção de código dentro de arquivos já existentes, para isso o to: tem que estar definido com o caminho de um arquivo já existente dentro da app, dentro do template tem que definir inject: true e para especificar o lugar para injeção uma das formas é definir a linha a ser incluída a adição de código at_line:, seguindo a estrutura abaixo:

---
inject: true
to: caminho_de_arquivo_existente
at_line: 0
---
Enter fullscreen mode Exit fullscreen mode

Também é possível passar um valor dinâmico dentro dos templates colocando <%=name%>, tanto na definição do código a ser gerado quanto na definição do lugar do arquivo. Segue um exemplo abaixo de uso na definição do lugar do arquivo:

---
to: src/components/<%=name%>.js
---
Enter fullscreen mode Exit fullscreen mode

Partindo do exemplo de um gerador com nome component, ao executar o comando yarn create-component Input, o <%=name%> do template acima vai ser substituído por Input e o arquivo desse template será gerado em src/components/Input.js.

Exemplo de execução

Agora vou apresentar um exemplo de execução do Hygen para gerar um novo componente, a ideia é mostrar o funcionamento de criação de arquivos e injeção de código em arquivo existente. Vamos partir de uma app que tem a seguinte estrutura:

Image description

Onde em src/components/Tag/Tag.js tem-se a definição do componente:

import React from "react";

const Tag = ({(...)}) => (
  <div>
    (...)
  </div>
);

export default Tag;
Enter fullscreen mode Exit fullscreen mode

Em src/components/Tag/Tag.test.js os testes:

import React from "react";
import "@testing-library/jest-dom";
import { render, screen } from "@testing-library/react";

import Tag from "./Tag";

describe("<Tag />", () => {
  (...)
});
Enter fullscreen mode Exit fullscreen mode

Em src/components/Tag/index.js o export dentro da pasta do componente:

export { default } from "./Tag";
Enter fullscreen mode Exit fullscreen mode

Em src/components/index.js o export dentro da pasta components:

export { default as Tag } from "./Tag";
Enter fullscreen mode Exit fullscreen mode

O primeiro passo é criar o gerador de código, o qual por ser de criação de componente vou chamar de component. Executando no terminal:

npx hygen generator new component

Dessa forma será criada a estrutura de pastas _templates/component/new e um arquivo de exemplo:

Image description

Como o arquivo hello.ejs.t não será utilizado, ele será removido e dentro da pasta new serão adicionados os templates.
Para a criação do componente, será criado o template component.ejs.t:

---
to: src/components/<%=name%>/<%=name%>.js
---
import React from "react";

const <%=name%> = ({}) => (

);

export default <%=name%>;

Enter fullscreen mode Exit fullscreen mode

Para os testes o template test.ejs.t:

---
to: src/components/<%=name%>/<%=name%>.test.js
---
import React from "react";
import "@testing-library/jest-dom";
import { render, screen } from "@testing-library/react";

import <%=name%> from "./<%=name%>";

describe("<<%=name%> />", () => {

});

Enter fullscreen mode Exit fullscreen mode

Para o export dentro da pasta do componente o template index.ejs.t:

---
to: src/components/<%=name%>/index.js
---
export { default } from "./<%=name%>";

Enter fullscreen mode Exit fullscreen mode

Para o export dentro da pasta de componentes, uma vez que o arquivo já existe e tem o export do componente Tag dentro dele, será feito o inject de código com o template componentsIndex.ejs.t:

---
inject: true
to: src/components/index.js
at_line: 0
---
export { default as <%=name%> } from "./<%=name%>";
Enter fullscreen mode Exit fullscreen mode

O <%=name%> vai ser o nome do componente a ser criado, que será definido quando rodar o comando para usar o gerador component.
Vai ficar da seguinte forma os templates definidos:

Image description

Para executar o gerador de componentes, vai ser adicionado em package.json:

"scripts": {
  "create-component": "hygen component new"
},
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo vai ser criado um componente de botão chamado de Button, para isso ao executar o comando para rodar o gerador será necessário adicionar Button no final, para que todos os templates substituam o <%=name%> por Button:

yarn create-component Button

Image description

Mostrando no terminal os três arquivos gerados e o arquivo existente que teve código adicionado dentro dele.

Ficando a estrutura de pastas, arquivos e código da forma definida nos templates.

Image description

Conclusão

Por fim, a ideia desse artigo é mostrar uma forma de reduzir trabalho manual no desenvolvimento em React, automatizando parte do processo. Passei um exemplo referente a criação de componentes para ilustrar o funcionamento, mas já me deparei com o uso do Hygen para geração de módulos, que compartilham a mesma estrutura de pastas, tipos de arquivos, configuração de Babel, typescript, dentre outras, acelerando o processo de criação deles utilizando a lib.

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay