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



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:

BASH
npx create-react-app my-app

Resultados:

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:

BASH
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().

100%
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.

JSX
// ❌ 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>
  </>
)
▶ Experimente

(2) Inserção de expressões JavaScript no JSX

Use colchetes {} para incorporar qualquer expressão em JavaScript:

JSX
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>
▶ Experimente

(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

JSX
// ============================================
// 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>
▶ Experimente

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

BASH
# 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:

TEXT 📖 Somente leitura
  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

BASH
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

TSX
// ============================================
// 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>
)
▶ Experimente
TSX
// 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
CSS
/* 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:

JSX
// 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 })
▶ Experimente

▶ Exemplo 4: Renderização condicional em JSX combinada com listas

JSX
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} />
}
▶ Experimente

▶ Exemplo 5: Abrangente — Analisando o arquivo de entrada do projeto React

JSX 📖 Somente leitura
// 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
55 linhas de lógica (limite de 40, somente leitura)

❓ Perguntas Frequentes

P: Qual é a diferença entre npm create vite@latest e npx 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 pacote create-vite. npx create-vite também pode ser usado. Se você estiver usando o pnpm ou o yarn, pode usar pnpm create vite ou yarn create vite.

P: Por que não podemos usar class no JSX — por que temos que usar className? R: Porque class é uma palavra-chave reservada no JavaScript. Como o JSX é essencialmente JavaScript, não podemos usar class. Durante a renderização, o React converte automaticamente className no atributo HTML class. Da mesma forma, forhtmlFor.

P: Por que o atributo style no 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 atributo style.

P: Qual é a diferença entre os arquivos .tsx e .ts em um projeto? R: Os arquivos .tsx podem conter sintaxe JSX (ou seja, é possível escrever tags HTML em TypeScript), enquanto os arquivos .ts nã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


📝 Exercícios

  1. Exercício básico (Dificuldade ⭐): Crie um novo projeto em React + TypeScript usando o Vite e modifique App.tsx para exibir seu nome e uma breve apresentação pessoal.
  2. Exercício (Dificuldade: ⭐⭐): Crie uma variável chamada const isLoggedIn = true no componente App e use o operador ternário no JSX para exibir “Bem-vindo de volta” ou “Faça login”.
  3. 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.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%