<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: romulo</title>
    <description>The latest articles on DEV Community by romulo (@romulospl).</description>
    <link>https://dev.to/romulospl</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1060173%2Fe60d889d-839a-43a9-bd85-a2fcee9e9a0c.jpeg</url>
      <title>DEV Community: romulo</title>
      <link>https://dev.to/romulospl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/romulospl"/>
    <language>en</language>
    <item>
      <title>Criando monorepo com biblioteca reutilizavel, usando PNPM (React + TypeScript)</title>
      <dc:creator>romulo</dc:creator>
      <pubDate>Thu, 30 May 2024 20:25:33 +0000</pubDate>
      <link>https://dev.to/romulospl/criando-monorepo-com-biblioteca-reutilizavel-usando-pnpm-react-typescript-57p7</link>
      <guid>https://dev.to/romulospl/criando-monorepo-com-biblioteca-reutilizavel-usando-pnpm-react-typescript-57p7</guid>
      <description>&lt;h1&gt;
  
  
  Introdução:
&lt;/h1&gt;

&lt;p&gt;Neste artigo aborda a criação de um monorepo para desenvolvimento de projetos, com destaque para a configuração de um workspace e a publicação de um pacote no GitHub Package Registry. Demonstramos também como utilizar esse pacote em um novo projeto externo ao monorepo, fornecendo uma visão abrangente do desenvolvimento modular e colaborativo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 1: Configurando o Ambiente Inicial
&lt;/h2&gt;

&lt;p&gt;Vamos começar criando o diretório do projeto e inicializando nosso workspace monorepo usando &lt;em&gt;pnpm&lt;/em&gt;. Primeiro, crie uma nova pasta para o projeto no local de sua preferência. No exemplo abaixo, criaremos a pasta no diretório home:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir ~/monorepo-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa pasta servirá como o workspace do nosso monorepo. Em seguida, navegue até essa pasta e inicialize um novo projeto Node.js com &lt;em&gt;pnpm&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/monorepo-project
pnpm init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após inicializar o projeto, vamos configurar o controle de versão com Git e criar um arquivo .gitignore para ignorar a pasta node_modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init
echo -e "node_modules" &amp;gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando git init inicializa um novo repositório Git no diretório atual, e o comando echo -e "node_modules" &amp;gt; .gitignore cria um arquivo .gitignore com a entrada node_modules, que informa ao Git para ignorar essa pasta, evitando que ela seja incluída nos commits.&lt;/p&gt;

&lt;p&gt;Finalmente, vamos configurar o projeto para usar módulos ES6 alterando o tipo de módulo no arquivo package.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm pkg set type="module"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso adiciona a seguinte linha ao seu package.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
....
  "type": "module"
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A configuração "type": "module" permite que você use a sintaxe de módulos ES6 (import/export) no seu projeto Node.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 2: Estruturando o Projeto
&lt;/h2&gt;

&lt;p&gt;Agora que temos o ambiente inicial configurado, vamos estruturar nosso monorepo criando as pastas necessárias e inicializando um projeto de biblioteca de componentes.&lt;/p&gt;

&lt;p&gt;Primeiro, crie duas pastas chamadas &lt;strong&gt;&lt;code&gt;packages&lt;/code&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;code&gt;apps&lt;/code&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir packages apps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A pasta packages será usada para armazenar pacotes reutilizáveis, como nossa biblioteca de componentes, e a pasta apps conterá nossos aplicativos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o Projeto de Biblioteca de Componentes (UI Kit)
&lt;/h3&gt;

&lt;p&gt;Dentro da pasta packages, vamos criar um projeto de biblioteca de componentes chamado uikit usando o Vite. Para isso, execute os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd packages
pnpm create vite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durante a criação do projeto com o Vite, você será solicitado a fornecer algumas informações, como o nome do projeto e o template a ser usado. Siga as instruções e escolha as opções apropriadas para o seu projeto de biblioteca de componentes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu84oa615uicm7dfrf7u7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu84oa615uicm7dfrf7u7.png" alt=" " width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de concluir a criação do projeto, sua estrutura de diretórios deverá se parecer com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;monorepo-project/
  ├── packages/
  │   └── uikit/
  ├── apps/
  ├── package.json
  ├── .gitignore
  ├── pnpm-lock.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 3: Criando o Componente de UI
