<?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: Camila Rody</title>
    <description>The latest articles on DEV Community by Camila Rody (@camilasrody).</description>
    <link>https://dev.to/camilasrody</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%2F3965248%2F7a9f7686-40a5-488b-867c-dbfe3571572c.png</url>
      <title>DEV Community: Camila Rody</title>
      <link>https://dev.to/camilasrody</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/camilasrody"/>
    <language>en</language>
    <item>
      <title>“The “Ideal Professional”: A Reflection on the Job Market”</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:15:49 +0000</pubDate>
      <link>https://dev.to/camilasrody/the-ideal-professional-a-reflection-on-the-job-market-4k44</link>
      <guid>https://dev.to/camilasrody/the-ideal-professional-a-reflection-on-the-job-market-4k44</guid>
      <description>&lt;p&gt;In recent years, I’ve noticed a growing pattern across professional networks and the tech industry: the construction of an “ideal professional profile”.&lt;/p&gt;

&lt;p&gt;A junior developer who is expected to behave like a mid-level engineer.&lt;br&gt;
A mid-level engineer who is expected to perform like a senior.&lt;br&gt;
A senior engineer who, beyond technical depth, is expected to operate almost like a personal brand.&lt;/p&gt;

&lt;p&gt;Alongside this comes an even heavier layer of expectations: hundreds of courses, certifications, side projects, open-source contributions, community involvement, frequent posts, public presence, flawless English, and often a constant performance of technical authority.&lt;/p&gt;

&lt;p&gt;The impression is that being “good enough” is no longer about doing your job well — it is about consistently appearing exceptional.&lt;/p&gt;

&lt;p&gt;At the same time, there is a clear disconnect between these expectations and the reality inside companies.&lt;/p&gt;

&lt;p&gt;Many organizations do not invest in professionals at the same level they expect from them. Most of the working time is spent delivering tasks, meeting deadlines, and dealing with production pressure. The limited remaining time is not always available for study or structured learning — because life outside work also exists, including rest and mental balance.&lt;/p&gt;

&lt;p&gt;Yet, continuous evolution is still expected, almost as if it should happen automatically.&lt;/p&gt;

&lt;p&gt;This raises an important question: how realistic and healthy are these expectations?&lt;/p&gt;

&lt;p&gt;This is not an argument against continuous learning — it is necessary. Nor is it a suggestion that professionals should stop growing — they absolutely should. But there is a difference between sustainable growth and a constant demand for perfection.&lt;/p&gt;

&lt;p&gt;Another relevant point is how career levels — junior, mid, and senior — have become increasingly subjective. What one company defines as senior may be considered mid-level in another context, and vice versa.&lt;/p&gt;

&lt;p&gt;Still, job descriptions often converge into an idealized profile: full-stack mastery, advanced English, refined soft skills, product thinking, extensive experience, and sometimes even public visibility.&lt;/p&gt;

&lt;p&gt;The result is a market that rewards an almost unreachable ideal, while not always accurately measuring real depth of competence.&lt;/p&gt;

&lt;p&gt;I’ve seen professionals with hundreds of courses who still struggle with execution. And I’ve also seen individuals with much simpler backgrounds delivering outstanding work. This shows that formal learning and practical proficiency do not always scale together.&lt;/p&gt;

&lt;p&gt;Perhaps the key issue is not lowering standards, but rethinking how we evaluate competence.&lt;/p&gt;

&lt;p&gt;Companies should absolutely assess candidates carefully. But they should also recognize that real development does not happen only before hiring — it happens inside the company as well, with time, resources, and proper support.&lt;/p&gt;

&lt;p&gt;In the end, what we seem to have is a still unresolved balance: professionals trying to meet an ever-expanding ideal, and companies expecting that ideal to already be fully formed without necessarily investing in its construction.&lt;/p&gt;

&lt;p&gt;Maybe the healthier path lies somewhere in between — where expectations and investment grow together, and where competence is measured not only by resumes or public presence, but by consistent, real-world delivery.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>"Profissional ideal": Uma reflexão sobre o mercado</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:14:34 +0000</pubDate>
      <link>https://dev.to/camilasrody/profissional-ideal-uma-reflexao-sobre-o-mercado-8ha</link>
      <guid>https://dev.to/camilasrody/profissional-ideal-uma-reflexao-sobre-o-mercado-8ha</guid>
      <description>&lt;p&gt;Nos últimos anos, tenho percebido um padrão cada vez mais forte nas redes profissionais e no mercado de tecnologia: a construção de uma espécie de “ideal de profissional”.&lt;/p&gt;

&lt;p&gt;Um júnior que deveria ter postura de pleno.&lt;br&gt;
Um pleno que já deveria agir como sênior.&lt;br&gt;
Um sênior que, além de tudo, precisa ser quase uma marca pessoal.&lt;/p&gt;

&lt;p&gt;E junto disso vem uma camada ainda maior de exigências implícitas: centenas de cursos, certificações, projetos paralelos, contribuições open source, participação em comunidades, posts frequentes, presença pública, inglês impecável e, muitas vezes, até uma performance constante de autoridade técnica.&lt;/p&gt;

&lt;p&gt;A impressão que fica é que, para ser considerado “bom o suficiente”, não basta apenas ser um bom profissional no dia a dia. É preciso também parecer excelente o tempo todo.&lt;/p&gt;

&lt;p&gt;Ao mesmo tempo, existe uma desconexão importante entre essa expectativa e a realidade das empresas.&lt;/p&gt;

&lt;p&gt;Muitas organizações não oferecem o mesmo nível de investimento que exigem. O profissional passa a maior parte do seu tempo executando demandas, entregando prazos, lidando com pressão de produção. O pouco tempo livre que sobra não é, necessariamente, dedicado a estudo — porque existe também a vida fora do trabalho, o descanso, o equilíbrio mental.&lt;/p&gt;

&lt;p&gt;E mesmo assim, espera-se que essa evolução aconteça de forma contínua, quase automática.&lt;/p&gt;

&lt;p&gt;Isso levanta uma questão importante: até que ponto essa expectativa é saudável e realista?&lt;/p&gt;

&lt;p&gt;Não estou dizendo que aprendizado constante não é necessário — ele é. Nem que o profissional não deve buscar evolução — ele deve. Mas existe uma diferença entre crescimento sustentável e uma cobrança contínua por perfeição.&lt;/p&gt;

&lt;p&gt;Outro ponto que me chama atenção é como os níveis de carreira — júnior, pleno, sênior — se tornaram conceitos extremamente subjetivos. O que é sênior para uma empresa pode não ser para outra. O que é pleno em um contexto pode ser considerado júnior em outro.&lt;/p&gt;

&lt;p&gt;E, ainda assim, muitas vagas tentam condensar tudo isso em uma descrição idealizada de um profissional que domina praticamente tudo: stack completa, inglês avançado, soft skills refinadas, visão de produto, experiência prática, maturidade comportamental e, em alguns casos, até presença pública.&lt;/p&gt;

&lt;p&gt;O resultado disso é um mercado que valoriza um ideal difícil de alcançar — e, ao mesmo tempo, nem sempre mede de forma justa a profundidade real da competência.&lt;/p&gt;

&lt;p&gt;Já vi profissionais com dezenas de cursos que não conseguem executar bem o básico. E também já vi pessoas com trajetórias mais simples entregando com uma excelência impressionante. Isso mostra que conhecimento formal e proficiência prática nem sempre caminham na mesma proporção.&lt;/p&gt;

&lt;p&gt;Talvez o ponto mais importante aqui não seja reduzir exigências ou diminuir o nível do mercado, mas sim repensar como avaliamos competência.&lt;/p&gt;

&lt;p&gt;Empresas precisam, sim, avaliar candidatos com critério. Mas também precisam reconhecer que desenvolvimento real não acontece apenas antes da contratação — ele acontece dentro dela. Com tempo, recursos, incentivo e ambiente adequado.&lt;/p&gt;

&lt;p&gt;No fim, parece que existe um equilíbrio ainda difícil de alcançar: profissionais tentando atender um ideal cada vez mais amplo, e empresas esperando esse ideal já pronto, sem necessariamente investir na construção dele.&lt;/p&gt;

&lt;p&gt;E talvez o caminho mais saudável esteja justamente no meio disso — onde expectativa e investimento caminham juntos, e onde competência não é medida apenas pelo que está no currículo ou no perfil público, mas pelo que é entregue com consistência na prática.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>fullstack</category>
      <category>discuss</category>
    </item>
    <item>
      <title>When Software Engineering Meets Real Impact: A UNICEF Collaboration</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:00:29 +0000</pubDate>
      <link>https://dev.to/camilasrody/when-software-engineering-meets-real-impact-a-unicef-collaboration-30jk</link>
      <guid>https://dev.to/camilasrody/when-software-engineering-meets-real-impact-a-unicef-collaboration-30jk</guid>
      <description>&lt;p&gt;There are technology projects that go beyond code. Some demand technical maturity, others demand product vision, and a few require both at the same time—especially when they have a direct impact on real people’s lives.&lt;/p&gt;

&lt;p&gt;This was the case of my participation in the development of a child development monitoring platform, built in partnership with UNICEF and applied in a real-world context in the city of Tarumã, São Paulo. The project had direct mentorship from UNICEF professionals, including Justin and other engineers, as well as the Porta Telemedicina team, responsible for integration within the healthcare context.&lt;/p&gt;

&lt;p&gt;More than a technical delivery, it was a project guided by product design, impact validation, and architectural decisions made under real constraints of usage, scale, and social responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Context: Technology with Real Impact
&lt;/h2&gt;

&lt;p&gt;The goal of the platform was to support child development monitoring through a structured, organized, and accessible interface for healthcare and social assistance professionals.&lt;/p&gt;

&lt;p&gt;The focus was not simply to “build a system,” but to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the system would be used in the field&lt;/li&gt;
&lt;li&gt;Which information truly matters for child development monitoring&lt;/li&gt;
&lt;li&gt;How to structure data clearly for decision-making&lt;/li&gt;
&lt;li&gt;How to transform clinical and social data into useful visualizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Throughout the process, there was strong guidance from UNICEF on design thinking and product discovery, where every feature was validated before being implemented.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Importance of Design and Discovery
&lt;/h2&gt;

&lt;p&gt;Before writing any code, the project went through an intense product definition phase.&lt;/p&gt;

&lt;p&gt;During this stage, discussions included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What should actually exist in the platform&lt;/li&gt;
&lt;li&gt;What should be excluded to avoid cognitive overload&lt;/li&gt;
&lt;li&gt;How professionals would use the tool in their daily routines&lt;/li&gt;
&lt;li&gt;How to make the workflow intuitive, even in low-tech environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This phase was essential in guiding all subsequent technical decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Role: Frontend, Architecture, and Technical Decisions
&lt;/h2&gt;

&lt;p&gt;My role in the project was entirely focused on the frontend, with direct responsibility for architecture, code structure, and critical technical decisions within the application.&lt;/p&gt;

&lt;p&gt;The tech stack included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Google Maps API (with multiple modifiers and customization layers)&lt;/li&gt;
&lt;li&gt;Figma-based design system&lt;/li&gt;
&lt;li&gt;Modular architecture&lt;/li&gt;
&lt;li&gt;Atomic Design&lt;/li&gt;
&lt;li&gt;Clean Code applied at real product scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the beginning, the decision was not to treat the frontend as a simple “UI layer,” but as an independent, scalable, and sustainable architectural system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend Architecture: Modularity and Scalability
&lt;/h2&gt;

