<?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: Matheus Silva</title>
    <description>The latest articles on DEV Community by Matheus Silva (@matheusdsilva01).</description>
    <link>https://dev.to/matheusdsilva01</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F888049%2F3a8d486c-5764-4515-a75b-956dfa223f4e.webp</url>
      <title>DEV Community: Matheus Silva</title>
      <link>https://dev.to/matheusdsilva01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matheusdsilva01"/>
    <language>en</language>
    <item>
      <title>Feature-based: por que sua pasta components virou uma bagunça?</title>
      <dc:creator>Matheus Silva</dc:creator>
      <pubDate>Fri, 21 Aug 2026 19:37:54 +0000</pubDate>
      <link>https://dev.to/matheusdsilva01/feature-based-por-que-sua-pasta-components-virou-uma-bagunca-51lc</link>
      <guid>https://dev.to/matheusdsilva01/feature-based-por-que-sua-pasta-components-virou-uma-bagunca-51lc</guid>
      <description>&lt;p&gt;Acho que todo dev já passou pelo momento de se deparar com um projeto e se perder no meio de tantos arquivos. Isso pode ser resultado de N fatores, e um deles pode ser a forma como o projeto está organizado.&lt;/p&gt;

&lt;p&gt;Falando especificamente de frontend, quando criamos um projeto do zero em qualquer framework, ele vai lhe entregar uma estrutura padrão, chamada de &lt;code&gt;Type-based&lt;/code&gt; em que você consegue desenvolver coisas simples, nada muito complexo ou escalável. Você vai conseguir seguir essa estrutura inicial e entregar as features necessárias, e é isso.&lt;/p&gt;

&lt;p&gt;Até certo ponto, beleza: tudo funciona, você consegue se localizar entre as pastas e arquivos. Aí você vai integrando mais endpoints da API, adicionando features, novos fluxos, e então as coisas ficam entrelaçadas, distantes e muito desorganizadas. Implementar uma feature nova já não é tão simples, e se localizar é pior ainda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que essa dor?
&lt;/h3&gt;

&lt;p&gt;Isso foi uma experiência própria que vivi em projetos que desenvolvi, e que despertou minha curiosidade sobre como estruturar melhor meus projetos. Aí encontrei algumas possibilidades de arquiteturas, como DDD, Clean Architecture, MVC e Micro-frontend. Mas muitas delas eram voltadas para projetos backend, eu não via com bons olhos trazer isso para o frontend moderno e também me pareciam soluções muito complexas para algo simples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma solução... Simples?
&lt;/h3&gt;

&lt;p&gt;Foi aí que encontrei uma solução chamada &lt;code&gt;Feature-based&lt;/code&gt;. É uma abordagem que parece simples, em resumo: você pega seu projeto e quebra em partes. Que partes? Bom, aí pode ser por entidade, domínio, etc. Essa quebra traz algo interessante, que é a modularidade: seu sistema agora está mais desacoplado, cada parte passa a ser autogerenciável, tem sua própria responsabilidade e seu propósito bem definido.&lt;/p&gt;

&lt;p&gt;Dando um exemplo visual antes de seguirmos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── features/
│   ├── movies/
│   │   ├── components/
│   │   ├── hooks/
│   │   ├── api/
│   │   └── types/
│   ├── comments/
│   │   ├── components/
│   │   ├── hooks/
│   │   ├── api/
│   │   └── types/
│   └── auth/
│       ├── components/
│       ├── hooks/
│       ├── api/
│       └── types/
├── shared/
│   ├── components/
│   ├── hooks/
│   └── utils/
└── app/
    ├── routes/
    └── layout/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prós e contras
&lt;/h3&gt;

