Proyecto de blog React

En este capítulo empezarás desde cero, crearás un proyecto de blog React con Vite y entenderás la sintaxis de JSX y la estructura del proyecto.


Preparación del entorno

Antes de empezar, asegúrate de tener Node.js instalado en tu equipo (se recomienda v16 o superior).

Node.js es el entorno de ejecución de JavaScript, y npm es su gestor de paquetes incorporado.

Comprueba si Node.js está instalado

$ node -v
v20.10.0

Si se muestra un número de versión, significa que ya está instalado.

Si no, ve anodejs.orgDescarga la versión LTS e instálala.


Crear un proyecto React

Vite es una de las herramientas de compilación frontend más rápidas actualmente y tiene soporte nativo para React.

En la terminal, entra en el directorio donde quieres almacenar el proyecto y ejecuta:

$ npm create vite@latest blog-app -- --template react

Este comando le indica a Vite: crea un proyecto llamado blog-app utilizando la plantilla de React.

Entra en el directorio del proyecto, instala las dependencias e inicia el servidor de desarrollo:

$ cd blog-app
$ npm install
$ npm run dev

El navegador abrirá automáticamente http://localhost:5173; si ves la página de bienvenida predeterminada de Vite + React, significa que el proyecto se ha iniciado correctamente.

Si al iniciar aparece un error indicando que faltan dependencias, puedes intentar ejecutarnpm instally luego volver a ejecutarlo.


Explicación de la estructura de directorios del proyecto

Abre la carpeta blog-app y verás la siguiente estructura:

blog-app/
├── index.html              # 入口 HTML 文件
├── package.json            # 项目配置与依赖列表
├── vite.config.js          # Vite 构建工具配置
├── public/                 # 不经过编译的静态资源
├── src/
│   ├── main.jsx            # JS 入口,将 React 组件挂载到 DOM
│   ├── App.jsx             # 根组件,所有页面的外壳
│   ├── App.css             # App 组件的样式
│   ├── index.css           # 全局样式
│   └── assets/             # 需要编译的静态资源(图片等)

Funciones de los archivos principales

index.html— El archivo de entrada al que accede el navegador.

Dentro hay un<div id="root"></div>, y la aplicación React se monta en este div.

src/main.jsx— El archivo de arranque de la aplicación React.

Se encarga de encontrar el#rootelemento, y luego usacreateRoottomar<App />componente para renderizarlo dentro.

Ejemplo

// Ruta del archivo: src/main.jsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import './index.css'

// Encuentra el <div id="root"></div> en el HTML
// Usa createRoot para crear un nodo raíz de React y luego renderiza <App /> dentro
ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
)

src/App.jsx— Componente raíz.

Es el contenedor más externo de todas las páginas; el JSX que devuelve se renderiza en la página.

<React.StrictMode>Es el modo estricto de React, solo tiene efecto en el entorno de desarrollo. Realiza comprobaciones adicionales en los componentes (como renderizado duplicado) para ayudarte a detectar problemas potenciales. Se ignora automáticamente en la compilación de producción.


¿Qué es JSX?

JSXEs una extensión de sintaxis de JavaScript que te permite escribir código similar a HTML en JS.

Un componente de React es esencialmente una función que devuelve JSX.

Diferencias clave entre JSX y HTML

EscenarioHTMLJSX
Atributo classclass="container"className="container"
Etiquetas de autocierre<img src="....html"><img src="....html" />
Incrustar expresiones de JSNo soportado<h1>{title}</h1>
Atributo stylestyle="color: red"style={{ color: 'red' }}
Comentarios<!-- comentario -->{/* comentario */}
Enlace de eventosonclick="fn()"onClick={fn}

¿Por qué se usaclassNameen lugar declass? Porque JSX es, en esencia, JavaScript, yclasses una palabra reservada de JS. De la misma manera,forse cambia ahtmlFor。

Ejemplo

// JSX es este código similar a HTML después de return
function Greeting() {
  const name = 'EJEMPLO'
  const isLoggedIn = true

  return (
    <div className="greeting">
      {/* Comentario JSX: dentro de las llaves se coloca cualquier expresión JS */}
      <h1>Hello, {name}!</h1>
      <p>Hora actual:{new Date().toLocaleDateString()}</p>
      {isLoggedIn && <p>¡Bienvenido de nuevo!</p>}
    </div>
  )
}

Recuerda la regla clave:En JSX, dentro de las llaves puedes poner cualquier expresión JS— variables, llamadas a funciones, operaciones ternarias, map de arrays, todo vale.


Componente React = función

La esencia de un componente funcional de React es:Una función que recibe props como parámetro y devuelve un fragmento de JSX.。

Ejemplo

// Definir un componente: es una función que devuelve JSX
// El nombre del componente debe comenzar con letra mayúscula
function BlogHeader() {
  return (
    <header>
      <h1>EJEMPLO Blog</h1>
    </header>
  )
}

// Usar el componente: escríbelo como una etiqueta HTML, puede ser autocierre o por pares
function App() {
  return (
    <div>
      <BlogHeader />
      <main>
        <p>El contenido del blog se mostrará aquí</p>
      </main>
    </div>
  )
}

export default App

El nombre del componente debecomenzar con mayúscula. Si comienza con minúscula, React lo tratará como una etiqueta HTML normal (div, span, etc.); solo si comienza con mayúscula se tratará como un componente personalizado.


Manos a la obra: vacía la plantilla y escribe el esqueleto del blog

Borra el contenido de App.jsx y App.css generados por defecto y sustitúyelo por la estructura básica del blog.

Ejemplo

// Ruta del archivo: src/App.jsx
import './App.css'

function App() {
  return (
    <div className="app">
      {/* Barra de navegación superior */}
      <header className="navbar">
        <h1 className="logo">EJEMPLO Blog</h1>
        <nav>
          <a href="/">Inicio</a>
          <a href="#">Acerca de</a>
        </nav>
      </header>

      {/* Área de contenido principal */}
      <main className="container">
        <p>El contenido del blog se mostrará aquí</p>
      </main>

      {/* Pie de página */}
      <footer className="footer">
        <p>© 2024 EJEMPLO Blog. Powered by React.</p>
      </footer>
    </div>
  )
}

export default App

Ejemplo

/* Ruta del archivo: src/App.css */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  background: #f5f5f5;
  color: #333;
}

/* Barra de navegación */
.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 40px;
  background: #fff;
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

.logo {
  font-size: 24px;
  color: #61dafb;
}

.navbar nav a {
  margin-left: 20px;
  text-decoration: none;
  color: #333;
}

/* Área de contenido principal */
.container {
  max-width: 960px;
  margin: 40px auto;
  padding: 0 20px;
}

/* Pie de página */
.footer {
  text-align: center;
  padding: 20px;
  color: #999;
  border-top: 1px solid #eee;
}

Después de guardar, el navegador se actualizará automáticamente y verás un esqueleto de blog limpio: barra de navegación superior + área de contenido central + pie de página inferior.


Resumen del capítulo

En este capítulo has completado tres cosas: has creado un proyecto React con Vite, has entendido las diferencias clave entre JSX y HTML, y has escrito el esqueleto JSX básico del blog.

Conclusión clave: un componente React es una función que devuelve JSX, y en JSX las llaves pueden contener cualquier expresión JS.

Otros recursos