React: Configurando o ambiente e o JSX
Última atualização: 2026-08-26
Escrever código React é como reformar uma casa — o Vite é a equipe de construção (ele ajuda a montar o andaime e o servidor de desenvolvimento), e o JSX é a planta (uma sintaxe para escrever HTML dentro do JavaScript). Nesta lição, você vai criar seu primeiro projeto React do zero.
1. O que você vai aprender
- Crie rapidamente um projeto React usando o Vite
- Estrutura do diretório do projeto e a finalidade de cada arquivo
- Regras de sintaxe do JSX (expressões, condições, listas)
- Principais diferenças entre JSX e HTML
- Como instalar e usar o React DevTools
2. A história real de um desenvolvedor iniciante
(1) Desafio: Levou um dia inteiro para configurar o ambiente
Bob acabou de aprender JavaScript e quer experimentar o React. Ele procurou tutoriais na internet, e algumas pessoas recomendaram o Create React App, outras recomendaram o Vite e outras ainda recomendaram o Next.js. Ele escolheu o CRA ao acaso e iniciou a instalação:
npx create-react-app my-app
Resultados:
- A instalação levou 8 minutos (com o download de mais de 200 MB de dependências)
- Demorou 30 segundos para iniciar o servidor de desenvolvimento
- O diretório do projeto contém mais de 35.000 arquivos (node_modules)
- A alteração de uma única linha de código faz com que a página demore 2 a 3 segundos para ser atualizada
Bob estava frustrado: “Ainda nem comecei a escrever código e já perdi uma hora.”
(2) Solução usando Vite e React
Crie o mesmo projeto usando o Vite:
npm create vite@latest my-app -- --template react-ts
cd my-app
npm install
npm run dev
| Comparação | CRA | Vite |
|---|---|---|
| Tempo de instalação | ~8 minutos | ~30 segundos |
| Tempo de inicialização | ~30 segundos | < 1 segundo |
| Substituição de Módulo a Quente (HMR) | 2–3 segundos | <50 ms |
| Tempo de compilação | ~60 segundos | ~10 segundos |
| tamanho do node_modules | ~200 MB | ~80 MB |
Vantagens: Bob levou apenas 3 minutos desde a instalação até ver “Hello World”, e as atualizações em tempo real são tão rápidas que você mal percebe a espera.
3. Regras básicas do JSX
JSX significa JavaScript XML. Não é HTML, mas sim uma extensão de sintaxe para JavaScript. Cada expressão JSX é, em última instância, compilada em uma chamada React.createElement().
graph LR
A[JSX Code] --> B[Babel Compilation]
B --> C[React.createElement]
C --> D[Virtual DOM Object]
D --> E[True DOM]
style A fill:#61dafb,color:#000
style C fill:#ff6b6b,color:#fff
(1) Regra do elemento único
As expressões JSX devem ter um elemento raiz. Elas não podem retornar dois elementos irmãos lado a lado.
// ❌ Error:No root element
return (
<h1>Title</h1>
<p>Paragraph</p>
)
// ✅ Correct:Use one <div> Package
return (
<div>
<h1>Title</h1>
<p>Paragraph</p>
</div>
)
// ✅ You can also use React Fragment(<></>),Does not incur additional DOM
return (
<>
<h1>Title</h1>
<p>Paragraph</p>
</>
)
(2) Inserção de expressões JavaScript no JSX
Use colchetes {} para incorporar qualquer expressão em JavaScript:
const name = 'Alice'
const age = 28
const colors = ['red', 'green', 'blue']
// Variable
<h1>Hello, {name}!</h1>
// Expression Evaluation
<p>Next year {age + 1} years old</p>
// Ternary Operator
<span>{age >= 18 ? 'Adulthood' : 'Minor'}</span>
// Function Call
<p>Today's Date:{new Date().toLocaleDateString()}</p>
// Array Length
<p>Total {colors.length} A Color</p>
(3) Tabela de referência rápida: diferenças entre JSX e HTML
| Recurso | HTML | JSX |
|---|---|---|
| Nome da classe | class="box" |
className="box" (class é uma palavra reservada do JavaScript) |
| Atributo da tag | for="input" |
htmlFor="input" (pois é uma palavra reservada do JavaScript) |
| Estilos embutidos | style="color:red" |
style={{ color: 'red' }} (sintaxe de objeto) |
| Propriedade booleana | disabled |
disabled={true} ou disabled |
| Tags de fechamento automático | <br> <img> |
Devem ser fechadas: <br /> <img /> |
| Observação | <!-- comment --> |
{/* comment */} |
| Vinculação de eventos | onclick="handle()" |
onClick={handle} |
| Nome da propriedade CSS | font-size (hífen) |
fontSize (camelCase) |
▶ Exemplo: Comparação entre JSX e HTML
// ============================================
// Example:The Same Card,HTML vs JSX Comparison of Writing Styles
// ============================================
// ---- HTML Writing Style ----
<div class="card" style="background-color: #f0f0f0; padding: 20px;">
<!-- TODO: replace with actual user avatar image -->
<img src="https://i.pravatar.cc/80" alt="Avatar" class="avatar">
<label for="name">Name:</label>
<input type="text" id="name" disabled>
<!-- This is a comment. -->
<button onclick="handleClick()">Click</button>
</div>
// ---- JSX Writing Style ----
<div className="card" style={{ backgroundColor: '#f0f0f0', padding: '20px' }}>
<!-- TODO: replace with actual user avatar image -->
<img src="https://i.pravatar.cc/80" alt="Avatar" className="avatar" />
<label htmlFor="name">Name:</label>
<input type="text" id="name" disabled={true} />
{/* This is a comment. */}
<button onClick={handleClick}>Click</button>
</div>
4. Criando um projeto React com o Vite
(1) Requisitos ambientais
| Ferramenta | Requisitos de versão | Comando de verificação | Método de instalação |
|---|---|---|---|
| Node.js | ≥ 18.0 | node -v |
nodejs.org |
| npm | ≥ 9.0 | npm -v |
Instalado automaticamente com o Node.js |
| Editor | Qualquer | — | Recomendado: VS Code |
(2) Criar um projeto e iniciá-lo
# 1. Create a Project(react-ts = React + TypeScript Template)
npm create vite@latest my-react-app -- --template react-ts
# 2. Go to the project directory
cd my-react-app
# 3. Install Dependencies
npm install
# 4. Start the development server
npm run dev
Saída:
VITE v5.x ready in 320ms
➜ Local: http://localhost:5173/
➜ Network: http://192.168.1.100:5173/
Abra http://localhost:5173/ e você deverá ver a página de boas-vindas padrão do Vite + React.
(3) Estrutura do diretório do projeto
my-react-app/
├── index.html # Entrance HTML Documents(Vite Parsing Entry Point)
├── package.json # Project Configuration and Dependencies
├── vite.config.ts # Vite Profile
├── tsconfig.json # TypeScript Layout
├── tsconfig.app.json # Applications TS Layout
├── tsconfig.node.json # Node.js Environment TS Layout
├── public/ # Static Resources(Will not be compiled)
│ └── vite.svg
└── src/ # Source Code Directory
├── main.tsx # App Entry Point(Render the root component)
├── App.tsx # Root Component
├── App.css # Root Component Styles
├── index.css # Global Styles
└── assets/ # Resource Files(will be compiled)
└── react.svg
| Arquivo | Finalidade |
|---|---|
index.html |
Ponto de entrada da página; o Vite começa a analisar aqui |
src/main.tsx Entrada em JavaScript, renderizar <App /> como #root |
|
src/App.tsx |
Componente raiz; todos os outros componentes começam aqui |
vite.config.ts |
Configuração do Vite (aliases, proxies, plug-ins, etc.) |
▶ Exemplo: Criando o componente React mais simples
// ============================================
// Example:from main.tsx The Complete Process for Navigating to the Page
// ============================================
// src/main.tsx —— App Entry Point
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.tsx'
import './index.css'
createRoot(document.getElementById('root')!).render(
<StrictMode>
<App />
</StrictMode>
)
// src/App.tsx —— Root Component
function App() {
return (
<div>
<h1>Hello, React!</h1>
<p>This is my first one React Applications 🎉</p>
</div>
)
}
export default App
/* src/index.css —— Global Styles */
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 50px auto;
text-align: center;
}
5. React DevTools
O React DevTools é uma ferramenta essencial para depurar aplicativos React, permitindo que você visualize a árvore de componentes, as props, o estado e o desempenho.
| Método de instalação | Procedimento |
|---|---|
| Extensão do Chrome | Pesquise “React Developer Tools” na Chrome Web Store |
| Extensão do Firefox | Pesquisar “React Developer Tools” nos complementos do Firefox |
| Aplicativo independente | npx react-devtools |
▶ Exemplo: Visualizando um componente usando o DevTools
Após a instalação, abra as Ferramentas do Desenvolvedor (F12) e você verá duas novas guias: Componentes e Profiler:
// in DevTools You can view these components in real time here Props and State
function App() {
const [count, setCount] = React.useState(0)
return (
<div>
<Header title="Counter" />
<Counter count={count} onIncrement={() => setCount(c => c + 1)} />
<Footer year={2026} />
</div>
)
}
// Components The panel will display:
// ├── App
// │ ├── Header (props: { title: "Counter" })
// │ ├── Counter (props: { count: 0, onIncrement: fn })
// │ └── Footer (props: { year: 2026 })
▶ Exemplo 4: Renderização condicional em JSX combinada com listas
function ProductCatalog({ products, isLoading, error }) {
if (isLoading) return <p style={{ textAlign: 'center', padding: 40 }}>Loading products...</p>
if (error) return <p style={{ color: '#ff4d4f', textAlign: 'center' }}>Error: {error}</p>
if (products.length === 0) return <p style={{ textAlign: 'center', color: '#999' }}>No products found</p>
return (
<div style={{ maxWidth: 600, margin: '0 auto' }}>
<h2>Product Catalog ({products.length})</h2>
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(180px, 1fr))', gap: 16 }}>
{products.map(product => (
<div key={product.id} style={{ border: '1px solid #eee', borderRadius: 8, padding: 12 }}>
<h4 style={{ margin: '0 0 8px' }}>{product.name}</h4>
<p style={{ color: '#ff4d4f', fontWeight: 'bold', margin: '0 0 4px' }}>${product.price}</p>
{product.inStock ? (
<span style={{ color: '#52c41a', fontSize: 12 }}>In Stock</span>
) : (
<span style={{ color: '#999', fontSize: 12 }}>Out of Stock</span>
)}
</div>
))}
</div>
</div>
)
}
function CatalogPage() {
const sampleProducts = [
{ id: 1, name: 'Keyboard', price: 79, inStock: true },
{ id: 2, name: 'Mouse', price: 49, inStock: true },
{ id: 3, name: 'Monitor', price: 399, inStock: false },
]
return <ProductCatalog products={sampleProducts} isLoading={false} error={null} />
}
▶ Exemplo 5: Abrangente — Analisando o arquivo de entrada do projeto React
// package.json Key Dependencies
// {
// "dependencies": { "react": "^18.3", "react-dom": "^18.3" },
// "devDependencies": { "vite": "^5.0", "@types/react": "^18.3", "@types/react-dom": "^18.3" }
// }
// src/main.jsx - App Entry Point
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import './index.css'
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
)
// src/App.jsx - Root Component
import { useState } from 'react'
function App() {
const [currentPage, setCurrentPage] = useState('home')
return (
<div style={{ fontFamily: 'sans-serif', maxWidth: 800, margin: '0 auto', padding: 20 }}>
<nav style={{ display: 'flex', gap: 16, marginBottom: 24, borderBottom: '2px solid #1890ff', paddingBottom: 12 }}>
{['home', 'about', 'contact'].map(page => (
<button key={page} onClick={() => setCurrentPage(page)}
style={{
padding: '8px 16px', border: 'none', borderRadius: 4, cursor: 'pointer',
background: currentPage === page ? '#1890ff' : '#f0f0f0',
color: currentPage === page ? 'white' : '#333',
}}>
{page.charAt(0).toUpperCase() + page.slice(1)}
</button>
))}
</nav>
<main>
{currentPage === 'home' && (
<div>
<h1>Welcome to React</h1>
<p>This is a minimal React app with Vite. Edit src/App.jsx and save to reload.</p>
<p>Current time: {new Date().toLocaleTimeString()}</p>
</div>
)}
{currentPage === 'about' && (
<div>
<h2>About</h2>
<p>Built with React 18 + Vite for fast development and HMR.</p>
</div>
)}
{currentPage === 'contact' && (
<div>
<h2>Contact</h2>
<p>Email us at hello@example.com</p>
</div>
)}
</main>
<footer style={{ marginTop: 40, paddingTop: 12, borderTop: '1px solid #eee', color: '#999', fontSize: 13 }}>
© 2026 React Tutorial. Built with Vite + React 18.
</footer>
</div>
)
}
export default App
❓ Perguntas Frequentes
P: Qual é a diferença entre
npm create vite@latestenpx create-vite? R: Elas têm exatamente a mesma funcionalidade.npm create vite@latesté a sintaxe recomendada para o npm (introduzida no npm v7+), que localiza e executa automaticamente a versão mais recente do pacotecreate-vite.npx create-vitetambém pode ser usado. Se você estiver usando o pnpm ou o yarn, pode usarpnpm create viteouyarn create vite.
P: Por que não podemos usar
classno JSX — por que temos que usarclassName? R: Porqueclassé uma palavra-chave reservada no JavaScript. Como o JSX é essencialmente JavaScript, não podemos usarclass. Durante a renderização, o React converte automaticamenteclassNameno atributo HTMLclass. Da mesma forma,for→htmlFor.
P: Por que o atributo
styleno JSX usa chaves duplas{{}}? R: As chaves externas indicam “uma expressão JavaScript incorporada no JSX”, enquanto as chaves internas indicam “este é um objeto JavaScript”. Portanto,style={{ color: 'red' }}significa: passar um objeto JS{ color: 'red' }como valor do atributostyle.
P: Qual é a diferença entre os arquivos .tsx e .ts em um projeto? R: Os arquivos
.tsxpodem conter sintaxe JSX (ou seja, é possível escrever tags HTML em TypeScript), enquanto os arquivos.tsnão podem. Todos os arquivos que contêm componentes React devem ter a extensão.tsx. Arquivos de lógica pura (como funções utilitárias e definições de tipos) podem usar a extensão.ts.
P: Qual é a diferença entre o Vite e o Webpack? Por que o tutorial escolheu o Vite? R: O Vite utiliza ES Modules nativos para seu servidor de desenvolvimento, permitindo inicializações a frio na ordem de milissegundos; o Webpack precisa empacotar toda a aplicação antes de iniciar, portanto, quanto maior o projeto, mais lento ele fica. O HMR (Hot Module Replacement) do Vite também é mais rápido, pois precisa substituir apenas os módulos modificados. Para compilações de produção, ambos usam o Rollup/esbuild para o empacotamento, portanto não há muita diferença no desempenho. O Vite foi escolhido para este tutorial porque oferece uma melhor experiência de desenvolvimento e representa uma nova tendência na comunidade React.
📖 Resumo
- Use
npm create vite@latest my-app -- --template react-tspara configurar rapidamente um projeto em React + TypeScript - JSX não é HTML, mas uma extensão da sintaxe do JavaScript: use
classNameem vez declasse use{}para incorporar expressões - Toda expressão JSX deve ter um elemento raiz (que pode ser um fragmento
<></>) - O Vite é mais de 10 vezes mais rápido que o CRA; este tutorial utiliza o Vite do início ao fim.
- O React DevTools é uma ferramenta essencial de depuração que permite visualizar a árvore de componentes e o estado
📝 Exercícios
- Exercício básico (Dificuldade ⭐): Crie um novo projeto em React + TypeScript usando o Vite e modifique
App.tsxpara exibir seu nome e uma breve apresentação pessoal. - Exercício (Dificuldade: ⭐⭐): Crie uma variável chamada
const isLoggedIn = trueno componente App e use o operador ternário no JSX para exibir “Bem-vindo de volta” ou “Faça login”. - Investigação (Dificuldade: ⭐): Abra o painel “Componentes” no React DevTools, visualize a estrutura em árvore dos componentes do modelo padrão do Vite e faça uma captura de tela para salvá-la.