&lt;p&gt;Os prós? &lt;strong&gt;Organização&lt;/strong&gt;: Você consegue identificar com facilidade onde trabalhar. &lt;strong&gt;Testabilidade&lt;/strong&gt;: Seus fluxos de testes de e2e, integração e unitários ficam melhor localizados. E &lt;strong&gt;escalabilidade&lt;/strong&gt;: Surgiu um fluxo novo? Para qual feature? Altere o código na pasta da feature que vai receber a implementação. Surgiu uma feature, entidade nova? Literalmente crie uma pasta nova em features... ou não. Acredito que aqui é um bom momento para falar dos contras.&lt;/p&gt;

&lt;p&gt;Dando um contexto para facilitar o entendimento: imagine um cenário em que vamos adicionar os nomes das empresas produtoras na página de detalhes de um filme. Primeiro pensamento: nova entidade &lt;code&gt;companies&lt;/code&gt;, logo vamos criar uma pasta nova de &lt;code&gt;companies&lt;/code&gt; em features. O backend vai ter um endpoint &lt;code&gt;/companies?movie_id=?&lt;/code&gt;, jogamos isso dentro de &lt;code&gt;companies&lt;/code&gt; e &lt;code&gt;movies&lt;/code&gt; vai importar o que for necessário dali. Resolvido, isso está errado? Não, é um excelente caminho e segue os requisitos para ser uma feature nova no projeto. Mas, nesse momento, é somente uma chamada para a API que retorna uma lista simples. Outra possibilidade, que também não estaria incorreta, é um simples &lt;code&gt;getMovieCompanies&lt;/code&gt; dentro de &lt;code&gt;features/movies&lt;/code&gt; — nesse momento é aceitável. Mas, caso &lt;code&gt;companies&lt;/code&gt; ganhe mais fluxos e telas no projeto, aí o próximo passo é mover essa lógica para dentro de &lt;code&gt;features/companies&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;"Como isso se encaixa em um contra?" Aqui entra o ponto de maturidade para tomar esse tipo de decisão de implementação e levar em conta os trade-offs — nesse caso, o trabalho de criar uma nova feature versus a simplicidade do momento, em troca de uma possível refatoração no futuro. Obviamente esse exemplo é bem simples, usado só para ilustrar um cenário que poderia acontecer em um projeto real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Com a IA muito presente no dia a dia de desenvolvimento, acredito que ter essa preocupação com a estrutura do projeto é importante. Sem uma estrutura bem definida, é fácil um agente duplicar lógica sem você perceber e só acabar aceitando o que foi gerado porque, aparentemente, está tudo funcionando como esperado&lt;/p&gt;

&lt;p&gt;É isso, tem mais pontos que podem ser abordados como circular dependency, deep import, arquivos compartilhados mas isso já é um bom introdutório para pensar sobre como organizar seus projetos.&lt;br&gt;
Se quiser se aprofundar mais sobre o assunto deixo aqui um pouco do que foi meu estudo sobre esse tópico contém alguns resumos e lições sobre testes, definição de features, discussões mais técnicas sobre implementação e você pode encontrar alguns exemplos de código sobre &lt;code&gt;Feature-based&lt;/code&gt;: &lt;a href="https://github.com/matheusdsilva01/learning/tree/main/learning-feature-based" rel="noopener noreferrer"&gt;https://github.com/matheusdsilva01/learning/tree/main/learning-feature-based&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que isso tenha lhe incentivado a estruturar melhor seus projetos e tmj&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/alan2207/bulletproof-react/" rel="noopener noreferrer"&gt;https://github.com/alan2207/bulletproof-react/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>frontend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Porque o PostgreSQL é tão queridinho?</title>
      <dc:creator>Matheus Silva</dc:creator>
      <pubDate>Tue, 23 Jun 2026 19:30:46 +0000</pubDate>
      <link>https://dev.to/matheusdsilva01/porque-o-postgresql-e-tao-queridinho-3eh0</link>
      <guid>https://dev.to/matheusdsilva01/porque-o-postgresql-e-tao-queridinho-3eh0</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;PostgreSQL é um dos bancos de dados relacionais mais populares no mundo por alguns motivos e tudo isso começou como um simples projeto de faculdade, hoje sendo a principal ferramenta adotada por grandes projetos e empresas no mundo.&lt;br&gt;
