DEV Community

Lucas Pereira de Souza
Lucas Pereira de Souza

Posted on

Criando Web Components

logotech

## Construindo Componentes Web Poderosos com JavaScript Puro

No mundo do desenvolvimento web moderno, a modularidade e a reutilização de código são essenciais. Componentes web oferecem uma solução elegante para criar interfaces de usuário complexas de maneira organizada e fácil de manter. Neste post, vamos explorar como construir componentes web robustos utilizando JavaScript puro, Shadow DOM e como empacotar seu componente para que ele possa ser usado em qualquer site.

Por que Componentes Web?

  • Reutilização: Crie componentes que podem ser usados em múltiplas partes do seu site ou em diferentes projetos.
  • Encapsulamento: Shadow DOM garante que o CSS e o JavaScript do seu componente não interfiram com o resto da página e vice-versa.
  • Manutenção: Facilidade para atualizar e modificar componentes individuais sem afetar o restante da aplicação.
  • Organização: Divide a sua UI em partes menores e gerenciáveis.

Criando um Componente Web com JavaScript Puro

Vamos construir um componente simples: um botão customizado.

class MeuBotao extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({ mode: 'open' }); // 'open' ou 'closed'
  }

  connectedCallback() {
    this.render();
    this.addEventListener('click', () => {
      this.onClick();
    });
  }

  onClick() {
    alert('Botão clicado!');
  }

  render() {
    this.shadow.innerHTML = `
      <style>
        button {
          background-color: #4CAF50;
          border: none;
          color: white;
          padding: 10px 20px;
          text-align: center;
          text-decoration: none;
          display: inline-block;
          font-size: 16px;
          margin: 4px 2px;
          cursor: pointer;
          border-radius: 5px;
        }
      </style>
      <button>
        <slot>Clique Aqui</slot>
      </button>
    `;
  }
}

customElements.define('meu-botao', MeuBotao);
Enter fullscreen mode Exit fullscreen mode

Análise do Código:

  1. class MeuBotao extends HTMLElement: Cria uma classe que estende HTMLElement, a base para todos os componentes web.
  2. constructor(): No construtor, chamamos super() para inicializar o componente e this.attachShadow({ mode: 'open' }) para criar o Shadow DOM. mode: 'open' permite acesso ao Shadow DOM de fora do componente (para fins de debug e modificação). mode: 'closed' impede o acesso.
  3. connectedCallback(): Este método é chamado quando o componente é inserido no DOM. Nele, chamamos this.render() para renderizar o conteúdo e adicionamos um event listener para o clique.
  4. onClick(): Um método simples que exibe um alerta ao clicar no botão.
  5. render(): Define o HTML e o CSS do componente dentro do Shadow DOM. Usamos <slot> para permitir que o conteúdo seja injetado pelo usuário do componente.
  6. customElements.define('meu-botao', MeuBotao): Registra o componente com o navegador, associando a tag <meu-botao> à nossa classe.

Usando o Shadow DOM para Encapsulamento

O Shadow DOM cria um DOM separado e isolado dentro do seu componente. Isso significa que:

  • Estilos: Os estilos definidos dentro do Shadow DOM não afetam o restante da página, e estilos da página não afetam o componente.
  • JavaScript: Variáveis e funções dentro do Shadow DOM não são acessíveis de fora, e vice-versa (a menos que você projete explicitamente para que sejam).

Distribuindo seu Pacote

Para tornar seu componente reutilizável em outros sites, você pode empacotá-lo e distribuí-lo. As opções incluem:

  1. Criação de um arquivo JavaScript: Simplesmente crie um arquivo .js contendo o código do seu componente. Incorpore-o em outros sites usando a tag <script>.

    <script src=\"meu-botao.js\"></script>
    <meu-botao>Clique Aqui</meu-botao>
    
  2. Usando um gerenciador de pacotes (npm/yarn):

*   **Inicialize o projeto:** `npm init -y` (ou `yarn init -y`)
*   **Crie o arquivo do componente** (como no exemplo acima).
*   **Crie um arquivo `index.js`** (ou o nome que você preferir) que exporta o seu componente.
Enter fullscreen mode Exit fullscreen mode
    ```javascript
    import './meu-botao.js'; // Importa o arquivo do componente
    ```
Enter fullscreen mode Exit fullscreen mode
*   **No `package.json`:**
    *   Defina o campo `main` para o arquivo principal (ex: `\"main\": \"index.js\"`).
    *   **Publique no npm** (opcional): `npm publish` (requer uma conta npm).
*   **Para usar em outro projeto:** `npm install seu-pacote-do-componente`
*   **Importe e use:**
Enter fullscreen mode Exit fullscreen mode
    ```javascript
    import 'seu-pacote-do-componente';
    // ...
    <meu-botao>Clique Aqui</meu-botao>
    ```
Enter fullscreen mode Exit fullscreen mode
  1. CDN (Content Delivery Network): Hospede seu arquivo JavaScript em uma CDN (como jsDelivr ou unpkg). Isso permite que você use seu componente em qualquer site, simplesmente adicionando uma tag <script> apontando para a URL da CDN.

    <script src=\"https://cdn.jsdelivr.net/npm/seu-pacote-do-componente@1.0.0/meu-botao.js"></script>
    <meu-botao>Clique Aqui</meu-botao>
    

Considerações Finais

Componentes web, juntamente com Shadow DOM, oferecem uma maneira poderosa e organizada de construir interfaces de usuário. Ao encapsular seu código e estilos, você garante que seu componente seja reutilizável, fácil de manter e não entre em conflito com outras partes do seu site. A distribuição do seu componente, seja por meio de arquivos JavaScript simples, gerenciadores de pacotes ou CDNs, permite que você compartilhe seu trabalho e crie um ecossistema de componentes reutilizáveis. Explore, experimente e construa!

Top comments (0)