&lt;p&gt;One of the main challenges of the project was ensuring the application could grow without becoming a difficult-to-maintain monolith.&lt;/p&gt;

&lt;p&gt;For this reason, the architecture was structured around:&lt;/p&gt;

&lt;h3&gt;
  
  
  Atomic Design
&lt;/h3&gt;

&lt;p&gt;The interface was divided into clear levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atoms (buttons, inputs, labels)&lt;/li&gt;
&lt;li&gt;Molecules (simple composed components)&lt;/li&gt;
&lt;li&gt;Organisms (complete functional blocks)&lt;/li&gt;
&lt;li&gt;Templates (page structure)&lt;/li&gt;
&lt;li&gt;Pages (final implementation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach enabled visual consistency and reuse across the entire application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain-based modularization
&lt;/h3&gt;

&lt;p&gt;Instead of organizing code only by file type, the structure was designed around functional domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Child development&lt;/li&gt;
&lt;li&gt;Patient registration&lt;/li&gt;
&lt;li&gt;Vaccination tracking&lt;/li&gt;
&lt;li&gt;Geographic mapping&lt;/li&gt;
&lt;li&gt;Reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reduced coupling and made maintenance easier across different teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue 3 as a Foundation for Reactivity and Structure
&lt;/h2&gt;

&lt;p&gt;Vue 3 was fundamental in supporting the application’s complexity.&lt;/p&gt;

&lt;p&gt;We used concepts such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composition API for reusable logic&lt;/li&gt;
&lt;li&gt;Composables to encapsulate frontend business rules&lt;/li&gt;
&lt;li&gt;Domain-based state management&lt;/li&gt;
&lt;li&gt;Clear separation between logic and presentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This helped avoid the tight coupling commonly found in older Vue applications based on the Options API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Maps Integration: Data and Interaction Layers
&lt;/h2&gt;

&lt;p&gt;One of the most technical parts of the project was the integration with the Google Maps API.&lt;/p&gt;

&lt;p&gt;The application did not use the map only for visualization, but as an interactive data layer.&lt;/p&gt;

&lt;p&gt;We implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic markers based on child development data&lt;/li&gt;
&lt;li&gt;Geographic filters by region&lt;/li&gt;
&lt;li&gt;Layers of information about child indicators&lt;/li&gt;
&lt;li&gt;Contextual interactions based on location&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge here was handling multiple API modifiers while maintaining performance in scenarios with large datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Figma-based Design System
&lt;/h2&gt;

&lt;p&gt;Another key component was the implementation of a design system fully aligned with Figma.&lt;/p&gt;

&lt;p&gt;The goal was not just to “follow the design,” but to turn it into a system.&lt;/p&gt;

&lt;p&gt;This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design tokens (colors, spacing, typography)&lt;/li&gt;
&lt;li&gt;Strict componentization aligned with the prototype&lt;/li&gt;
&lt;li&gt;Cross-screen consistency&lt;/li&gt;
&lt;li&gt;Accessibility and readability considerations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The design system was essential to maintaining consistency across a platform with multiple complex flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vaccination Record as a Table-Based Interface
&lt;/h2&gt;

&lt;p&gt;One of the most interesting challenges was building a digital vaccination record.&lt;/p&gt;

&lt;p&gt;It needed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be clear for healthcare professionals&lt;/li&gt;
&lt;li&gt;Strictly follow the Figma design&lt;/li&gt;
&lt;li&gt;Function as a dynamic table&lt;/li&gt;
&lt;li&gt;Allow fast reading of history and status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation required careful attention to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsive table structures&lt;/li&gt;
&lt;li&gt;List rendering performance&lt;/li&gt;
&lt;li&gt;Visual organization of dense data&lt;/li&gt;
&lt;li&gt;UX for fast field usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was one of the points where balancing technical decisions with real usability mattered the most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker and Development Environment
&lt;/h2&gt;

&lt;p&gt;To ensure environment consistency, the entire application was containerized using Docker.&lt;/p&gt;

&lt;p&gt;This enabled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standardized environments across the team&lt;/li&gt;
&lt;li&gt;Easier onboarding&lt;/li&gt;
&lt;li&gt;Reduced “it works on my machine” issues&lt;/li&gt;
&lt;li&gt;Integration with development pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though this was a frontend-heavy project, this decision was important for maintaining predictable development workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Responsibility and Individual Decision-Making
&lt;/h2&gt;

&lt;p&gt;One of the most remarkable aspects of this project was the level of individual technical responsibility entrusted to me.&lt;/p&gt;

&lt;p&gt;A significant portion of frontend architectural decisions were made by me, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Folder structure&lt;/li&gt;
&lt;li&gt;Componentization strategy&lt;/li&gt;
&lt;li&gt;Domain organization&lt;/li&gt;
&lt;li&gt;Code standards&lt;/li&gt;
&lt;li&gt;External API integration&lt;/li&gt;
&lt;li&gt;Scalability patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This required not only technical knowledge, but also maturity to understand the impact of each decision on the final product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Impact of the Project
&lt;/h2&gt;

&lt;p&gt;More than a functional system, this project had real social impact in a sensitive context: child development monitoring.&lt;/p&gt;

&lt;p&gt;This completely changes the perspective on software engineering.&lt;/p&gt;

&lt;p&gt;Every UI component, every UX decision, every data structure was not just code—it was a tool influencing decisions made by healthcare professionals in the field.&lt;/p&gt;

&lt;p&gt;This is the kind of experience that reshapes the role of a software engineer.&lt;/p&gt;

&lt;p&gt;We are not just building systems.&lt;/p&gt;

&lt;p&gt;We are building infrastructure that influences real human decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This project taught me something that goes far beyond technology.&lt;/p&gt;

&lt;p&gt;I learned that software architecture is not only about scalability or patterns, but about responsibility.&lt;/p&gt;

&lt;p&gt;When your code reaches real environments, with direct impact on people, every technical decision carries a different weight.&lt;/p&gt;

&lt;p&gt;Being part of this initiative with UNICEF was one of the most important experiences of my professional journey so far—not only because of the technical complexity, but because of the meaning behind what was built.&lt;/p&gt;

&lt;p&gt;And above all, it reinforced that software engineering can truly make a difference in people’s lives.&lt;/p&gt;

&lt;p&gt;related posts: &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7195849763097837569/" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7195849763097837569/&lt;/a&gt; &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7467679303888134144/" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7467679303888134144/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>unicef</category>
    </item>
    <item>
      <title>Desenvolvendo uma Plataforma em Parceria com a UNICEF: Uma Experiência de Engenharia, Impacto Social e Decisões de Arquitetura em Produção Real</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 20:57:10 +0000</pubDate>
      <link>https://dev.to/camilasrody/desenvolvendo-uma-plataforma-em-parceria-com-a-unicef-uma-experiencia-de-engenharia-impacto-2266</link>
      <guid>https://dev.to/camilasrody/desenvolvendo-uma-plataforma-em-parceria-com-a-unicef-uma-experiencia-de-engenharia-impacto-2266</guid>
      <description>&lt;p&gt;Existem projetos em tecnologia que vão além do código. Alguns exigem maturidade técnica, outros exigem visão de produto, e poucos exigem os dois ao mesmo tempo com um impacto direto na vida de pessoas reais.&lt;/p&gt;

&lt;p&gt;Este foi o caso da minha participação no desenvolvimento de uma plataforma de monitoramento do desenvolvimento infantil, construída em parceria com a UNICEF e aplicada em território real, na cidade de Tarumã (São Paulo). O projeto contou com mentoria direta de profissionais da UNICEF, incluindo o Justin e outros engenheiros, além da equipe da Porta Telemedicina, responsável pela integração com o contexto de saúde.&lt;/p&gt;

&lt;p&gt;Mais do que uma entrega técnica, foi um projeto guiado por design de produto, validação de impacto e decisões arquiteturais feitas sob restrições reais de uso, escala e responsabilidade social.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto do Projeto: Tecnologia com Impacto Real
&lt;/h2&gt;

&lt;p&gt;O objetivo da plataforma era apoiar o acompanhamento do desenvolvimento infantil através de uma interface estruturada, organizada e acessível para profissionais da saúde e assistência social.&lt;/p&gt;

&lt;p&gt;O foco não era apenas “construir um sistema”, mas entender:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como esse sistema seria usado em campo&lt;/li&gt;
&lt;li&gt;Quais informações realmente importam para o acompanhamento infantil&lt;/li&gt;
&lt;li&gt;Como estruturar dados de forma clara para tomada de decisão&lt;/li&gt;
&lt;li&gt;Como transformar dados clínicos e sociais em visualizações úteis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Durante todo o processo, houve uma forte orientação de design thinking e product discovery junto à UNICEF, onde cada funcionalidade era validada antes de ser implementada.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Importância do Processo de Design e Descoberta
&lt;/h2&gt;

&lt;p&gt;Antes de escrever qualquer linha de código, o projeto passou por uma etapa intensa de definição de produto.&lt;/p&gt;

&lt;p&gt;Nessa fase, foram discutidos pontos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que realmente deveria existir na plataforma&lt;/li&gt;
&lt;li&gt;O que não deveria existir para evitar sobrecarga cognitiva&lt;/li&gt;
&lt;li&gt;Como profissionais utilizariam a ferramenta no dia a dia&lt;/li&gt;
&lt;li&gt;Como tornar o fluxo intuitivo mesmo em ambientes com baixa familiaridade tecnológica&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa etapa foi essencial para guiar todas as decisões técnicas posteriores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minha Atuação: Frontend, Arquitetura e Decisões Técnicas
&lt;/h2&gt;

&lt;p&gt;Minha atuação no projeto foi integralmente no frontend, com responsabilidade direta sobre arquitetura, estruturação do código e decisões técnicas críticas da aplicação.&lt;/p&gt;

&lt;p&gt;A stack utilizada envolveu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Google Maps API (com múltiplos modificadores e camadas de personalização)&lt;/li&gt;
&lt;li&gt;Design System baseado no Figma&lt;/li&gt;
&lt;li&gt;Arquitetura modular&lt;/li&gt;
&lt;li&gt;Atomic Design&lt;/li&gt;
&lt;li&gt;Clean Code aplicado em escala de produto real&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desde o início, a decisão foi não tratar o frontend como “camada de interface”, mas como um sistema arquitetural independente, escalável e sustentável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitetura Frontend: Modularidade e Escalabilidade
&lt;/h2&gt;

&lt;p&gt;Um dos principais desafios do projeto era garantir que a aplicação pudesse crescer sem se tornar um monólito difícil de manter.&lt;/p&gt;

&lt;p&gt;Por isso, a arquitetura foi estruturada com base em:&lt;/p&gt;

&lt;h3&gt;
  
  
  Atomic Design
&lt;/h3&gt;

&lt;p&gt;A interface foi dividida em níveis bem definidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Átomos (botões, inputs, labels)&lt;/li&gt;
&lt;li&gt;Moléculas (componentes compostos simples)&lt;/li&gt;
&lt;li&gt;Organismos (blocos funcionais completos)&lt;/li&gt;
&lt;li&gt;Templates (estrutura de páginas)&lt;/li&gt;
&lt;li&gt;Pages (implementação final)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa abordagem permitiu consistência visual e reuso em toda a aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modularização por domínio
&lt;/h3&gt;

&lt;p&gt;Ao invés de organizar o código apenas por tipo de arquivo, a estrutura foi pensada por domínio funcional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desenvolvimento infantil&lt;/li&gt;
&lt;li&gt;Cadastro de pacientes&lt;/li&gt;
&lt;li&gt;Cartela de vacinação&lt;/li&gt;
&lt;li&gt;Mapeamento geográfico&lt;/li&gt;
&lt;li&gt;Relatórios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso reduziu acoplamento e facilitou manutenção por diferentes times.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue 3 como Base de Reatividade e Organização
&lt;/h2&gt;

&lt;p&gt;O Vue 3 foi fundamental para suportar a complexidade da aplicação.&lt;/p&gt;

&lt;p&gt;Foram utilizados conceitos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composition API para lógica reutilizável&lt;/li&gt;
&lt;li&gt;Composables para encapsular regras de negócio no frontend&lt;/li&gt;
&lt;li&gt;State management estruturado por domínio&lt;/li&gt;
&lt;li&gt;Separação clara entre lógica e apresentação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa escolha ajudou a evitar o acoplamento comum em projetos Vue mais antigos baseados em Options API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integração com Google Maps: Camadas de Dados e Interação
&lt;/h2&gt;

&lt;p&gt;Um dos pontos mais técnicos do projeto foi a integração com a Google Maps API.&lt;/p&gt;

&lt;p&gt;A aplicação não utilizava o mapa apenas como visualização, mas como camada de dados interativa.&lt;/p&gt;

&lt;p&gt;Foram implementados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marcadores dinâmicos baseados em dados de desenvolvimento&lt;/li&gt;
&lt;li&gt;Filtros geográficos por região&lt;/li&gt;
&lt;li&gt;Camadas de informação sobre indicadores infantis&lt;/li&gt;
&lt;li&gt;Interações contextuais baseadas em localização&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O desafio aqui foi lidar com múltiplos modificadores da API e garantir performance em cenários com muitos dados simultâneos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design System Baseado em Figma
&lt;/h2&gt;

&lt;p&gt;Outro ponto fundamental foi a implementação de um design system fiel ao Figma.&lt;/p&gt;

&lt;p&gt;A proposta não era apenas “seguir o layout”, mas transformar o design em sistema.&lt;/p&gt;

&lt;p&gt;Isso envolveu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tokens de design (cores, espaçamentos, tipografia)&lt;/li&gt;
&lt;li&gt;Componentização fiel ao protótipo&lt;/li&gt;
&lt;li&gt;Consistência entre telas&lt;/li&gt;
&lt;li&gt;Garantia de acessibilidade e legibilidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O design system foi essencial para manter consistência em uma plataforma com múltiplos fluxos complexos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cartilha de Vacinação em Formato de Tabela
&lt;/h2&gt;

&lt;p&gt;Um dos desafios mais interessantes do projeto foi a criação de uma cartilha de vacinação digital.&lt;/p&gt;

&lt;p&gt;Ela precisava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ser clara para profissionais de saúde&lt;/li&gt;
&lt;li&gt;Seguir fielmente o design do Figma&lt;/li&gt;
&lt;li&gt;Funcionar como tabela dinâmica&lt;/li&gt;
&lt;li&gt;Permitir leitura rápida de histórico e status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A implementação exigiu cuidado com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estrutura de tabelas responsivas&lt;/li&gt;
&lt;li&gt;Performance em renderização de listas&lt;/li&gt;
&lt;li&gt;Organização visual de dados densos&lt;/li&gt;
&lt;li&gt;UX para leitura rápida em campo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse foi um dos pontos onde mais precisei equilibrar técnica com usabilidade real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker e Ambiente de Desenvolvimento
&lt;/h2&gt;

&lt;p&gt;Para garantir consistência entre ambientes, toda a aplicação foi containerizada com Docker.&lt;/p&gt;

&lt;p&gt;Isso permitiu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Padronização de ambientes entre equipe&lt;/li&gt;
&lt;li&gt;Facilidade de onboarding&lt;/li&gt;
&lt;li&gt;Redução de problemas de “funciona na minha máquina”&lt;/li&gt;
&lt;li&gt;Integração com pipelines de desenvolvimento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mesmo sendo frontend, essa decisão foi importante para garantir previsibilidade no fluxo de desenvolvimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Responsabilidade Técnica e Decisões Individuais
&lt;/h2&gt;

&lt;p&gt;Um dos aspectos mais marcantes desse projeto foi o nível de responsabilidade técnica individual que me foi confiado.&lt;/p&gt;

&lt;p&gt;Grande parte das decisões de arquitetura do frontend foram tomadas por mim, incluindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estrutura de pastas&lt;/li&gt;
&lt;li&gt;Estratégia de componentização&lt;/li&gt;
&lt;li&gt;Organização de domínios&lt;/li&gt;
&lt;li&gt;Padronização de código&lt;/li&gt;
&lt;li&gt;Integração com APIs externas&lt;/li&gt;
&lt;li&gt;Definição de padrões de escalabilidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso exigiu não apenas conhecimento técnico, mas maturidade para entender impacto de cada decisão no produto final.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Impacto do Projeto
&lt;/h2&gt;

&lt;p&gt;Mais do que um sistema funcional, este projeto teve impacto real em um contexto social sensível: o acompanhamento do desenvolvimento infantil.&lt;/p&gt;

&lt;p&gt;Isso muda completamente a perspectiva sobre engenharia de software.&lt;/p&gt;

&lt;p&gt;Cada componente de interface, cada decisão de UX, cada estrutura de dados não era apenas código — era uma ferramenta que influenciava decisões tomadas por profissionais de saúde em campo.&lt;/p&gt;

&lt;p&gt;Esse é o tipo de experiência que redefine o papel do engenheiro de software.&lt;/p&gt;

&lt;p&gt;Não estamos apenas construindo sistemas.&lt;/p&gt;

&lt;p&gt;Estamos construindo infraestrutura que influencia decisões humanas reais.&lt;/p&gt;

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

&lt;p&gt;Este projeto me ensinou algo que vai muito além de tecnologia.&lt;/p&gt;

&lt;p&gt;Aprendi que arquitetura de software não é apenas sobre escalabilidade ou padrões, mas sobre responsabilidade.&lt;/p&gt;

&lt;p&gt;Quando seu código chega em ambientes reais, com impacto direto em pessoas, cada decisão técnica ganha um peso diferente.&lt;/p&gt;

&lt;p&gt;Participar dessa iniciativa com a UNICEF foi uma das experiências mais importantes da minha trajetória profissional até aqui — não apenas pela complexidade técnica, mas pelo significado do que foi construído.&lt;/p&gt;

&lt;p&gt;E, acima de tudo, por entender que engenharia de software pode literalmente fazer diferença na vida das pessoas.&lt;br&gt;
posts relacionados: &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7195849763097837569/" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7195849763097837569/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7467679303888134144/" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7467679303888134144/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>unicef</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Como desenvolvi meu TCC: um vaso inteligente para monitoramento e irrigação automática de plantas</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 20:46:55 +0000</pubDate>
      <link>https://dev.to/camilasrody/como-desenvolvi-meu-tcc-de-sistemas-de-informacao-um-vaso-inteligente-para-monitoramento-e-53i</link>
      <guid>https://dev.to/camilasrody/como-desenvolvi-meu-tcc-de-sistemas-de-informacao-um-vaso-inteligente-para-monitoramento-e-53i</guid>
      <description>&lt;p&gt;Como Desenvolvi Meu TCC de Sistemas de Informação: Um Vaso Inteligente para Monitoramento e Irrigação Automática de Plantas&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%2Fbf7pdo32svgk4dlhp6nw.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%2Fbf7pdo32svgk4dlhp6nw.png" alt=" " width="457" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Durante minha graduação em Sistemas de Informação, tive a oportunidade de desenvolver um projeto que uniu algumas das áreas que mais gosto dentro da tecnologia: desenvolvimento web, arquitetura de software, Internet das Coisas (IoT), automação e experiência do usuário.&lt;/p&gt;

&lt;p&gt;O resultado foi o &lt;strong&gt;E-CO Vaso Inteligente&lt;/strong&gt;, uma solução capaz de monitorar a umidade do solo, controlar automaticamente a irrigação de plantas, registrar históricos, capturar imagens e disponibilizar todas essas informações através de uma aplicação web acessível pelo usuário. O projeto foi desenvolvido como Trabalho de Conclusão de Curso e envolveu desde a modelagem dos dados até a construção do hardware. &lt;/p&gt;

&lt;p&gt;Neste artigo quero compartilhar não apenas os resultados, mas também o passo a passo utilizado para desenvolver a solução e os principais aprendizados adquiridos durante a construção.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/document/d/1lu6QJOUfjkW7H4vYd9bw7RpI84cVGMF6/edit?usp=drive_link&amp;amp;ouid=114766962307329124788&amp;amp;rtpof=true&amp;amp;sd=true" rel="noopener noreferrer"&gt;https://docs.google.com/document/d/1lu6QJOUfjkW7H4vYd9bw7RpI84cVGMF6/edit?usp=drive_link&amp;amp;ouid=114766962307329124788&amp;amp;rtpof=true&amp;amp;sd=true&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  O Problema
&lt;/h2&gt;

&lt;p&gt;Muitas pessoas possuem plantas em casa, mas nem sempre conseguem manter uma rotina adequada de irrigação.&lt;/p&gt;

&lt;p&gt;O excesso de água pode ser tão prejudicial quanto a falta dela.&lt;/p&gt;

&lt;p&gt;Além disso, viagens, rotina de trabalho e falta de conhecimento sobre cuidados específicos acabam impactando diretamente a saúde das plantas.&lt;/p&gt;

&lt;p&gt;A proposta do projeto era criar um sistema capaz de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitorar a umidade do solo&lt;/li&gt;
&lt;li&gt;Automatizar a irrigação&lt;/li&gt;
&lt;li&gt;Registrar histórico de atividades&lt;/li&gt;
&lt;li&gt;Permitir controle remoto&lt;/li&gt;
&lt;li&gt;Capturar imagens da planta&lt;/li&gt;
&lt;li&gt;Notificar o usuário sobre eventos importantes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Arquitetura Geral da Solução
&lt;/h2&gt;

&lt;p&gt;O sistema foi dividido em quatro grandes camadas:&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware
&lt;/h3&gt;

&lt;p&gt;Responsável pela coleta de informações e acionamento dos componentes físicos.&lt;/p&gt;

&lt;p&gt;Principais componentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NodeMCU ESP8266&lt;/li&gt;
&lt;li&gt;Sensor de umidade&lt;/li&gt;
&lt;li&gt;Bomba d'água&lt;/li&gt;
&lt;li&gt;Válvula solenóide&lt;/li&gt;
&lt;li&gt;Raspberry Pi para captura de imagens&lt;/li&gt;
&lt;li&gt;Fonte de alimentação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O NodeMCU realiza a leitura constante dos sensores e envia os dados para o backend.&lt;/p&gt;




&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;O backend foi desenvolvido utilizando Laravel.&lt;/p&gt;

&lt;p&gt;Sua responsabilidade era:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receber dados dos sensores&lt;/li&gt;
&lt;li&gt;Processar regras de negócio&lt;/li&gt;
&lt;li&gt;Armazenar informações&lt;/li&gt;
&lt;li&gt;Gerenciar irrigação&lt;/li&gt;
&lt;li&gt;Expor APIs para o frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma das partes mais interessantes da arquitetura foi a criação de um processo responsável por verificar periodicamente a umidade e tomar decisões automáticas sobre a irrigação das plantas. &lt;/p&gt;




&lt;h3&gt;
  
  
  Banco de Dados
&lt;/h3&gt;

&lt;p&gt;Foi utilizado MariaDB, embora qualquer banco relacional compatível com SQL pudesse atender aos requisitos do projeto.&lt;/p&gt;

&lt;p&gt;A escolha foi motivada pela aderência aos princípios ACID, garantindo consistência dos dados mesmo diante de múltiplas operações simultâneas. &lt;/p&gt;

&lt;p&gt;As principais entidades modeladas foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usuário&lt;/li&gt;
&lt;li&gt;Planta&lt;/li&gt;
&lt;li&gt;Indicadores&lt;/li&gt;
&lt;li&gt;Logs&lt;/li&gt;
&lt;li&gt;Imagens&lt;/li&gt;
&lt;li&gt;Irrigação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Toda a modelagem foi documentada através de UML e diagramas entidade-relacionamento. &lt;/p&gt;




&lt;h2&gt;
  
  
  Construindo o Frontend
&lt;/h2&gt;

&lt;p&gt;O frontend foi desenvolvido com Vue.js.&lt;/p&gt;

&lt;p&gt;A ideia era criar uma aplicação desacoplada do backend para facilitar manutenção e evolução futura. &lt;/p&gt;

&lt;p&gt;A stack utilizada foi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue.js&lt;/li&gt;
&lt;li&gt;TailwindCSS&lt;/li&gt;
&lt;li&gt;Axios&lt;/li&gt;
&lt;li&gt;Yarn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Vue foi responsável pela camada reativa da interface.&lt;/p&gt;

&lt;p&gt;O TailwindCSS permitiu construir layouts responsivos e manter consistência visual. &lt;/p&gt;

&lt;p&gt;Já o Axios foi utilizado para consumir as APIs disponibilizadas pelo backend. &lt;/p&gt;




&lt;h2&gt;
  
  
  Construindo o Dashboard
&lt;/h2&gt;

&lt;p&gt;O dashboard era o principal ponto de interação do usuário.&lt;/p&gt;

&lt;p&gt;Nele eram exibidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Umidade atual&lt;/li&gt;
&lt;li&gt;Histórico da planta&lt;/li&gt;
&lt;li&gt;Gráficos de acompanhamento&lt;/li&gt;
&lt;li&gt;Controle da bomba d'água&lt;/li&gt;
&lt;li&gt;Controle da válvula solenóide&lt;/li&gt;
&lt;li&gt;Configuração de horários de irrigação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, o sistema também integrava dados climáticos utilizando geolocalização para complementar as informações apresentadas ao usuário. &lt;/p&gt;




&lt;h2&gt;
  
  
  Funcionalidades Implementadas
&lt;/h2&gt;

&lt;p&gt;Ao longo do desenvolvimento foram implementadas funcionalidades como:&lt;/p&gt;

&lt;h3&gt;
  
  
  Ativação do vaso
&lt;/h3&gt;

&lt;p&gt;O usuário informava um código de ativação presente no dispositivo físico para associá-lo à aplicação. &lt;/p&gt;

&lt;h3&gt;
  
  
  Histórico de atividades
&lt;/h3&gt;

&lt;p&gt;Todas as ações realizadas pelo hardware eram registradas.&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leituras de umidade&lt;/li&gt;
&lt;li&gt;Temperatura&lt;/li&gt;
&lt;li&gt;Acionamentos da bomba&lt;/li&gt;
&lt;li&gt;Alterações de configuração&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Galeria de imagens
&lt;/h3&gt;

&lt;p&gt;As imagens capturadas pelo Raspberry Pi eram armazenadas e disponibilizadas ao usuário através da aplicação web. &lt;/p&gt;

&lt;h3&gt;
  
  
  Configuração de irrigação
&lt;/h3&gt;

&lt;p&gt;O usuário podia personalizar horários, quantidade de água e comportamento geral da automação. &lt;/p&gt;

&lt;h3&gt;
  
  
  Notificações
&lt;/h3&gt;

&lt;p&gt;O sistema monitorava constantemente o nível de água e notificava o usuário quando necessário. &lt;/p&gt;




&lt;h2&gt;
  
  
  Modelando Antes de Programar
&lt;/h2&gt;

&lt;p&gt;Um dos maiores aprendizados durante o desenvolvimento foi perceber o valor da modelagem.&lt;/p&gt;

&lt;p&gt;Antes de escrever boa parte do código, foram construídos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Casos de uso&lt;/li&gt;
&lt;li&gt;Diagramas de classes&lt;/li&gt;
&lt;li&gt;Diagramas de estado&lt;/li&gt;
&lt;li&gt;Modelo entidade-relacionamento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa etapa ajudou a reduzir retrabalho e permitiu visualizar melhor as interações entre hardware, backend e frontend. &lt;/p&gt;

&lt;p&gt;Hoje, trabalhando profissionalmente com desenvolvimento de software, continuo aplicando muitos desses conceitos aprendidos durante o TCC.&lt;/p&gt;




&lt;h2&gt;
  
  
  Principais Desafios
&lt;/h2&gt;

&lt;p&gt;Nem tudo funcionou na primeira tentativa.&lt;/p&gt;

&lt;p&gt;Um dos desafios mais interessantes ocorreu durante a construção do hardware.&lt;/p&gt;

&lt;p&gt;Inicialmente foi utilizada uma abordagem baseada em relés para controlar os componentes eletrônicos, porém limitações relacionadas à alimentação e arquitetura do circuito levaram à busca de alternativas. &lt;/p&gt;

&lt;p&gt;Posteriormente foram realizados testes utilizando transistores, o que permitiu um controle mais eficiente dos componentes e trouxe novas possibilidades para o projeto. &lt;/p&gt;

&lt;p&gt;Esses experimentos acabaram gerando um aprendizado muito maior sobre eletrônica embarcada do que eu imaginava quando iniciei o trabalho.&lt;/p&gt;




&lt;h2&gt;
  
  
  O Que Eu Aprendi Com Esse Projeto
&lt;/h2&gt;

&lt;p&gt;Este TCC me ensinou algo que levo até hoje para minha carreira:&lt;/p&gt;

&lt;p&gt;Software raramente existe sozinho.&lt;/p&gt;

&lt;p&gt;Projetos reais envolvem integração entre múltiplos sistemas, dispositivos, protocolos, bancos de dados, APIs e usuários.&lt;/p&gt;

&lt;p&gt;Construir uma solução completa, desde o hardware até a interface final, mudou completamente minha visão sobre arquitetura de software e desenvolvimento de produtos.&lt;/p&gt;

&lt;p&gt;Mais do que um projeto acadêmico, esse trabalho foi minha primeira experiência desenvolvendo um ecossistema tecnológico completo.&lt;/p&gt;




&lt;h2&gt;
  
  
  TCC Completo
&lt;/h2&gt;

&lt;p&gt;Para quem quiser explorar a modelagem, arquitetura, diagramas, fluxos, testes realizados e toda a documentação acadêmica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/document/d/1lu6QJOUfjkW7H4vYd9bw7RpI84cVGMF6/edit?usp=drive_link&amp;amp;ouid=114766962307329124788&amp;amp;rtpof=true&amp;amp;sd=true" rel="noopener noreferrer"&gt;https://docs.google.com/document/d/1lu6QJOUfjkW7H4vYd9bw7RpI84cVGMF6/edit?usp=drive_link&amp;amp;ouid=114766962307329124788&amp;amp;rtpof=true&amp;amp;sd=true&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>iot</category>
      <category>monitoring</category>
      <category>academic</category>
    </item>
    <item>
      <title>Migrando uma aplicação Vue 2 legada de Webpack 2 para Vite: Um guia prático baseado em problemas reais</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 20:29:31 +0000</pubDate>
      <link>https://dev.to/camilasrody/migrando-uma-aplicacao-vue-2-legada-de-webpack-2-para-vite-um-guia-pratico-baseado-em-problemas-1k1e</link>
      <guid>https://dev.to/camilasrody/migrando-uma-aplicacao-vue-2-legada-de-webpack-2-para-vite-um-guia-pratico-baseado-em-problemas-1k1e</guid>
      <description>&lt;p&gt;Quando falamos sobre migração para Vite, a maioria dos artigos parte de um cenário ideal: projetos relativamente modernos, dependências atualizadas, versões recentes do Node e uma arquitetura preparada para evoluir. Na prática, porém, muitas empresas ainda mantêm aplicações Vue 2 que surgiram anos atrás, construídas sobre Webpack 2, carregando uma grande quantidade de bibliotecas descontinuadas, loaders obsoletos e configurações que foram sendo adaptadas por diferentes equipes ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Foi exatamente esse cenário que encontrei. O objetivo não era migrar para Vue 3, reescrever a aplicação ou modernizar toda a stack de uma vez. O desafio era muito mais delicado: substituir o Webpack 2 por Vite mantendo a aplicação funcionando, preservando compatibilidade com bibliotecas legadas e sem interromper o desenvolvimento do produto.&lt;/p&gt;

&lt;p&gt;Ao longo desse processo, ficou evidente que a maior dificuldade não estava na configuração do Vite em si. O verdadeiro desafio era descobrir tudo aquilo que o Webpack estava fazendo silenciosamente há anos e garantir que esse comportamento fosse reproduzido no novo ambiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de Instalar o Vite, Entenda o Que o Webpack Faz Pelo Seu Projeto
&lt;/h2&gt;

&lt;p&gt;Um erro bastante comum é iniciar a migração instalando o Vite e tentando fazer a aplicação subir imediatamente. Em aplicações pequenas isso pode funcionar. Em sistemas legados, normalmente gera uma sequência interminável de erros difíceis de rastrear.&lt;/p&gt;

&lt;p&gt;Antes de qualquer alteração, é fundamental mapear as responsabilidades atuais do Webpack. Em muitos projetos ele não atua apenas como bundler. Frequentemente também é responsável por resolver aliases, processar imagens, transpilar JavaScript, injetar variáveis de ambiente, tratar arquivos Sass, gerar chunks dinâmicos e fornecer polyfills para APIs que os navegadores não implementam nativamente.&lt;/p&gt;

&lt;p&gt;Por isso, o primeiro passo deve ser uma auditoria da configuração existente.&lt;/p&gt;

&lt;p&gt;Analise cuidadosamente arquivos como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack.config.js
webpack.dev.js
webpack.prod.js
.babelrc
package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durante essa análise, documente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aliases utilizados&lt;/li&gt;
&lt;li&gt;Loaders instalados&lt;/li&gt;
&lt;li&gt;Plugins do Webpack&lt;/li&gt;
&lt;li&gt;Configurações do Babel&lt;/li&gt;
&lt;li&gt;Variáveis de ambiente&lt;/li&gt;
&lt;li&gt;Polyfills&lt;/li&gt;
&lt;li&gt;Estratégias de code splitting&lt;/li&gt;
&lt;li&gt;Tratamento de assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa documentação servirá como roteiro para toda a migração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estabilize a Versão do Node Antes de Trocar o Bundler
&lt;/h2&gt;

&lt;p&gt;Em projetos antigos, é comum encontrar versões do Node extremamente defasadas. Muitas vezes o sistema foi desenvolvido utilizando Node 8, Node 10 ou Node 12, e diversas dependências foram escritas considerando limitações dessas versões.&lt;/p&gt;

&lt;p&gt;Tentar atualizar Node e substituir Webpack ao mesmo tempo costuma gerar um problema clássico: quando algo quebra, torna-se difícil descobrir a causa.&lt;/p&gt;

&lt;p&gt;Por isso, recomendo separar completamente essas etapas.&lt;/p&gt;

&lt;p&gt;Primeiro, valide até qual versão do Node a aplicação consegue evoluir sem alterações significativas. Durante essa fase você provavelmente encontrará dependências problemáticas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node-sass
extract-text-webpack-plugin
uglify-js
babel-preset-es2015
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em muitos casos, a melhor decisão não é atualizar essas bibliotecas, mas congelá-las temporariamente para reduzir riscos.&lt;/p&gt;

&lt;p&gt;O objetivo inicial não é modernizar tudo. É criar um ambiente estável sobre o qual a migração poderá acontecer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instale o Vite Sem Remover o Webpack
&lt;/h2&gt;

&lt;p&gt;Uma das decisões mais importantes durante minha migração foi evitar uma substituição imediata.&lt;/p&gt;

&lt;p&gt;Em vez de remover o Webpack, o Vite foi introduzido paralelamente.&lt;/p&gt;

&lt;p&gt;A instalação básica para Vue 2 é relativamente simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;vite vite-plugin-vue2 &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso, crie um arquivo &lt;code&gt;vite.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuePlugin&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite-plugin-vue2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;createVuePlugin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse momento o Webpack continua existindo normalmente.&lt;/p&gt;

&lt;p&gt;Os scripts passam a coexistir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack-dev-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev:vite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build:vite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite build"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa abordagem permite comparar comportamentos, validar funcionalidades e criar um plano de rollback caso algo inesperado aconteça.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrando os Aliases
&lt;/h2&gt;

&lt;p&gt;Quase toda aplicação Vue 2 de médio ou grande porte utiliza aliases para evitar imports relativos extensos.&lt;/p&gt;

&lt;p&gt;Um exemplo comum no Webpack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses aliases precisam ser reproduzidos no Vite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pode parecer um detalhe pequeno, mas em aplicações grandes isso afeta centenas ou milhares de imports.&lt;/p&gt;

&lt;p&gt;Por isso, essa costuma ser uma das primeiras configurações que implemento durante a migração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corrigindo Imports Dinâmicos Que Funcionavam Apenas no Webpack
&lt;/h2&gt;

&lt;p&gt;Uma das incompatibilidades mais frequentes está relacionada aos famosos &lt;code&gt;require()&lt;/code&gt; dinâmicos.&lt;/p&gt;

&lt;p&gt;Durante anos o Webpack permitiu padrões como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;pageName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O problema é que o Vite utiliza análise estática para resolver módulos e não consegue interpretar caminhos gerados dinamicamente em tempo de execução.&lt;/p&gt;

&lt;p&gt;Nesses casos é necessário utilizar &lt;code&gt;import.meta.glob()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`./pages/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pageName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.vue`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/*.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`./pages/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pageName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.vue`&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em projetos legados, essa costuma ser uma das etapas mais trabalhosas da migração, pois exige revisão de arquitetura em diversos pontos da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrando Variáveis de Ambiente
&lt;/h2&gt;

&lt;p&gt;Outro ajuste obrigatório envolve as variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;Projetos baseados em Webpack normalmente utilizam:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Vite o padrão é diferente.&lt;/p&gt;

&lt;p&gt;Antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_API_URL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, o arquivo &lt;code&gt;.env&lt;/code&gt; precisa ser adaptado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_API_URL=https://api.minhaempresa.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um detalhe importante é que o Vite só expõe para o frontend variáveis prefixadas com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ignorar esse detalhe pode gerar erros difíceis de identificar em ambientes de homologação e produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lidando com Bibliotecas CommonJS e Dependências Abandonadas
&lt;/h2&gt;

&lt;p&gt;Uma das maiores preocupações em sistemas legados é a quantidade de bibliotecas que não acompanham mais a evolução do ecossistema JavaScript.&lt;/p&gt;

&lt;p&gt;Muitas delas ainda utilizam:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;library&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;library&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embora o Vite possua mecanismos de compatibilidade, alguns pacotes exigem otimizações explícitas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;optimizeDeps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;legacy-library&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;old-plugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando isso não é suficiente, uma alternativa eficiente é criar wrappers de compatibilidade para isolar o problema e evitar alterações massivas no código.&lt;/p&gt;

&lt;p&gt;Essa abordagem reduz significativamente o impacto da migração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polyfills: O Problema Que Geralmente Só Aparece Depois
&lt;/h2&gt;

&lt;p&gt;Durante anos o Webpack forneceu diversos polyfills automaticamente.&lt;/p&gt;

&lt;p&gt;Quando migramos para Vite, muitos deles desaparecem.&lt;/p&gt;

&lt;p&gt;É comum encontrar erros como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Buffer is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;process is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;global is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo de correção para Buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buffer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses problemas normalmente surgem apenas durante testes mais profundos, por isso é importante validar cuidadosamente todas as funcionalidades críticas da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revisando Loaders e Assets
&lt;/h2&gt;

&lt;p&gt;Grande parte da complexidade de projetos Webpack antigos está concentrada nos loaders.&lt;/p&gt;

&lt;p&gt;É comum encontrar configurações envolvendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file-loader&lt;/li&gt;
&lt;li&gt;url-loader&lt;/li&gt;
&lt;li&gt;raw-loader&lt;/li&gt;
&lt;li&gt;svg-loader&lt;/li&gt;
&lt;li&gt;font-loader&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A boa notícia é que muitos desses recursos são tratados nativamente pelo Vite.&lt;/p&gt;

&lt;p&gt;Entretanto, não assuma que todos os comportamentos serão reproduzidos automaticamente.&lt;/p&gt;

&lt;p&gt;Sempre valide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SVGs inline&lt;/li&gt;
&lt;li&gt;Fontes customizadas&lt;/li&gt;
&lt;li&gt;Arquivos estáticos&lt;/li&gt;
&lt;li&gt;Assets importados dinamicamente&lt;/li&gt;
&lt;li&gt;Recursos utilizados por bibliotecas de terceiros&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Muitos bugs de produção surgem exatamente nessa etapa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validando a Build de Produção
&lt;/h2&gt;

&lt;p&gt;Fazer a aplicação funcionar em desenvolvimento não significa que a migração terminou.&lt;/p&gt;

&lt;p&gt;Na verdade, a parte mais importante começa depois.&lt;/p&gt;

&lt;p&gt;Uma validação completa deve incluir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navegação entre rotas&lt;/li&gt;
&lt;li&gt;Lazy loading&lt;/li&gt;
&lt;li&gt;Autenticação&lt;/li&gt;
&lt;li&gt;Upload de arquivos&lt;/li&gt;
&lt;li&gt;Integrações externas&lt;/li&gt;
&lt;li&gt;Variáveis de ambiente&lt;/li&gt;
&lt;li&gt;Source maps&lt;/li&gt;
&lt;li&gt;Geração de bundles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, recomendo comparar o comportamento da aplicação construída pelo Webpack e pelo Vite simultaneamente durante algum tempo.&lt;/p&gt;

&lt;p&gt;Essa estratégia facilita a identificação de regressões e reduz significativamente os riscos da implantação.&lt;/p&gt;

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

&lt;p&gt;Depois de concluir essa migração, uma percepção ficou muito clara para mim: trocar Webpack por Vite é a parte fácil.&lt;/p&gt;

&lt;p&gt;O trabalho real está em compreender todas as decisões arquiteturais acumuladas ao longo dos anos e identificar quais delas dependem diretamente do comportamento do Webpack.&lt;/p&gt;

&lt;p&gt;Aliases, imports dinâmicos, polyfills, bibliotecas CommonJS, loaders antigos e configurações herdadas raramente aparecem na documentação do projeto. Muitas vezes, só descobrimos sua importância quando algo deixa de funcionar.&lt;/p&gt;

&lt;p&gt;Por isso, a melhor estratégia não é migrar rápido. É migrar de forma controlada, mantendo Webpack e Vite coexistindo durante o processo, validando cada etapa e reduzindo ao máximo a quantidade de variáveis envolvidas.&lt;/p&gt;

&lt;p&gt;Em aplicações Vue 2 legadas, o sucesso da migração não está em instalar uma ferramenta nova. Está em conseguir modernizar a infraestrutura sem alterar o comportamento que o sistema construiu ao longo dos anos.&lt;/p&gt;

</description>
      <category>webpack</category>
      <category>vite</category>
      <category>migration</category>
      <category>vue</category>
    </item>
    <item>
      <title>Migrating a Legacy Vue 2 Application from Webpack 2 to Vite: A Practical Step-by-Step Guide</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 20:27:44 +0000</pubDate>
      <link>https://dev.to/camilasrody/migrating-a-legacy-vue-2-application-from-webpack-2-to-vite-a-practical-step-by-step-guide-2gda</link>
      <guid>https://dev.to/camilasrody/migrating-a-legacy-vue-2-application-from-webpack-2-to-vite-a-practical-step-by-step-guide-2gda</guid>
      <description>&lt;p&gt;Most migration guides assume a relatively modern codebase. They start with Vue CLI 5, recent Node versions, maintained dependencies, and a straightforward path toward Vite.&lt;/p&gt;

&lt;p&gt;That was not my reality.&lt;/p&gt;

&lt;p&gt;The project I inherited was a legacy Vue 2 application built on Webpack 2. The ecosystem contained deprecated loaders, abandoned plugins, outdated Babel configurations, CommonJS packages, custom aliases, and years of accumulated technical debt. Rewriting the application was not an option, and upgrading every dependency simultaneously would have introduced an unacceptable amount of risk.&lt;/p&gt;

&lt;p&gt;The objective was simple: replace Webpack 2 with Vite while preserving the existing application architecture and maintaining compatibility with legacy dependencies.&lt;/p&gt;

&lt;p&gt;This article focuses on the technical process itself. Rather than discussing modernization from a high level, I will walk through the exact migration strategy, the compatibility issues encountered, and the solutions that allowed the project to continue operating without a complete rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding What Webpack Is Actually Doing
&lt;/h2&gt;

&lt;p&gt;Before installing Vite, it is essential to understand that Webpack is not merely bundling JavaScript. In most Vue 2 applications that have existed for several years, Webpack is responsible for resolving aliases, transpiling code, injecting environment variables, loading assets, compiling stylesheets, handling code splitting, and often compensating for browser incompatibilities.&lt;/p&gt;

&lt;p&gt;A common mistake is attempting to install Vite and immediately delete the existing Webpack configuration.&lt;/p&gt;

&lt;p&gt;Instead, start by mapping every responsibility currently performed by Webpack.&lt;/p&gt;

&lt;p&gt;Analyze files such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack.config.js
webpack.prod.js
webpack.dev.js
.babelrc
package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aliases&lt;/li&gt;
&lt;li&gt;Loaders&lt;/li&gt;
&lt;li&gt;Plugins&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Babel presets&lt;/li&gt;
&lt;li&gt;Polyfills&lt;/li&gt;
&lt;li&gt;Dynamic imports&lt;/li&gt;
&lt;li&gt;Asset handling&lt;/li&gt;
&lt;li&gt;Sass/Less configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after understanding these responsibilities should the migration begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Establishing a Stable Node Environment
&lt;/h2&gt;

&lt;p&gt;Legacy Vue 2 projects often depend on old Node versions.&lt;/p&gt;

&lt;p&gt;Before introducing Vite, identify the highest Node version capable of running the project without breaking dependencies.&lt;/p&gt;

&lt;p&gt;A typical scenario looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"engines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8.x"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Attempting to jump directly from Node 8 to Node 22 while simultaneously replacing Webpack introduces too many variables.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upgrade Node incrementally.&lt;/li&gt;
&lt;li&gt;Verify build stability.&lt;/li&gt;
&lt;li&gt;Resolve dependency incompatibilities.&lt;/li&gt;
&lt;li&gt;Only then introduce Vite.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Many failures blamed on Vite are actually caused by outdated dependencies that cannot execute in modern Node environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Vite Without Removing Webpack
&lt;/h2&gt;

&lt;p&gt;The safest migration strategy is running both build systems simultaneously.&lt;/p&gt;

&lt;p&gt;Install Vite and Vue 2 support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;vite vite-plugin-vue2 &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a dedicated Vite configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuePlugin&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite-plugin-vue2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;createVuePlugin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage, Webpack remains untouched.&lt;/p&gt;

&lt;p&gt;The objective is creating a parallel build environment rather than replacing the existing one immediately.&lt;/p&gt;

&lt;p&gt;Your scripts may temporarily look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack-dev-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev:vite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build:vite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite build"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows side-by-side validation throughout the migration process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating Aliases
&lt;/h2&gt;

&lt;p&gt;Most large Vue 2 applications rely heavily on aliases.&lt;/p&gt;

&lt;p&gt;A typical Webpack configuration might contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These aliases must be replicated within Vite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Failure to mirror aliases correctly usually produces hundreds of import resolution errors.&lt;/p&gt;

&lt;p&gt;This should be one of the first migration tasks completed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replacing Webpack-Specific Environment Variables
&lt;/h2&gt;

&lt;p&gt;Webpack projects frequently depend on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vite uses a different model based on native ESM.&lt;/p&gt;

&lt;p&gt;Before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_API_URL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Environment files must also be updated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_API_URL=https://api.company.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One important detail is that Vite only exposes variables prefixed with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables without this prefix will not be available in client-side code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refactoring Dynamic Require Statements
&lt;/h2&gt;

&lt;p&gt;One of the largest migration blockers in legacy Vue applications is the extensive use of runtime require statements.&lt;/p&gt;

&lt;p&gt;Webpack tolerated patterns like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;pageName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vite cannot statically analyze these imports.&lt;/p&gt;

&lt;p&gt;The modern replacement is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/*.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`./pages/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pageName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.vue`&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This change is often unavoidable.&lt;/p&gt;

&lt;p&gt;Projects with extensive dynamic loading mechanisms usually require dedicated refactoring during migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating Asset Imports
&lt;/h2&gt;

&lt;p&gt;Webpack loaders often hide complexity.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./logo.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;icon&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./icon.svg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fortunately, most static assets work immediately in Vite.&lt;/p&gt;

&lt;p&gt;However, custom loaders require investigation.&lt;/p&gt;

&lt;p&gt;Common examples include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;file-loader
url-loader
svg-inline-loader
raw-loader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many become unnecessary because Vite provides native handling.&lt;/p&gt;

&lt;p&gt;When custom behavior exists, identify whether it can be replaced through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vite plugins&lt;/li&gt;
&lt;li&gt;Native imports&lt;/li&gt;
&lt;li&gt;Asset URL transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never assume loader behavior automatically transfers to Vite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling CommonJS Dependencies
&lt;/h2&gt;

&lt;p&gt;Legacy Vue 2 projects often depend on libraries published years before ES Modules became standard.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;library&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;library&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vite can optimize many CommonJS packages automatically.&lt;/p&gt;

&lt;p&gt;When issues occur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;optimizeDeps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;legacy-library&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;old-plugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For problematic packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;library&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;legacy-library&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;library&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creating compatibility wrappers often avoids widespread refactoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing Global Variables and Polyfills
&lt;/h2&gt;

&lt;p&gt;Webpack silently injected several browser polyfills.&lt;/p&gt;

&lt;p&gt;Vite does not.&lt;/p&gt;

&lt;p&gt;Typical migration errors include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;process is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Buffer is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;global is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solutions vary depending on usage.&lt;/p&gt;

&lt;p&gt;For Buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buffer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;process
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;process&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Polyfills should be added intentionally rather than globally whenever possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reviewing Babel Requirements
&lt;/h2&gt;

&lt;p&gt;Many Vue 2 applications contain complex Babel configurations inherited from older browser support requirements.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"presets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"modules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before migrating, determine whether Babel is still necessary.&lt;/p&gt;

&lt;p&gt;In many cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Legacy IE support has been dropped.&lt;/li&gt;
&lt;li&gt;Modern browsers are sufficient.&lt;/li&gt;
&lt;li&gt;Several transformations become unnecessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reducing Babel complexity often simplifies the migration significantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Converting Development Workflows
&lt;/h2&gt;

&lt;p&gt;One of the most visible differences after migration is the development experience.&lt;/p&gt;

&lt;p&gt;Webpack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may require 20–60 seconds before changes appear.&lt;/p&gt;

&lt;p&gt;Vite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev:vite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;typically starts almost instantly because dependencies are pre-bundled and source files are served as native ES modules.&lt;/p&gt;

&lt;p&gt;The perceived performance improvement is often the first confirmation that the migration is succeeding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Validation
&lt;/h2&gt;

&lt;p&gt;A successful development server means very little.&lt;/p&gt;

&lt;p&gt;The final phase should focus on production validation.&lt;/p&gt;

&lt;p&gt;Review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;API communication&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Lazy loading&lt;/li&gt;
&lt;li&gt;Asset generation&lt;/li&gt;
&lt;li&gt;Source maps&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare generated bundles.&lt;/p&gt;

&lt;p&gt;Analyze network requests.&lt;/p&gt;

&lt;p&gt;Verify route-level code splitting.&lt;/p&gt;

&lt;p&gt;Inspect console warnings.&lt;/p&gt;

&lt;p&gt;Most migration issues appear during production builds rather than development execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The hardest part of migrating a Vue 2 application from Webpack 2 to Vite is not configuring Vite itself. The real challenge lies in uncovering years of implicit assumptions hidden within a mature codebase.&lt;/p&gt;

&lt;p&gt;Webpack frequently compensates for architectural decisions that developers no longer remember making. Dynamic imports, CommonJS dependencies, deprecated loaders, implicit polyfills, and custom build behavior all become visible once the abstraction layer changes.&lt;/p&gt;

&lt;p&gt;A successful migration is rarely a matter of replacing one bundler with another. It is an exercise in understanding the architecture deeply enough to preserve existing behavior while modernizing the tooling around it.&lt;/p&gt;

&lt;p&gt;If I had to summarize the process into a single recommendation, it would be this: run Webpack and Vite side by side for as long as necessary. The ability to compare outputs, isolate regressions, and maintain a rollback path is often the difference between a smooth migration and weeks of production issues.&lt;/p&gt;

</description>
      <category>vite</category>
      <category>vue</category>
      <category>webpack</category>
      <category>migration</category>
    </item>
    <item>
      <title>Refactoring is beyond the code and structure issues...</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 20:11:38 +0000</pubDate>
      <link>https://dev.to/camilasrody/refactoring-is-beyond-the-code-and-structure-issues-bk7</link>
      <guid>https://dev.to/camilasrody/refactoring-is-beyond-the-code-and-structure-issues-bk7</guid>
      <description>&lt;p&gt;When we talk about refactoring, we usually think about reducing complexity, eliminating duplication, improving naming, or applying design patterns. All of these are important parts of the process, but over the years I've come to realize that the best refactoring efforts rarely start with code. They start with understanding.&lt;/p&gt;

&lt;p&gt;There's a natural tendency to look at an existing system and judge it based on what we know today. We open a massive component, a complicated business rule, or an architecture that feels outdated and immediately think, &lt;em&gt;"I would do this differently."&lt;/em&gt; And perhaps we would. The problem is that this perspective often ignores a fundamental reality: every software system is a reflection of the circumstances in which it was built.&lt;/p&gt;

&lt;p&gt;Code does not emerge in a vacuum. It is shaped by deadlines, technical constraints, business priorities, budget limitations, organizational pressures, and the experience level of the people involved. A decision that appears questionable today may have been the most rational choice available at the time. Perhaps the team was racing to validate a product, responding to a critical business need, or operating with far fewer resources than we have now. Maybe the technologies, frameworks, or patterns we take for granted today simply didn't exist when those decisions were made.&lt;/p&gt;

&lt;p&gt;This is why good refactoring requires much more than identifying technical flaws. It requires understanding why certain decisions were made in the first place. Before changing a system, it's important to understand the problems it was designed to solve, the constraints that influenced its design, and the business goals it was expected to support. Without that context, we risk confusing evolution with error.&lt;/p&gt;

&lt;p&gt;In many cases, the code itself isn't the problem. What has changed is everything around it. The business has evolved. Requirements have shifted. The team has grown. Technology has advanced. The scale of the application has increased. A solution that worked perfectly for hundreds of users may no longer be suitable for millions. An architecture that was ideal for a startup may struggle within a mature enterprise. In these situations, the original implementation wasn't necessarily wrong—it was simply built for a different reality.&lt;/p&gt;

&lt;p&gt;That's why I increasingly see refactoring as an exercise in investigation. Before changing anything, I want to understand the story behind the system. What challenges was it trying to solve? What compromises were made? What assumptions guided its design? What constraints influenced its architecture? The answers to those questions are often far more valuable than any design pattern or technical framework.&lt;/p&gt;

&lt;p&gt;Another aspect that is often overlooked is that refactoring isn't just about improving technical quality. It's also about preserving knowledge. Every codebase contains years of accumulated decisions, lessons learned, production incidents, business discoveries, and engineering trade-offs. Much of that knowledge never makes it into documentation, tickets, or commit messages. Instead, it becomes embedded in the structure of the system itself.&lt;/p&gt;

&lt;p&gt;When we ignore that history, we risk removing far more than code. We may unintentionally discard valuable business knowledge, hard-earned operational experience, and solutions that exist for reasons no longer immediately visible. A mature refactoring effort doesn't simply ask what should change. It also asks what should be preserved.&lt;/p&gt;

&lt;p&gt;Ultimately, refactoring is far less about rewriting code and far more about understanding decisions. It requires context, empathy, and a long-term perspective. Before building the next version of a system, we need to understand why the current version exists.&lt;/p&gt;

&lt;p&gt;Because at its core, refactoring is the practice of understanding the past in order to build a better future.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>Frameworks Change. JavaScript Remains.</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 19:47:55 +0000</pubDate>
      <link>https://dev.to/camilasrody/frameworks-change-javascript-remains-5c6h</link>
      <guid>https://dev.to/camilasrody/frameworks-change-javascript-remains-5c6h</guid>
      <description>&lt;p&gt;The more I study React and Vue, the more I realize that developers often spend more time debating frameworks than understanding the fundamentals that make those frameworks possible.&lt;/p&gt;

&lt;p&gt;Discussions about performance, developer experience, ecosystem maturity, and new features are everywhere. While these conversations are valuable, they often overlook a simple reality: React and Vue are ultimately abstractions built on top of JavaScript.&lt;/p&gt;

&lt;p&gt;When we look beneath the APIs we use every day, we find the same underlying concepts repeatedly appearing in different forms.&lt;/p&gt;

&lt;p&gt;Take &lt;code&gt;useMemo&lt;/code&gt; in React and &lt;code&gt;computed()&lt;/code&gt; in Vue, for example. Although their implementations differ, both rely on the same fundamental ideas: caching, dependency tracking, and closures. The framework provides a convenient abstraction, but the underlying principles remain unchanged.&lt;/p&gt;

&lt;p&gt;The same is true for &lt;code&gt;useCallback&lt;/code&gt;. Many developers treat it as a magical optimization tool, when in reality it is primarily a mechanism for preserving function references across renders. To fully understand its behavior, you need to understand closures, memory references, and dependency comparisons.&lt;/p&gt;

&lt;p&gt;Similarly, Vue's &lt;code&gt;watch()&lt;/code&gt; and React's &lt;code&gt;useEffect()&lt;/code&gt; may look different on the surface, but both depend on concepts such as dependency tracking, scheduling, and the Event Loop.&lt;/p&gt;

&lt;p&gt;State management follows the same pattern. Whether you're using React's &lt;code&gt;useState&lt;/code&gt; or Vue's &lt;code&gt;ref&lt;/code&gt; and &lt;code&gt;reactive&lt;/code&gt;, you're still working with the same underlying concepts: state, observability, controlled mutations, and reactivity.&lt;/p&gt;

&lt;p&gt;Even modern asynchronous programming is built on foundations that haven't changed.&lt;/p&gt;

&lt;p&gt;Promises and &lt;code&gt;async/await&lt;/code&gt; dramatically improved developer experience, but they didn't replace the mechanisms that power asynchronous execution. Behind every asynchronous operation, concepts such as the Call Stack, Event Loop, Callback Queue, Microtasks, and Macrotasks continue to govern application behavior.&lt;/p&gt;

&lt;p&gt;Frameworks evolve.&lt;/p&gt;

&lt;p&gt;APIs evolve.&lt;/p&gt;

&lt;p&gt;But the fundamentals remain.&lt;/p&gt;

&lt;p&gt;And that's one of the reasons I have mixed feelings about the current wave of AI adoption in software development.&lt;/p&gt;

&lt;p&gt;Don't get me wrong—I use AI every day.&lt;/p&gt;

&lt;p&gt;For coding, architecture discussions, debugging, research, documentation, and learning. It has become an incredibly valuable part of my workflow.&lt;/p&gt;

&lt;p&gt;However, I've noticed an increasingly common pattern.&lt;/p&gt;

&lt;p&gt;Many developers are becoming highly productive without necessarily becoming more knowledgeable.&lt;/p&gt;

&lt;p&gt;AI can generate React components, Vue composables, tests, documentation, and even architectural suggestions in seconds. The output is often impressive.&lt;/p&gt;

&lt;p&gt;The problem is that productivity and understanding are not the same thing.&lt;/p&gt;

&lt;p&gt;More and more, I see developers working with React, Vue, AI-assisted coding tools, and even agentic systems without fully understanding concepts such as closures, lexical scope, prototypes, hoisting, memory management, garbage collection, reference semantics, or the Event Loop.&lt;/p&gt;

&lt;p&gt;And this concern extends far beyond JavaScript.&lt;/p&gt;

&lt;p&gt;The same thing can happen with software architecture, design patterns, SOLID principles, system design, separation of concerns, engineering methodologies, and technical decision-making.&lt;/p&gt;

&lt;p&gt;The immediate impact is rarely visible.&lt;/p&gt;

&lt;p&gt;The application still works.&lt;/p&gt;

&lt;p&gt;The feature still ships.&lt;/p&gt;

&lt;p&gt;The sprint still ends successfully.&lt;/p&gt;

&lt;p&gt;But over time, something important starts to erode.&lt;/p&gt;

&lt;p&gt;The ability to reason deeply about a problem.&lt;/p&gt;

&lt;p&gt;The ability to challenge a proposed solution.&lt;/p&gt;

&lt;p&gt;The ability to identify architectural weaknesses before they become expensive.&lt;/p&gt;

&lt;p&gt;The ability to understand not only &lt;em&gt;how&lt;/em&gt; something works, but &lt;em&gt;why&lt;/em&gt; it works.&lt;/p&gt;

&lt;p&gt;AI is an extraordinary tool for accelerating development.&lt;/p&gt;

&lt;p&gt;But outsourced knowledge is not acquired knowledge.&lt;/p&gt;

&lt;p&gt;If we stop exercising our fundamentals, we gradually lose the ability to evaluate, adapt, and improve the solutions we receive.&lt;/p&gt;

&lt;p&gt;Ironically, I believe the best way to use AI is not as a replacement for learning, but as a catalyst for it.&lt;/p&gt;

&lt;p&gt;Ask why a solution works.&lt;/p&gt;

&lt;p&gt;Ask about trade-offs.&lt;/p&gt;

&lt;p&gt;Ask for alternative approaches.&lt;/p&gt;

&lt;p&gt;Ask for deeper explanations.&lt;/p&gt;

&lt;p&gt;Use AI as a teacher, not just as a generator.&lt;/p&gt;

&lt;p&gt;Because the engineers who will thrive in the coming years won't simply be the ones who use AI the most.&lt;/p&gt;

&lt;p&gt;They'll be the ones who combine strong fundamentals with powerful tools.&lt;/p&gt;

&lt;p&gt;Frameworks will change.&lt;/p&gt;

&lt;p&gt;Tools will change.&lt;/p&gt;

&lt;p&gt;AI models will change.&lt;/p&gt;

&lt;p&gt;But JavaScript fundamentals, software engineering principles, and critical thinking remain the foundation upon which everything else is built.&lt;/p&gt;

&lt;p&gt;And that foundation is still worth investing in.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Frameworks mudam. JavaScript continua.</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 19:47:00 +0000</pubDate>
      <link>https://dev.to/camilasrody/frameworks-mudam-javascript-continua-onj</link>
      <guid>https://dev.to/camilasrody/frameworks-mudam-javascript-continua-onj</guid>
      <description>&lt;p&gt;Quanto mais estudo React e Vue, mais percebo que a discussão entre frameworks costuma receber muito mais atenção do que os fundamentos que realmente sustentam essas ferramentas.&lt;/p&gt;

&lt;p&gt;É comum encontrar debates sobre qual framework possui melhor performance, qual oferece a melhor experiência para desenvolvedores ou qual ecossistema é mais completo. Embora essas discussões sejam relevantes, elas frequentemente ignoram um fato importante: React e Vue são apenas abstrações construídas sobre JavaScript.&lt;/p&gt;

&lt;p&gt;Quando observamos as APIs que utilizamos diariamente, percebemos que grande parte delas existe para encapsular conceitos fundamentais da linguagem.&lt;/p&gt;

&lt;p&gt;Quando utilizamos &lt;code&gt;useMemo&lt;/code&gt; no React ou &lt;code&gt;computed&lt;/code&gt; no Vue, estamos lidando com mecanismos de cache, rastreamento de dependências e retenção de estado através de closures. O framework oferece uma interface amigável, mas os princípios continuam sendo os mesmos.&lt;/p&gt;

&lt;p&gt;Da mesma forma, &lt;code&gt;useCallback&lt;/code&gt; não realiza nenhuma otimização mágica. Ele existe para preservar referências de funções entre renderizações. Para compreender seu comportamento, é necessário entender closures, referências em memória e comparação de dependências.&lt;/p&gt;

&lt;p&gt;O mesmo raciocínio se aplica a &lt;code&gt;watch&lt;/code&gt; no Vue e &lt;code&gt;useEffect&lt;/code&gt; no React. Apesar das diferenças de implementação, ambos dependem de conceitos como dependency tracking, agendamento de execução e funcionamento do Event Loop.&lt;/p&gt;

&lt;p&gt;Até mesmo os mecanismos de gerenciamento de estado seguem essa lógica. APIs como &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;ref&lt;/code&gt; e &lt;code&gt;reactive&lt;/code&gt; mudam a forma como interagimos com o estado, mas continuam fundamentadas em conceitos como observabilidade, reatividade, mutabilidade controlada e sincronização de dados.&lt;/p&gt;

&lt;p&gt;Quando saímos do universo dos frameworks e observamos o comportamento assíncrono das aplicações, a situação é semelhante.&lt;/p&gt;

&lt;p&gt;Promises e async/await tornaram a programação assíncrona mais intuitiva, mas continuam dependendo dos mesmos mecanismos que sempre existiram: Call Stack, Event Loop, Callback Queue, Microtasks e Macrotasks.&lt;/p&gt;

&lt;p&gt;Os frameworks evoluem.&lt;/p&gt;

&lt;p&gt;As APIs mudam.&lt;/p&gt;

&lt;p&gt;Mas os fundamentos permanecem.&lt;/p&gt;

&lt;p&gt;E é justamente por isso que me preocupa a forma como muitos desenvolvedores estão se relacionando com a Inteligência Artificial.&lt;/p&gt;

&lt;p&gt;A IA trouxe ganhos extraordinários de produtividade. Hoje conseguimos gerar componentes, hooks, composables, testes, documentações e até arquiteturas completas em poucos segundos. Isso é algo impressionante e extremamente valioso.&lt;/p&gt;

&lt;p&gt;O problema surge quando a velocidade passa a substituir o entendimento.&lt;/p&gt;

&lt;p&gt;Vejo cada vez mais desenvolvedores utilizando React, Vue, ferramentas de IA e até sistemas baseados em agentes sem compreender os conceitos fundamentais que sustentam essas tecnologias.&lt;/p&gt;

&lt;p&gt;Conceitos como closures, escopo léxico, Event Loop, hoisting, prototypes, gerenciamento de memória, garbage collection e diferenças entre passagem por valor e passagem por referência acabam ficando em segundo plano.&lt;/p&gt;

&lt;p&gt;E essa questão não se limita ao JavaScript.&lt;/p&gt;

&lt;p&gt;Também percebo uma perda gradual de interesse por temas como arquitetura de software, boas práticas, padrões de projeto, princípios SOLID, separação de responsabilidades e tomada de decisão técnica.&lt;/p&gt;

&lt;p&gt;A consequência não aparece imediatamente.&lt;/p&gt;

&lt;p&gt;As aplicações continuam funcionando.&lt;/p&gt;

&lt;p&gt;As tarefas continuam sendo entregues.&lt;/p&gt;

&lt;p&gt;Mas, ao longo do tempo, torna-se mais difícil questionar soluções, identificar problemas arquiteturais, compreender gargalos de performance ou adaptar sistemas para novos cenários.&lt;/p&gt;

&lt;p&gt;A IA pode acelerar a implementação.&lt;/p&gt;

&lt;p&gt;Pode sugerir soluções.&lt;/p&gt;

&lt;p&gt;Pode explicar conceitos.&lt;/p&gt;

&lt;p&gt;Mas ela não substitui o processo de construção do conhecimento.&lt;/p&gt;

&lt;p&gt;Conhecimento terceirizado não é conhecimento adquirido.&lt;/p&gt;

&lt;p&gt;Por isso acredito que a melhor forma de utilizar IA não é apenas pedir respostas, mas utilizá-la como uma ferramenta de aprendizado. Questionar decisões, explorar alternativas, entender trade-offs e aprofundar conceitos continua sendo fundamental para qualquer engenheiro de software.&lt;/p&gt;

&lt;p&gt;React é uma excelente ferramenta.&lt;/p&gt;

&lt;p&gt;Vue também.&lt;/p&gt;

&lt;p&gt;A Inteligência Artificial certamente é uma das maiores revoluções da nossa área.&lt;/p&gt;

&lt;p&gt;Mas nenhuma dessas tecnologias elimina a necessidade de compreender os fundamentos.&lt;/p&gt;

&lt;p&gt;Porque, no final das contas, frameworks mudam.&lt;/p&gt;

&lt;p&gt;Ferramentas mudam.&lt;/p&gt;

&lt;p&gt;Modelos de IA mudam.&lt;/p&gt;

&lt;p&gt;Mas os princípios que sustentam a engenharia de software continuam sendo a base sobre a qual tudo é construído.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Using AI in daily work goes far beyond copying and pasting prompts</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 19:42:49 +0000</pubDate>
      <link>https://dev.to/camilasrody/using-ai-in-daily-work-goes-far-beyond-copying-and-pasting-prompts-2aen</link>
      <guid>https://dev.to/camilasrody/using-ai-in-daily-work-goes-far-beyond-copying-and-pasting-prompts-2aen</guid>
      <description>&lt;p&gt;When most people talk about Artificial Intelligence, the conversation usually revolves around prompts. Which prompt produces better results? Which template generates better outputs? How can we write more detailed instructions to improve responses?&lt;/p&gt;

&lt;p&gt;While these discussions are useful, they only scratch the surface of what it actually means to build systems powered by AI.&lt;/p&gt;

&lt;p&gt;In my day-to-day work as a Front-End and Full-Stack developer, I've realized that the difference between casually using AI and engineering AI-driven solutions lies in understanding that the model itself is only one piece of the system.&lt;/p&gt;

&lt;p&gt;One of the most overlooked concepts in AI is that &lt;strong&gt;context has a cost&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every time we send documentation, business rules, examples, previous conversations, or requirements to an LLM, we are consuming tokens. The larger the context, the greater the computational cost, latency, and operational expense.&lt;/p&gt;

&lt;p&gt;For that reason, building intelligent systems is not simply about writing bigger or more sophisticated prompts.&lt;/p&gt;

&lt;p&gt;In fact, as applications grow, oversized prompts often become part of the problem rather than the solution.&lt;/p&gt;

&lt;p&gt;The challenge shifts from &lt;em&gt;"How do I fit everything into the prompt?"&lt;/em&gt; to &lt;em&gt;"How do I provide only the information that is actually needed?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is where concepts such as agents, skills, harnesses, memory, and retrieval become essential.&lt;br&gt;
Agents allow responsibilities to be separated into specialized units instead of relying on a single model to handle everything. Different agents can focus on planning, execution, validation, research, or decision-making, creating systems that are more predictable and easier to maintain.&lt;br&gt;
Skills (or tools) give those agents capabilities beyond text generation. They can query APIs, access databases, execute code, generate documents, perform calculations, or interact with external systems. In mature architectures, the LLM is not expected to know everything—it is expected to know when and how to use the right tools.&lt;br&gt;
Harnesses, in my opinion, are one of the most important and least discussed parts of modern AI systems.&lt;br&gt;
A harness acts as the orchestration layer. It manages context, routes requests, enforces business rules, coordinates agents, validates outputs, handles retries, and ensures consistency across workflows. Many AI projects fail not because of the model they chose, but because they lack a robust orchestration strategy.&lt;/p&gt;

&lt;p&gt;Context management is another critical piece.&lt;/p&gt;

&lt;p&gt;One of the biggest misconceptions in AI development is believing that more context automatically leads to better results. In reality, mature systems retrieve information on demand rather than keeping everything permanently inside the context window.&lt;br&gt;
This approach reduces costs, improves performance, minimizes context pollution, and allows models to focus on the information that actually matters.&lt;/p&gt;

&lt;p&gt;Observability and evaluation are equally important.&lt;/p&gt;

&lt;p&gt;How do you measure quality?&lt;/p&gt;

&lt;p&gt;How do you detect failures?&lt;/p&gt;

&lt;p&gt;How do you ensure consistency across thousands of interactions?&lt;/p&gt;

&lt;p&gt;How do you validate outputs before they impact end users?&lt;/p&gt;

&lt;p&gt;These questions are engineering challenges, not prompt engineering challenges.&lt;/p&gt;

&lt;p&gt;And that distinction matters.&lt;br&gt;
I believe we are entering a new phase of AI adoption.&lt;br&gt;
For a while, the competitive advantage came from Prompt Engineering.&lt;br&gt;
Today, the focus is increasingly shifting toward Context Engineering, Agent Engineering, and AI Systems Architecture.&lt;br&gt;
The conversation is no longer just about interacting with models.&lt;br&gt;
It is about designing systems around them.&lt;br&gt;
The LLM remains an incredibly important component, but it is no longer the entire product.&lt;br&gt;
The real advantage comes from how effectively you orchestrate context, memory, tools, agents, evaluation layers, and specialized models into a cohesive system.&lt;br&gt;
The engineers who will stand out over the next few years won't simply be the ones who know how to write better prompts.&lt;br&gt;
They will be the ones who understand how to design intelligent, scalable, and sustainable AI systems.&lt;/p&gt;

&lt;p&gt;The future of AI is not bigger prompts.&lt;/p&gt;

&lt;p&gt;It's better architecture.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Usar IA no dia a dia vai muito além de copiar e colar prompts</title>
      <dc:creator>Camila Rody</dc:creator>
      <pubDate>Tue, 02 Jun 2026 19:39:27 +0000</pubDate>
      <link>https://dev.to/camilasrody/usar-ia-no-dia-a-dia-vai-muito-alem-de-copiar-e-colar-prompts-1505</link>
      <guid>https://dev.to/camilasrody/usar-ia-no-dia-a-dia-vai-muito-alem-de-copiar-e-colar-prompts-1505</guid>
      <description>&lt;p&gt;Quando a maioria das pessoas fala sobre Inteligência Artificial, a conversa costuma girar em torno de prompts. Qual prompt gera melhores respostas? Qual template produz melhores resultados? Como escrever instruções mais detalhadas para obter saídas mais precisas?&lt;/p&gt;

&lt;p&gt;Embora essas discussões tenham seu valor, elas representam apenas uma pequena parte do que realmente significa construir soluções baseadas em IA.&lt;/p&gt;

&lt;p&gt;No meu dia a dia como desenvolvedora Front-end e Full Stack, percebo que a diferença entre usar IA de forma básica e utilizar IA como uma ferramenta de engenharia está justamente em entender que o modelo é apenas uma peça do sistema.&lt;/p&gt;

&lt;p&gt;Um dos conceitos mais negligenciados por quem está começando nessa área é que contexto possui custo.&lt;/p&gt;

&lt;p&gt;Toda vez que enviamos documentação, regras de negócio, exemplos, conversas anteriores ou requisitos para uma LLM, estamos consumindo recursos. Quanto maior o contexto, maior a quantidade de tokens processados. Isso impacta diretamente custo, latência e escalabilidade.&lt;/p&gt;

&lt;p&gt;Por esse motivo, arquitetar sistemas inteligentes não significa simplesmente criar prompts cada vez maiores.&lt;/p&gt;

&lt;p&gt;Na verdade, em muitos casos, o excesso de contexto se torna parte do problema.&lt;/p&gt;

&lt;p&gt;Conforme uma aplicação cresce, surge a necessidade de controlar quais informações realmente precisam estar disponíveis para o modelo em determinado momento. Nem tudo deve permanecer permanentemente dentro da janela de contexto.&lt;/p&gt;

&lt;p&gt;É nesse ponto que conceitos como agentes, skills, harnesses, memória e recuperação de contexto passam a ter um papel fundamental.&lt;/p&gt;

&lt;p&gt;Os agentes representam entidades responsáveis por executar tarefas específicas. Em vez de um único modelo tentando resolver tudo, diferentes agentes podem atuar com responsabilidades bem definidas, tornando o sistema mais previsível e organizado.&lt;/p&gt;

&lt;p&gt;As skills funcionam como capacidades especializadas que esses agentes podem utilizar. Consultar APIs, acessar bancos de dados, gerar documentos, executar análises ou recuperar informações são exemplos de comportamentos que não precisam ser resolvidos exclusivamente pela LLM.&lt;/p&gt;

&lt;p&gt;Já os harnesses são responsáveis por algo que considero uma das partes mais importantes da arquitetura: a orquestração.&lt;/p&gt;

&lt;p&gt;Eles controlam o fluxo de execução, gerenciam contexto, aplicam regras de negócio, definem quais ferramentas devem ser utilizadas, validam respostas e garantem que o comportamento do sistema permaneça consistente.&lt;/p&gt;

&lt;p&gt;Muitas vezes, quando um projeto baseado em IA apresenta problemas, a causa não está no modelo utilizado, mas na ausência de uma camada sólida de orquestração.&lt;/p&gt;

&lt;p&gt;Outro aspecto que considero essencial é o gerenciamento de contexto.&lt;/p&gt;

&lt;p&gt;Uma das maiores evoluções dos sistemas modernos de IA não está em aumentar indefinidamente a quantidade de informações enviadas para o modelo, mas em recuperar apenas o contexto necessário no momento adequado.&lt;/p&gt;

&lt;p&gt;Isso reduz custos, melhora desempenho e evita que informações irrelevantes disputem atenção dentro da janela de contexto.&lt;/p&gt;

&lt;p&gt;Da mesma forma, observabilidade e avaliação vêm se tornando componentes cada vez mais importantes.&lt;/p&gt;

&lt;p&gt;Como medir qualidade?&lt;/p&gt;

&lt;p&gt;Como identificar falhas?&lt;/p&gt;

&lt;p&gt;Como garantir consistência?&lt;/p&gt;

&lt;p&gt;Como validar respostas antes que elas impactem usuários finais?&lt;/p&gt;

&lt;p&gt;Essas perguntas fazem parte do trabalho de engenharia e não podem ser resolvidas apenas com prompts melhores.&lt;/p&gt;

&lt;p&gt;Por isso acredito que estamos entrando em uma nova fase da adoção de IA.&lt;/p&gt;

&lt;p&gt;Durante algum tempo, o diferencial estava em Prompt Engineering.&lt;/p&gt;

&lt;p&gt;Hoje, cada vez mais, o valor está em Context Engineering, Agent Engineering e AI Systems Architecture.&lt;/p&gt;

&lt;p&gt;A conversa deixou de ser apenas sobre como interagir com modelos e passou a ser sobre como construir sistemas completos ao redor deles.&lt;/p&gt;

&lt;p&gt;A LLM continua sendo extremamente importante, mas ela não é mais o produto inteiro.&lt;/p&gt;

&lt;p&gt;A verdadeira vantagem competitiva está na capacidade de orquestrar contexto, memória, ferramentas, agentes e processos de avaliação de forma eficiente, escalável e sustentável.&lt;/p&gt;

&lt;p&gt;Quem está estudando essa nova camada de engenharia provavelmente não está apenas aprendendo a usar IA.&lt;/p&gt;

&lt;p&gt;Está aprendendo a construir a próxima geração de sistemas de software.&lt;/p&gt;

&lt;p&gt;E vocês?&lt;/p&gt;

&lt;p&gt;Já trabalham com agentes, skills, harnesses e gerenciamento de contexto, ou ainda utilizam IA principalmente através de prompts tradicionais?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