E neste artigo vou dar um pouco de contexto de como ele alcançou esse posto.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Table of contents&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Historinha&lt;/li&gt;
&lt;li&gt;Open source&lt;/li&gt;
&lt;li&gt;Extensões&lt;/li&gt;
&lt;li&gt;Confiabilidade&lt;/li&gt;
&lt;li&gt;Comparativo&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Historinha
&lt;/h2&gt;

&lt;p&gt;Contando um pouco de historia, o PostgreSQL nasceu dentro da universidade de Berkeley nos Estados Unidos ja com o objetivo em extensibilidade e suporte a tipos de dados complexos, como pesquisa científica inicialmente chamado de apenas Postgres. E foi crescendo, mais tarde tendo suporte para SQL sendo nomeado como PostgreSQL e lançado para web ganhando performance e mais manutenção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;O PostgreSQL não tem um único dono, hoje é mantido pela PostgreSQL Global Development Group um agromerado de empresas e desenvolvedores que contribuem para o projeto sem o poder de tomada de decisões de forma unilateral sobre o projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensões
&lt;/h2&gt;

&lt;p&gt;Graças a compatibilidade com extensões é possivel usar o PostgreSQL para vários propósitos algumas extensões famosas são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;PostGis&lt;/em&gt;: A possibilidade de processamento de dados geográficos e espaciais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;pgvector&lt;/em&gt;: Para uso de Inteligência Artificial o pgvector possibilita a busca vetorial em embeddings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Confiabilidade
&lt;/h2&gt;

&lt;p&gt;A partir de 2001 se tornou ACID(Atomicidade, Consistência, Isolamento e Durabilidade) garantindo segurança, robustez e confiabilidade para os usuários. Também possui mecanismo de MVCC(Multi Version Concurrency Control) para não bloquear ações de leitura e escrita otimizando paralelismo e garantindo performance em ambiente com grande tráfego.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparativo
&lt;/h2&gt;

&lt;p&gt;Mesmo levando em consideração outras opções conhecidas do mercado como MySQL, Oracle e até mesmo não relacional como MongoDB, PostgreSQL ainda tem uma grande aceitação para uma aplicação que seja pequena ou grande porte.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critério&lt;/th&gt;
&lt;th&gt;PostgreSQL&lt;/th&gt;
&lt;th&gt;MySQL / MariaDB&lt;/th&gt;
&lt;th&gt;MongoDB&lt;/th&gt;
&lt;th&gt;Oracle DB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paradigma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relacional (Objeto-Relacional)&lt;/td&gt;
&lt;td&gt;Relacional&lt;/td&gt;
&lt;td&gt;Documento (NoSQL)&lt;/td&gt;
&lt;td&gt;Relacional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licença&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open Source (Permissiva)&lt;/td&gt;
&lt;td&gt;Open Source (GPL) / Comercial&lt;/td&gt;
&lt;td&gt;Source-available (SSPL)&lt;/td&gt;
&lt;td&gt;Proprietária (Muito cara)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensibilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excelente (UDFs, Extensions, FDW)&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Excelente, mas proprietária&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Suporte a JSON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excelente (&lt;code&gt;jsonb&lt;/code&gt; indexado)&lt;/td&gt;
&lt;td&gt;Bom&lt;/td&gt;
&lt;td&gt;Nativo&lt;/td&gt;
&lt;td&gt;Bom, mas complexo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Principais Usos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sistemas financeiros, IA, GIS, aplicações robustas de qualquer porte&lt;/td&gt;
&lt;td&gt;Aplicações web tradicionais, WordPress, e-commerces simples&lt;/td&gt;
&lt;td&gt;Protótipos rápidos, catálogos flexíveis, dados semi-estruturados&lt;/td&gt;
&lt;td&gt;Grandes corporações legadas, ERPs de altíssima escala&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Se você precisa de segurança, flexibilidade e robustez, o PostgreSQL faz por merecer esse posto de queridinho.&lt;/p&gt;