&lt;/h2&gt;

&lt;p&gt;Agora que temos nosso projeto de biblioteca de componentes configurado, vamos criar um simples componente de botão dentro do &lt;strong&gt;&lt;code&gt;uikit&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Primeiro, navegue até a pasta &lt;strong&gt;&lt;code&gt;uikit&lt;/code&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd uikit
pnpm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, dentro da pasta src do projeto uikit, crie a estrutura de diretórios components/Button:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p src/components/Button
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro dessa pasta Button, crie um arquivo chamado index.tsx e adicione o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/components/Button/index.tsx
export default function ButtonTeste() {
  return &amp;lt;div style={{ backgroundColor: 'green', borderRadius: '25px', padding: '10px' }}&amp;gt;Button&amp;lt;/div&amp;gt;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este código define um componente React simples chamado &lt;strong&gt;&lt;code&gt;ButtonTeste&lt;/code&gt;&lt;/strong&gt; que renderiza um botão estilizado com uma cor de fundo verde, bordas arredondadas e padding.&lt;/p&gt;

&lt;p&gt;Após criar o componente, sua estrutura de diretórios deve se parecer com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cssCopiar código
monorepo-project/
  ├── packages/
  │   └── uikit/
  │       └── src/
  │           └── components/
  │               └── Button/
  │                   └── index.tsx
  ├── apps/
  ├── package.json
  ├── .gitignore
  ├── pnpm-lock.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 4: Configurando o Vite para Modo Biblioteca
&lt;/h2&gt;

&lt;p&gt;Para que nosso projeto uikit funcione como uma biblioteca, precisamos ajustar a configuração do Vite. Por padrão, o Vite busca um arquivo index.html como ponto de entrada no modo de aplicação. No entanto, queremos que ele procure main.ts para exportar nossos componentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalando o Plugin DTS
&lt;/h3&gt;

&lt;p&gt;Primeiro, vamos instalar o plugin DTS, que gera arquivos de declaração (*.d.ts) a partir de arquivos .ts(x) quando o Vite está configurado no modo biblioteca. Execute o seguinte comando dentro da pasta uikit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm add -D vite-plugin-dts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configurando o Vite
&lt;/h3&gt;

&lt;p&gt;Se o arquivo vite.config.ts não existir, crie-o na raiz do projeto uikit e adicione o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// vite.config.ts
import { defineConfig } from 'vite';
import { resolve } from 'path';
import dts from 'vite-plugin-dts';

export default defineConfig({
  build: {
    lib: {
      entry: resolve(__dirname, 'src/main.ts'),
      formats: ['es', 'cjs'],
      fileName: (format) =&amp;gt; `main.${format}.js`,
    },
    rollupOptions: {
      external: ['react', 'react-dom'],
      output: {
        globals: {
          react: 'React',
          'react-dom': 'ReactDOM',
        },
      },
    },
  },
  resolve: {
    alias: {
      src: resolve(__dirname, 'src/'),
    },
  },
  plugins: [
    dts({
      tsconfigPath: './tsconfig.json', // Caminho para o arquivo tsconfig.json
      outDir: 'dist', // Diretório de saída dos arquivos de definição de tipos
    }),
  ],
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Se der erro na importação do resolve do pacote ‘path’ basta dar o seguinte comando dentro da pasta uikit: pnpm install --save-dev @types/node&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Criando o Arquivo main.ts
&lt;/h3&gt;

&lt;p&gt;Agora, crie o arquivo main.ts dentro da pasta src que será o responsável exportar nossos componentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch src/main.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione o seguinte conteúdo ao arquivo main.ts para exportar o componente ButtonTeste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/main.ts
import ButtonTeste from './components/Button';
export { ButtonTeste } 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após essas configurações, sua estrutura de diretórios deve se parecer com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;monorepo-project/
  ├── packages/
  │   └── uikit/
  │       ├── src/
  │       │   ├── components/
  │       │   │   └── Button/
  │       │   │       └── index.tsx
  │       │   └── main.ts
  │       └── vite.config.ts
  ├── apps/
  ├── package.json
  ├── .gitignore
  ├── pnpm-lock.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 5: Configurando o package.json para Suporte a CommonJS e ES Modules
&lt;/h2&gt;

&lt;p&gt;Para garantir que nossa biblioteca uikit suporte tanto CommonJS quanto ES Modules, precisamos atualizar o package.json com as entradas apropriadas para os pontos de entrada do módulo e as declarações de tipos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizando o package.json
&lt;/h3&gt;

&lt;p&gt;Abra o arquivo package.json do projeto uikit e adicione as seguintes configurações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  ...
  "main": "./dist/main.es.js",
  "module": "./dist/main.es.js",
  "types": "./dist/main.d.ts",
  "exports": {
    ".": {
      "import": "./dist/main.es.js",
      "require": "./dist/main.es.js",
      "types": "./dist/main.d.ts"
    }
  },
  "files": [
    "dist"
  ],
  ...
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Detalhes do arquivo package.json:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"main": "./dist/main.cjs.js"&lt;/code&gt;&lt;/strong&gt;: Especifica o ponto de entrada para consumidores CommonJS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"module": "./dist/main.js"&lt;/code&gt;&lt;/strong&gt;: Especifica o ponto de entrada para consumidores ES Modules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"types": "./dist/main.d.ts"&lt;/code&gt;&lt;/strong&gt;: Especifica o arquivo de declarações de tipos TypeScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"exports"&lt;/code&gt;&lt;/strong&gt;: Define como os diferentes módulos podem ser importados.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"import"&lt;/code&gt;&lt;/strong&gt;: Usado por ES Modules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"require"&lt;/code&gt;&lt;/strong&gt;: Usado por CommonJS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"types"&lt;/code&gt;&lt;/strong&gt;: Define o caminho para os arquivos de declarações de tipos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;"files"&lt;/code&gt;&lt;/strong&gt;: Especifica quais arquivos devem ser incluídos no pacote publicado. Neste caso, apenas a pasta &lt;strong&gt;&lt;code&gt;dist&lt;/code&gt;&lt;/strong&gt; será incluída.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;"scripts"&lt;/code&gt;&lt;/strong&gt;: Adiciona um script de build para compilar a biblioteca usando Vite.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Passo 6: Criando o Projeto Web App e Configurando o Workspace
&lt;/h2&gt;

&lt;p&gt;Agora vamos criar o projeto web-app, que fará uso da nossa biblioteca de componentes uikit, dentro do mesmo repositório.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o Projeto Web App
&lt;/h3&gt;

&lt;p&gt;Navegue até a pasta apps dentro da raiz do projeto monorepo-project e crie o projeto web-app usando o Vite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# dentro de monorepo-project/apps execute:
pnpm create vite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fav50gxfoe4bpf0fjo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fav50gxfoe4bpf0fjo4.png" alt=" " width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;entre dentro da pasta web-app execute &lt;code&gt;pnpm install&lt;/code&gt; para instalar as dependências.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurando o Workspace
&lt;/h3&gt;

&lt;p&gt;Após criar o projeto web-app, precisamos configurar um workspace para gerenciar todos os projetos dentro do mesmo repositório.&lt;/p&gt;

&lt;p&gt;Volte para a pasta raiz do monorepo-project e crie um arquivo chamado pnpm-workspace.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ..
touch pnpm-workspace.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro desse arquivo, insira o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;packages:
  - 'apps/*'
  - 'packages/*'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa configuração informa ao pnpm para reconhecer os diretórios apps e packages como parte do workspace, permitindo que eles sejam gerenciados em conjunto.&lt;br&gt;
Após realizar essas etapas, sua estrutura de diretórios deve se parecer com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
monorepo-project/
  ├── packages/
  │   └── uikit/
  │       ├── src/
  │       │   ├── components/
  │       │   │   └── Button/
  │       │   │       └── index.tsx
  │       │   └── main.ts
  │       ├── tsup.config.ts
  │       └── package.json
  ├── apps/
  │   └── web-app/
  │       ├── src/
  │       ├── package.json
  ├── package.json
  ├── pnpm-lock.yaml
  ├── pnpm-workspace.yaml
  ├── .gitignore


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, temos o projeto web-app criado e o workspace configurado para gerenciar todos os projetos dentro do mesmo repositório.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 7: Instalando e Configurando o tsup
&lt;/h2&gt;

&lt;p&gt;O tsup é uma ferramenta rápida para transpilar arquivos TypeScript em JavaScript. Ele simplifica o processo de configuração e execução, facilitando a compilação de código TypeScript para uso em projetos JavaScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalando o tsup
&lt;/h3&gt;

&lt;p&gt;Para instalar o tsup, execute o seguinte comando dentro da pasta uikit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm add tsup -D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Criando o Arquivo de Configuração tsup.config.ts
&lt;/h3&gt;

&lt;p&gt;Agora, crie o arquivo tsup.config.ts na raiz do projeto uikit e adicione o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// tsup.config.ts
import { defineConfig } from 'tsup';

export default defineConfig({
  entry: ['src/main.ts'],
  format: ['cjs', 'esm'],
  dts: true,
  sourcemap: true,
  clean: true,
  outDir: 'dist',
  external: ['react', 'react-dom'],
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;detalhes o tsup.config.ts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;entry&lt;/code&gt;&lt;/strong&gt;: Especifica o arquivo de entrada ou uma lista de arquivos de entrada para transpilação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;format&lt;/code&gt;&lt;/strong&gt;: Define os formatos de saída desejados, neste caso, CommonJS (&lt;strong&gt;&lt;code&gt;cjs&lt;/code&gt;&lt;/strong&gt;) e ES Module (&lt;strong&gt;&lt;code&gt;esm&lt;/code&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;dts&lt;/code&gt;&lt;/strong&gt;: Habilita a geração de arquivos de definição de tipos TypeScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sourcemap&lt;/code&gt;&lt;/strong&gt;: Habilita a geração de sourcemaps para depuração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;clean&lt;/code&gt;&lt;/strong&gt;: Limpa o diretório de saída antes de compilar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;outDir&lt;/code&gt;&lt;/strong&gt;: Especifica o diretório de saída dos arquivos transpilados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;external&lt;/code&gt;&lt;/strong&gt;: Lista de módulos que serão considerados externos e não incluídos no pacote.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após essas configurações, sua estrutura de diretórios deve se parecer com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cssCopiar código
monorepo-project/
  ├── packages/
  │   └── uikit/
  │       ├── src/
  │       │   ├── components/
  │       │   │   └── Button/
  │       │   │       └── index.tsx
  │       │   └── main.ts
  │       ├── tsup.config.ts
  │       └── package.json
  ├── apps/
  ├── package.json
  ├── .gitignore
  ├── pnpm-lock.yaml

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 8: Configurando o Web App para Usar o UI Kit
&lt;/h2&gt;

&lt;p&gt;Agora vamos configurar o projeto web-app para utilizar o uikit que criamos anteriormente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionando o UI Kit como Dependência
&lt;/h3&gt;

&lt;p&gt;Abra o arquivo package.json do projeto web-app e adicione o uikit como uma dependência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "web-app",
  "version": "1.0.0",
  "dependencies": {
    "uikit": "workspace:*"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute o comando pnpm install na pasta web-app para que as dependências sejam instaladas e o uikit seja reconhecido pelo projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizando o App.tsx
&lt;/h3&gt;

&lt;p&gt;Atualize o arquivo App.tsx do projeto web-app para importar e utilizar o componente ButtonTeste do uikit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// web-app/src/App.tsx
import { ButtonTeste } from "uikit";

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;ButtonTeste /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compilando o UI Kit
&lt;/h3&gt;

&lt;p&gt;Antes de iniciar o servidor de desenvolvimento, certifique-se de compilar o uikit. Navegue até a pasta uikit e execute o comando pnpm build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iniciando o Servidor de Desenvolvimento
&lt;/h3&gt;

&lt;p&gt;Por fim, execute o comando pnpm run dev dentro da pasta web-app para iniciar o servidor de desenvolvimento e visualizar o botão na tela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd monorepo-project/apps/web-app
pnpm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso iniciará o servidor de desenvolvimento e você poderá acessar o projeto web-app em seu navegador para visualizar o botão do UI Kit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 9: Publicando o UI Kit no GitHub Package Registry
&lt;/h2&gt;

&lt;p&gt;Agora vamos publicar nosso pacote uikit no GitHub Package Registry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurando o Arquivo .npmrc
&lt;/h3&gt;

&lt;p&gt;Crie um arquivo chamado .npmrc na raiz do projeto uikit e adicione o seguinte conteúdo, substituindo seuNomeDeUsuario pelo seu nome de usuário do GitHub e SeuToken pelo seu token de acesso (certifique-se de que seu token tenha permissões para criar pacotes no GitHub):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@seuNomeDeUsuario:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=SeuToken
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Criando o Arquivo .npmignore
&lt;/h3&gt;

&lt;p&gt;Também na raiz do projeto uikit, crie um arquivo chamado .npmignore com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ignore everything
*

# Mas não ignore a pasta dist
!dist

# Você também pode querer incluir o package.json e outros arquivos importantes
!package.json
!README.md

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modificando o package.json
&lt;/h3&gt;

&lt;p&gt;Abra o arquivo package.json do projeto uikit e modifique o nome do pacote e o atributo private. Seu package.json deve ficar semelhante a isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "@seuNomeDeUsuario/nomeDoPacote",
  "private": false,
  ...
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua seuNomeDeUsuario pelo seu nome de usuário do GitHub e nomeDoPacote pelor exemplo o meu projeto fica da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "@romulospl/uikit",
  "private": false,
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publicando o Pacote
&lt;/h3&gt;

&lt;p&gt;Agora estamos prontos para publicar nosso pacote. Execute o seguinte comando na raiz do projeto uikit:&lt;br&gt;
npm publish --registry=&lt;a href="https://npm.pkg.github.com" rel="noopener noreferrer"&gt;https://npm.pkg.github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso irá publicar o pacote uikit no GitHub Package Registry.&lt;/p&gt;

&lt;p&gt;Após publicar o pacote uikit no GitHub Package Registry, é importante verificar se a publicação foi realizada com sucesso.&lt;/p&gt;
&lt;h3&gt;
  
  
  Acessando o GitHub Package Registry
&lt;/h3&gt;

&lt;p&gt;Acesse o seguinte link em seu navegador, substituindo &lt;strong&gt;&lt;code&gt;seuNomeDeUsuario&lt;/code&gt;&lt;/strong&gt; pelo seu nome de usuário do GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/seuNomeDeUsuario?tab=packages" rel="noopener noreferrer"&gt;https://github.com/seuNomeDeUsuario?tab=packages&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Verificando o Pacote Publicado
&lt;/h3&gt;

&lt;p&gt;Na página dos pacotes do seu perfil do GitHub, você deve ser capaz de ver o pacote uikit listado. Isso confirma que o pacote foi publicado com sucesso no GitHub Package Registry.&lt;br&gt;
Verifique se todas as informações estão corretas e se o pacote está disponível para uso.&lt;/p&gt;
&lt;h2&gt;
  
  
  Passo 10: Criando o Projeto use-component e Utilizando o UI Kit
&lt;/h2&gt;

&lt;p&gt;Agora vamos criar um novo projeto chamado use-component fora do monorepo-project e utilizá-lo para demonstrar o uso do nosso pacote uikit do GitHub Package Registry.&lt;/p&gt;
&lt;h3&gt;
  
  
  Criando o Projeto &lt;code&gt;use-component&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Na pasta de sua preferência (por exemplo, na sua pasta pessoal), execute o seguinte comando para criar o projeto &lt;code&gt;use-component&lt;/code&gt; usando Vite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm create vite use-component
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, entre na pasta do projeto e execute pnpm install para instalar as dependências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd use-component
pnpm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalando o Pacote &lt;code&gt;uikit&lt;/code&gt; do GitHub Package Registry
&lt;/h3&gt;

&lt;p&gt;Acesse o GitHub e vá para a página dos seus pacotes, substituindo &lt;em&gt;seuNomeDeUsuario&lt;/em&gt; pelo seu nome de usuário do GitHub:&lt;br&gt;
&lt;a href="https://github.com/seuNomeDeUsuario?tab=packages" rel="noopener noreferrer"&gt;https://github.com/seuNomeDeUsuario?tab=packages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique no pacote &lt;strong&gt;&lt;code&gt;uikit&lt;/code&gt;&lt;/strong&gt; para acessar sua página. Lá você encontrará o comando para instalar o pacote.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbdqmazfr0c2j0d1b889.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbdqmazfr0c2j0d1b889.png" alt=" " width="686" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copie o comando, substituindo &lt;a class="mentioned-user" href="https://dev.to/romulospl"&gt;@romulospl&lt;/a&gt;/uikit pelo nome do seu pacote e 0.0.0 pela versão desejada.&lt;/p&gt;

&lt;p&gt;Em seguida, crie um arquivo chamado &lt;code&gt;.npmrc&lt;/code&gt; na raiz do projeto &lt;code&gt;use-component&lt;/code&gt; e adicione a seguinte linha, substituindo &lt;em&gt;seuNomeDeUsuario&lt;/em&gt; pelo seu nome de usuário do GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@seuNomeDeUsuario:registry = https://npm.pkg.github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso, cole o comando que você copiou anteriormente para instalar o pacote uikit, substituindo as informações necessárias.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm install @seuNomeDeUsuario/uikit@0.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilizando o Componente do UI Kit
&lt;/h3&gt;

&lt;p&gt;Agora que o pacote &lt;code&gt;uikit&lt;/code&gt; está instalado, vamos utilizá-lo no arquivo &lt;code&gt;App.tsx&lt;/code&gt; dentro da pasta src do projeto &lt;em&gt;use-component&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Modifique o arquivo App.tsx para importar e utilizar o componente ButtonTeste do pacote uikit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// use-component/src/App.tsx
import './App.css';
import { ButtonTeste } from '@seuNomeDeUsuario/uikit';

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;ButtonTeste /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Executando a Aplicação
&lt;/h3&gt;

&lt;p&gt;Agora execute a aplicação com o comando pnpm run dev e você verá o botão do UI Kit em funcionamento na tela.&lt;/p&gt;

&lt;p&gt;Se você verificar a pasta &lt;em&gt;node_modules&lt;/em&gt; dentro do projeto use-component, verá uma pasta &lt;code&gt;@seuNomeDeUsuario&lt;/code&gt; (por exemplo, &lt;a href="https://github.com/romulospl" rel="noopener noreferrer"&gt;@romulospl&lt;/a&gt;). Dentro dessa pasta, há uma pasta uikit, contendo apenas a pasta dist do projeto e o arquivo package.json com as configurações de entrada e exportação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdgt87pgl16rn54vbfyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdgt87pgl16rn54vbfyd.png" alt=" " width="221" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/romulospl/monorepo-project" rel="noopener noreferrer"&gt;Link para o repositório monorepo-project&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
