bundle-size
$
npx mdskill add 686f6c61/alfred-dev/bundle-sizeReduce frontend bundle size by analyzing and optimizing code.
- Identify oversized bundles that slow downloads and increase data costs.
- Integrates with webpack, Vite, and Rollup bundlers for analysis.
- Uses tree shaking, lazy loading, and visual maps to propose fixes.
- Delivers actionable metrics comparing baseline measurements before and after optimization.
SKILL.md
.github/skills/bundle-sizeView on GitHub ↗
---
name: bundle-size
description: "Analizar y reducir el tamaño de bundles frontend. Activar cuando el bundle sea grande, se quiera reducir tamaño, aplicar tree shaking, configurar lazy loading, usar webpack analyzer o analizar el peso de la aplicacion."
---
# Análisis y reducción de bundle size
## Resumen
Este skill guía el proceso de analizar y reducir el tamaño de los bundles de una aplicación frontend. Cada kilobyte adicional en el bundle se traduce en mayor tiempo de descarga, más consumo de datos del usuario y mayor tiempo hasta la interactividad. En conexiones lentas o dispositivos modestos, un bundle sobredimensionado puede hacer que la aplicación sea inutilizable.
El proceso parte del análisis visual del bundle actual, identifica las causas del tamaño excesivo y propone soluciones concretas que se validan midiendo antes y después.
## Proceso
1. **Medir el tamaño actual del bundle.** Antes de optimizar, registrar el estado de partida como baseline:
- Tamaño total del bundle (sin comprimir y con gzip/brotli).
- Tamaño de cada chunk o archivo generado por el bundler.
- Tamaño del JavaScript, CSS e imágenes por separado.
- Tiempo de carga en Lighthouse con throttling de red simulando 3G.
2. **Generar el mapa visual del bundle.** Usar la herramienta correspondiente al bundler del proyecto:
- **Webpack:** `webpack-bundle-analyzer` genera un treemap interactivo del contenido del bundle.
- **Vite/Rollup:** `rollup-plugin-visualizer` con formato treemap o sunburst.
- **Independiente del bundler:** `source-map-explorer` analiza los source maps para mostrar qué ocupa espacio.
Estas visualizaciones revelan de un vistazo qué dependencias y módulos dominan el tamaño.
3. **Identificar los problemas habituales.** Buscar estos patrones en el mapa visual:
- **Dependencias duplicadas:** la misma librería aparece varias veces con versiones diferentes (por ejemplo, dos versiones de `lodash` por subdependencias incompatibles).
- **Imports completos de librerías grandes:** se importa toda la librería cuando solo se usa una función (`import _ from 'lodash'` en lugar de `import groupBy from 'lodash/groupBy'`).
- **Código muerto:** módulos importados pero nunca referenciados en la ejecución real.
- **Polyfills innecesarios:** polyfills para navegadores que ya no se soportan.
- **Assets no optimizados:** imágenes o fuentes incluidas en el bundle en lugar de cargarse como recursos estáticos.
- **Librerías pesadas con alternativas ligeras:** `moment.js` (300KB+) cuando `date-fns` o `dayjs` cubren el mismo caso de uso.
4. **Aplicar las soluciones.** Para cada problema identificado, actuar con la técnica adecuada:
- **Tree-shaking:** asegurar que las dependencias usan módulos ES (ESM). Verificar que el bundler no desactiva tree-shaking por configuración incorrecta de `sideEffects` en `package.json`.
- **Code splitting:** dividir el bundle en chunks que se cargan bajo demanda. Rutas diferentes = chunks diferentes. Componentes pesados que no son visibles inicialmente = lazy loading con `React.lazy()`, `defineAsyncComponent()` o `import()` dinámico.
- **Lazy loading:** cargar componentes, rutas y módulos solo cuando el usuario los necesita. Implementar `Suspense` o equivalente para gestionar el estado de carga.
- **Alternativas ligeras:** sustituir dependencias pesadas por alternativas que cubran el caso de uso real:
| Librería pesada | Alternativa ligera | Reducción aproximada |
|-----------------|-------------------|---------------------|
| moment.js | dayjs, date-fns | ~95% |
| lodash (completo) | lodash-es (cherry-pick) | ~80% |
| axios | fetch nativo + wrapper | ~100% (elimina dep) |
| numeral.js | Intl.NumberFormat | ~100% (nativo) |
- **Externalizar dependencias grandes:** si una librería se usa en todas las páginas (React, Vue), servirla desde CDN o como chunk separado con caché larga.
- **Comprimir assets:** configurar gzip o brotli en el servidor. Brotli ofrece entre un 15-25% mejor ratio que gzip.
5. **Medir el resultado y comparar.** Repetir las mediciones del paso 1 tras aplicar los cambios:
- Comparar tamaño total, tamaño por chunk y tiempo de carga.
- Verificar que la funcionalidad no se ha visto afectada.
- Generar nuevo mapa visual para confirmar que los problemas se han resuelto.
- Documentar los cambios realizados y la reducción conseguida.
6. **Establecer presupuesto de bundle.** Para evitar que el tamaño vuelva a crecer sin control:
- Definir un límite máximo para el bundle principal (por ejemplo, 200KB gzip).
- Configurar alertas en CI con `bundlesize`, `size-limit` o la funcionalidad de presupuesto del bundler.
- Revisar el impacto en tamaño antes de añadir nuevas dependencias.
## Que NO hacer
- No optimizar sin medir primero. Una reducción de 2KB en un bundle de 3MB no merece esfuerzo; una de 200KB en un bundle de 400KB es transformadora.
- No sacrificar la experiencia de desarrollo por una optimización marginal. Si una dependencia mejora significativamente la productividad del equipo, su tamaño puede ser aceptable.
- No asumir que el tree-shaking funciona sin verificarlo. Librerías que usan CommonJS, asignaciones a `module.exports` dinámicas o efectos secundarios en la raíz del módulo pueden anular el tree-shaking.
- No cargar todo de forma lazy. El chunk inicial debe contener lo necesario para el primer renderizado; el lazy loading excesivo genera cascadas de peticiones que empeoran la experiencia.
More from 686f6c61/alfred-dev
- acceptance-criteriaGenerar criterios de aceptación en formato Given/When/Then. Activar cuando el usuario quiera definir criterios de aceptacion, usar formato Given When Then, escribir en Gherkin, saber como determinar que algo esta terminado o establecer una definicion de hecho.
- architecture-docsUsar para documentar la arquitectura del sistema. Activar ante: documentar arquitectura, diagrama del sistema, como funciona el proyecto, vision general tecnica
- choose-stackUsar para evaluar y elegir tecnologías con matriz de decisión ponderada. Activar cuando el usuario quiera elegir tecnología, comparar frameworks, decidir entre alternativas técnicas, construir una matriz de decisión, evaluar stack, seleccionar base de datos, elegir lenguaje o comparar herramientas.
- ci-cd-pipelineConfigurar pipeline CI/CD adaptado al proyecto. Activar cuando el usuario quiera configurar CI, crear GitHub Actions, configurar GitLab CI, montar un pipeline de despliegue, automatizar tests o implementar integracion continua.
- code-review-responseUsar al recibir feedback de code review para responder técnicamente. Activar cuando el usuario quiera responder a comentarios de PR, gestionar feedback de code review, resolver comentarios de un revisor, o cuando el revisor pide cambios en el código.
- compliance-checkUsar para verificar cumplimiento RGPD, NIS2 y CRA. También: verificar RGPD, cumplimiento normativo, NIS2, CRA, Cyber Resilience Act, protección de datos, regulación europea.
- copy-reviewRevisar textos publicos: claridad, tono, ortografia y CTAs. Activar ante: revisar textos, mejorar copy, tono de comunicacion, textos de la web, landing page copy
- dependency-strategyEstrategia integral de gestion de dependencias: inventario, evaluacion de riesgo, politica de actualizaciones y documentacion. Usar para auditar el estado global de las dependencias del proyecto.
- dependency-updateRevisar dependencias desactualizadas, con CVEs o end-of-life, y proponer actualizaciones seguras. También: actualizar paquetes, actualizar dependencias, Dependabot, Renovate, versión desactualizada, breaking changes.
- deploy-configConfigurar despliegue según hosting. Activar cuando el usuario quiera desplegar en Vercel, Railway, AWS, configurar hosting, preparar para produccion o gestionar variables de entorno de despliegue.