</description>
      <category>database</category>
      <category>braziliandevs</category>
      <category>postgressql</category>
      <category>software</category>
    </item>
    <item>
      <title>O básico para gerenciar e se proteger de vulnerabilidades em dependências no seu projeto Node.</title>
      <dc:creator>Matheus Silva</dc:creator>
      <pubDate>Mon, 20 Apr 2026 19:20:05 +0000</pubDate>
      <link>https://dev.to/matheusdsilva01/o-basico-para-gerenciar-e-se-proteger-de-vulnerabilidades-em-dependencias-no-seu-projeto-node-3gnk</link>
      <guid>https://dev.to/matheusdsilva01/o-basico-para-gerenciar-e-se-proteger-de-vulnerabilidades-em-dependencias-no-seu-projeto-node-3gnk</guid>
      <description>&lt;p&gt;Verificar e eliminar vulnerabilidades em dependências pode ser mais simples do que você imagina e lhe garanto que isso pode salvar seu tempo e te livrar de algumas dores de cabeça no futuro.&lt;/p&gt;

&lt;p&gt;Antes de tudo, é importante saber gerenciar as dependências do seu projeto e entender como o seu gerenciador de pacote faz uma parte do trabalho para você, nesse artigo vou abordar os seguintes tópicos:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Table of contents&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SemVer&lt;/li&gt;
&lt;li&gt;Relação entre package.json e package-lock.json&lt;/li&gt;
&lt;li&gt;Lidando com vulnerabilidades&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes de falar sobre as vulnerabilidades em si, acho importante uma explicação básica sobre o que significa a sigla SemVer (Semantic Version) e como funciona a relação do &lt;code&gt;package.json&lt;/code&gt;com o &lt;code&gt;package-lock.json&lt;/code&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  SemVer
&lt;/h2&gt;

&lt;p&gt;SemVer, ou Versionamento Semântico, é uma especificação para ajudar desenvolvedores a entender as mudanças e atualizações durante o versionamento de pacote.&lt;/p&gt;

&lt;p&gt;Uma versão de pacote é definida em 3 números &lt;code&gt;Major.Minor.Patch&lt;/code&gt; (ex: 2.3.14), bom o que significa cada número desse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Major (2): Uma versão com atualizações que não tem compatibilidade com versões major anteriores. Então se você atualizar da 1.0 para 2.0 pode ser que isso cause algum problema quando você executar seu projeto, seja por alguma funcionalidade obsoleta ou alguma mudança na sua utilização, etc.&lt;/li&gt;
&lt;li&gt;Minor (2.3): Uma versão que adiciona recursos que tem compatibilidade com versões minor anteriores, ou seja, atualizações dentro da mesma versão major não devem quebrar seu sistema.&lt;/li&gt;
&lt;li&gt;Patch (2.3.14): Normalmente uma versão para lançar correções de bugs, vulnerabilidades e claro mantendo compatibilidade com versões de patch anteriores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui não tem muito segredo, então quando você ouvir algo do tipo “tal pacote já lançou uma versão de patch(x) pra corrigir aquela vulnerabilidade da V14.3” é uma versão 14.3.x (entenda x como qualquer número).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intervalo de versões (^, ~)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algo fora dessa especificação são os sinais de circunflexo &lt;code&gt;^&lt;/code&gt; e til &lt;code&gt;~&lt;/code&gt; , que você comumente verá em projetos, são usados para definir intervalo de versões e sinalizar para o npm como ele deve lidar com as atualizações da dependência.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;^&lt;/code&gt; circunflexo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Permite atualizações até versões minor mas não major, por exemplo: 2.3 pode atualizar para 2.4 mas por conta própria não vai fazer uma atualização de versão para major 3.x&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~&lt;/code&gt; til&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Permite atualizações apenas de versões patch dentro da minor especificada, por exemplo: 2.3.14 pode atualizar para 2.3.20. E claro não vai atualizar para uma versão 2.4&lt;/p&gt;

