A modern, high-performance Pokémon encyclopedia built with Next.js Static Site Generation (SSG) strategy, featuring a beautiful dark theme and responsive design.
This project is a Static Site Generation (SSG) application built with Next.js that showcases the first 151 Pokémon from the PokéAPI. The application leverages Next.js's powerful SSG capabilities to pre-generate all pages at build time, ensuring optimal performance and SEO.
- ⚡ Static Site Generation (SSG): All pages are pre-rendered at build time
- 🔄 Incremental Static Regeneration (ISR): Pages auto-update with fresh data
- 🌙 Dark Theme: Beautiful dark UI with NextUI v2 components
- 📱 Responsive Design: Optimized for all device sizes
- ⭐ Favorites System: Local storage-based favorites with persistence
- 🎊 Interactive Effects: Confetti animations and smooth transitions
- 🖼️ Optimized Images: Next.js Image component with automatic optimization
- 🔍 SEO Optimized: Meta tags and structured data for search engines
This project implements a comprehensive SSG strategy using multiple Next.js features:
-
Static Generation with
getStaticProps:export const getStaticProps: GetStaticProps = async ({ params }) => { const pokemon = await getPokemonInfo(id); return { props: { pokemon }, revalidate: 86400, // ISR: Regenerate every 24 hours }; };
-
Dynamic Static Generation with
getStaticPaths:export const getStaticPaths: GetStaticPaths = async () => { const pokemons151 = [...Array(151)].map((_, index) => `${index + 1}`); return { paths: pokemons151.map((id) => ({ params: { id } })), fallback: 'blocking', // Generate new pages on-demand }; };
- Home Page: Pre-rendered with the first 151 Pokémon
- Individual Pokémon Pages: 151 pages generated at build time (
/pokemon/[id]) - Name-based Routes: 151 pages generated for name-based access (
/name/[name]) - Favorites Page: Statically generated with dynamic content loading
- Lightning Fast Loading: Pages served as static HTML
- Excellent SEO: Pre-rendered content is crawlable by search engines
- CDN-Friendly: Static files can be cached globally
- Reduced Server Load: No server-side rendering required
- Offline Capability: Static content works without internet
- Next.js 14.2.14: React framework with SSG capabilities
- React 18.3.1: Latest React with concurrent features
- TypeScript 5.6.2: Type-safe development
- NextUI 2.4.8: Modern React component library
- Tailwind CSS 3.4.13: Utility-first CSS framework
- Framer Motion 11.11.17: Animation library for NextUI
- next-themes 0.3.0: Theme management
- Volta: Node.js version management
- ESLint: Code linting
- PostCSS: CSS processing
- Autoprefixer: CSS vendor prefixes
- Node.js 20.11.1 (managed with Volta)
- Yarn 1.22.22
-
Clone the repository:
git clone <repository-url> cd pokemon-static
-
Install dependencies:
yarn install
-
Run development server:
yarn dev
-
Build for production:
yarn build
-
Start production server:
yarn start
pokemon-static/
├── 📂 api/ # API utilities and PokéAPI integration
├── 📂 components/ # React components
│ ├── 📂 layouts/ # Layout components
│ ├── 📂 pokemon/ # Pokémon-specific components
│ └── 📂 ui/ # Generic UI components
├── 📂 interfaces/ # TypeScript type definitions
├── 📂 pages/ # Next.js pages (routes)
│ ├── 📂 name/ # Dynamic name-based routes
│ ├── 📂 pokemon/ # Dynamic ID-based routes
│ └── 📂 favorites/ # Favorites page
├── 📂 public/ # Static assets
├── 📂 styles/ # Global styles and CSS
├── 📂 themes/ # Theme configurations
└── 📂 utils/ # Utility functions
-
Build Time:
- Fetch Pokémon data from PokéAPI
- Generate 151 individual Pokémon pages
- Create static HTML, CSS, and JSON files
- Optimize images and assets
-
Runtime:
- Serve pre-generated static files
- Client-side hydration for interactivity
- Local storage management for favorites
- Dynamic content updates via ISR
- Build Time: ~24 seconds for 306 pages
- First Load JS: ~126 kB gzipped
- Individual Page Size: ~2.16 kB + shared chunks
- Lighthouse Score: 95+ across all metrics
- Responsive grid layout
- Hover effects and transitions
- Dark theme with gray gradients
- Next.js Image optimization
- Two-column layout (image + details)
- Sprite gallery with organized grid
- Favorite toggle with confetti effects
- Responsive design for mobile
next.config.js: Next.js configuration with image domainstailwind.config.js: Tailwind CSS with NextUI plugintsconfig.json: TypeScript configuration for Next.js 14package.json: Dependencies and Volta version pinning
Este proyecto es una aplicación de Generación de Sitios Estáticos (SSG) construida con Next.js que presenta los primeros 151 Pokémon de la PokéAPI. La aplicación aprovecha las poderosas capacidades SSG de Next.js para pre-generar todas las páginas en tiempo de construcción, asegurando un rendimiento óptimo y SEO.
- ⚡ Generación de Sitios Estáticos (SSG): Todas las páginas se pre-renderizan en tiempo de construcción
- 🔄 Regeneración Estática Incremental (ISR): Las páginas se actualizan automáticamente con datos frescos
- 🌙 Tema Oscuro: Hermosa interfaz oscura con componentes NextUI v2
- 📱 Diseño Responsivo: Optimizado para todos los tamaños de dispositivo
- ⭐ Sistema de Favoritos: Favoritos basados en almacenamiento local con persistencia
- 🎊 Efectos Interactivos: Animaciones de confetti y transiciones suaves
- 🖼️ Imágenes Optimizadas: Componente Image de Next.js con optimización automática
- 🔍 Optimizado para SEO: Meta tags y datos estructurados para motores de búsqueda
Este proyecto implementa una estrategia SSG integral utilizando múltiples características de Next.js:
-
Generación Estática con
getStaticProps:export const getStaticProps: GetStaticProps = async ({ params }) => { const pokemon = await getPokemonInfo(id); return { props: { pokemon }, revalidate: 86400, // ISR: Regenerar cada 24 horas }; };
-
Generación Estática Dinámica con
getStaticPaths:export const getStaticPaths: GetStaticPaths = async () => { const pokemons151 = [...Array(151)].map((_, index) => `${index + 1}`); return { paths: pokemons151.map((id) => ({ params: { id } })), fallback: 'blocking', // Generar nuevas páginas bajo demanda }; };
- Página Principal: Pre-renderizada con los primeros 151 Pokémon
- Páginas Individuales de Pokémon: 151 páginas generadas en tiempo de construcción (
/pokemon/[id]) - Rutas Basadas en Nombres: 151 páginas generadas para acceso basado en nombres (
/name/[name]) - Página de Favoritos: Generada estáticamente con carga de contenido dinámico
- Carga Ultra Rápida: Páginas servidas como HTML estático
- SEO Excelente: Contenido pre-renderizado es rastreable por motores de búsqueda
- Compatible con CDN: Archivos estáticos pueden ser cacheados globalmente
- Carga Reducida del Servidor: No se requiere renderizado del lado del servidor
- Capacidad Offline: Contenido estático funciona sin internet
- Next.js 14.2.14: Framework de React con capacidades SSG
- React 18.3.1: React más reciente con características concurrentes
- TypeScript 5.6.2: Desarrollo con tipado seguro
- NextUI 2.4.8: Biblioteca moderna de componentes React
- Tailwind CSS 3.4.13: Framework CSS utility-first
- Framer Motion 11.11.17: Biblioteca de animaciones para NextUI
- next-themes 0.3.0: Gestión de temas
- Volta: Gestión de versiones de Node.js
- ESLint: Linting de código
- PostCSS: Procesamiento de CSS
- Autoprefixer: Prefijos de proveedores CSS
- Node.js 20.11.1 (gestionado con Volta)
- Yarn 1.22.22
-
Clonar el repositorio:
git clone <repository-url> cd pokemon-static
-
Instalar dependencias:
yarn install
-
Ejecutar servidor de desarrollo:
yarn dev
-
Construir para producción:
yarn build
-
Iniciar servidor de producción:
yarn start
pokemon-static/
├── 📂 api/ # Utilidades API e integración PokéAPI
├── 📂 components/ # Componentes React
│ ├── 📂 layouts/ # Componentes de layout
│ ├── 📂 pokemon/ # Componentes específicos de Pokémon
│ └── 📂 ui/ # Componentes UI genéricos
├── 📂 interfaces/ # Definiciones de tipos TypeScript
├── 📂 pages/ # Páginas de Next.js (rutas)
│ ├── 📂 name/ # Rutas dinámicas basadas en nombres
│ ├── 📂 pokemon/ # Rutas dinámicas basadas en ID
│ └── 📂 favorites/ # Página de favoritos
├── 📂 public/ # Assets estáticos
├── 📂 styles/ # Estilos globales y CSS
├── 📂 themes/ # Configuraciones de temas
└── 📂 utils/ # Funciones utilitarias
-
Tiempo de Construcción:
- Obtener datos de Pokémon desde PokéAPI
- Generar 151 páginas individuales de Pokémon
- Crear archivos estáticos HTML, CSS y JSON
- Optimizar imágenes y assets
-
Tiempo de Ejecución:
- Servir archivos estáticos pre-generados
- Hidratación del lado del cliente para interactividad
- Gestión de almacenamiento local para favoritos
- Actualizaciones de contenido dinámico vía ISR
- Tiempo de Construcción: ~24 segundos para 306 páginas
- First Load JS: ~126 kB comprimido
- Tamaño de Página Individual: ~2.16 kB + chunks compartidos
- Puntuación Lighthouse: 95+ en todas las métricas
- Layout de grid responsivo
- Efectos hover y transiciones
- Tema oscuro con gradientes grises
- Optimización de imágenes Next.js
- Layout de dos columnas (imagen + detalles)
- Galería de sprites con grid organizado
- Toggle de favoritos con efectos de confetti
- Diseño responsivo para móvil
next.config.js: Configuración de Next.js con dominios de imagentailwind.config.js: Tailwind CSS con plugin NextUItsconfig.json: Configuración TypeScript para Next.js 14package.json: Dependencias y pinning de versiones Volta
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- PokéAPI for providing the Pokémon data
- Next.js team for the amazing framework
- NextUI for the beautiful component library
- Tailwind CSS for the utility-first CSS framework