&lt;p&gt;Também é possível não especificar um intervalo de versões, dessa forma a instalação é fixada em uma versão e só pode ser alterada manualmente com uso do &lt;code&gt;npm install&lt;/code&gt; por exemplo.&lt;/p&gt;

&lt;p&gt;Definir um intervalo de versões vai trazer mais segurança e praticidade quando precisar dependências mas caso precise de um controle mais rígido pode travar em uma versão sem problemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relação entre package.json e package-lock.json
&lt;/h2&gt;

&lt;p&gt;São arquivos que se completam. &lt;/p&gt;

&lt;p&gt;O &lt;code&gt;package.json&lt;/code&gt; salva as dependências do projeto, é onde você vai ter um overview geral e pode definir o intervalo de versões.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;package-lock.json&lt;/code&gt; é quem vai controlar a árvore de dependências e definir qual a versão exata que vai ser instalada, claro seguindo a referência definida no &lt;code&gt;package.json&lt;/code&gt;, garantindo que todas as instalações tenham as mesmas versões de dependências, por isso é muito importante você manter o &lt;code&gt;package-lock.json&lt;/code&gt; commitado/salvo no seu repositório além de deixar processo de instalação mais rápido vai dar consistência entre diferentes ambientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lidando com vulnerabilidades
&lt;/h2&gt;

&lt;p&gt;O npm nos forcene basicamente duas funcionalidades para identificar e resolver vulnerabilidades em nossas dependências.&lt;/p&gt;

&lt;h3&gt;
  
  
  npm audit e npm audit fix
&lt;/h3&gt;

&lt;p&gt;Para verifica se as versões instaladas das dependências no projeto contém alguma vulnerabilidade conhecida, &lt;code&gt;npm audit&lt;/code&gt; eu diria que é o primeiro passo. Executar esse comando no seu terminar vai gerar algo como:&lt;br&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%2F0lo18ofkd9f4e2y3sbmc.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%2F0lo18ofkd9f4e2y3sbmc.png" alt="npm audit report" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo estou com a versão 16.1.6 do Next, aqui o relatório indica que nesse projeto só tenho vulnerabilidade nessa dependência e essa versão está dentro de um range de 6 vulnerabilidades conhecidas e como pelo menos uma delas tem gravidade de nível &lt;code&gt;high&lt;/code&gt; a gravidade geral é essa, mesmo se algumas delas tiverem nível menor, também retorna links com mais informações sobre elas. &lt;/p&gt;

&lt;p&gt;Para eliminar essas vulnerabilidades, como no meu &lt;code&gt;package.json&lt;/code&gt; defini o pacote do Next como &lt;code&gt;^16.1.6&lt;/code&gt; (olha o ^) e existe uma correção para essas vulnerabilidades dentro desse intervalo de versão definido, isso permite que apenas executando &lt;code&gt;npm audit fix&lt;/code&gt; ele atualize a dependência para uma versão sem vulnerabilidades.&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%2Flzb4y0cmsdjedh2iwbuj.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%2Flzb4y0cmsdjedh2iwbuj.png" alt="npm audit fix report" width="428" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui foi feita uma atualização para &lt;code&gt;16.2.4&lt;/code&gt; mas e se tivesse definido com &lt;code&gt;~&lt;/code&gt; ? Fica aí a lição de casa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Escrevi esse artigo com o propósito de fixação do conteúdo que estudei e deixo aqui alguns tópicos para se aprofundar sobre o assunto.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dependabot&lt;/li&gt;
&lt;li&gt;.npmrc (save-exact, audit-level)&lt;/li&gt;
&lt;li&gt;Snyk&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Referências:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=kK4Meix58R4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=kK4Meix58R4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://semver.org/lang/pt-BR/" rel="noopener noreferrer"&gt;https://semver.org/lang/pt-BR/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.npmjs.com/cli/v11/configuring-npm/package-lock-json" rel="noopener noreferrer"&gt;https://docs.npmjs.com/cli/v11/configuring-npm/package-lock-json&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>npm</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Controlando cache através do navegador</title>
      <dc:creator>Matheus Silva</dc:creator>
      <pubDate>Fri, 12 Dec 2025 21:22:10 +0000</pubDate>
      <link>https://dev.to/matheusdsilva01/controlando-cache-atraves-do-navegador-1h6j</link>
      <guid>https://dev.to/matheusdsilva01/controlando-cache-atraves-do-navegador-1h6j</guid>
      <description>&lt;p&gt;&lt;code&gt;Cache&lt;/code&gt; você já deve ter ouvido esse termo várias vezes e recentemente resolvi aprender como o navegador implementa esse mecanismo e então resolvi escrever esse post sobre o que aprendi.&lt;/p&gt;

&lt;p&gt;Contextualizando, &lt;code&gt;Cache&lt;/code&gt; é um mecanismo utilizado com a finalidade de trazer velocidade ao acesso um conteúdo que é frequentemente utilizado.&lt;/p&gt;

&lt;p&gt;Quando estamos implementando cache em nosso sistema é importante mantê-lo o mais próximo possível do cliente e para isso podemos usar o sistema de cache dos navegadores assim mantendo velocidade no acesso ao conteúdo e salvando recursos de nossos servidores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de cache
&lt;/h2&gt;

&lt;p&gt;Para gerenciar cache no navegador usamos o header &lt;code&gt;Cache-Control&lt;/code&gt; e podemos trabalhar com os seguintes valores para ele:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;default&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por padrão o seguinte fluxo será seguido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se for encontrada em cache uma versão atualizada dos dados essa será retornada.&lt;/li&gt;
&lt;li&gt;Caso seja obsoleta será feita uma espécie de consulta ao servidor e verificar se os dados do cache sofreram alterações, se sofreram alteração os dados atualizados vão ser retornados e atualizados no cache, caso contrário o dado do cache será retornado.&lt;/li&gt;
&lt;li&gt;Se não for encontrado nada em cache será feita a requisição ao servidor e o cache vai ser atualizado com os dados retornados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;no-store&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O navegador vai ignorar o cache, efetuar a requisição para o servidor e não irá armazenar o retorno no cache.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;reload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O navegador vai ignorar o cache, efetuar a requisição para o servidor e vai atualizar o cache com o retorno da requisição.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;no-cache&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O navegador verifica no cache se existe alguma versão atualizada dos dados ou obsoleta depois disso é verificado com o servidor se há uma nova versão dos dados, se houver será retornado a nova versão pelo servidor e o cache será atualizado, se não a versão do cache vai ser retornada.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;force-cache&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O navegador verifica o cache, se encontrar uma versão atualizada ou obsoleta dos dados ela vai ser retornada se não encontrar nada no cache ele vai fazer a requisição normalmente no servidor retornando os dados e salvando no cache.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;max-age=&amp;lt;valor em segundos&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pode ser usado em conjunto com os valores acima e define por quanto tempo aquele dado é definido como “atualizado”.&lt;/p&gt;

&lt;p&gt;Também e possível gerenciar o cache usando o header &lt;code&gt;Expires&lt;/code&gt; que pode ser definido com um tempo específico, exemplo: &lt;code&gt;Expires: Thu, 25 Dec 2025 18:18:18 GMT&lt;/code&gt; ou seja a partir do tempo especificado aquele dado passa a ser obsoleto.&lt;/p&gt;

&lt;p&gt;Esse foi o conteúdo que estudei espero que tenha agregado de alguma forma. 😊 &lt;/p&gt;

&lt;p&gt;Referências: &lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Guides/Caching" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Guides/Caching&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Request/cache" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Request/cache&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>browser</category>
      <category>programming</category>
      <category>web</category>
    </item>
  </channel>
</rss>
