Cómo optimizar el empaquetado de paquetes

El empaquetado de paquetes externos puede mejorar significativamente el rendimiento de su aplicación. Por defecto, los paquetes importados en su aplicación no se empaquetan. Esto puede afectar el rendimiento o podría no funcionar si los paquetes externos no están pre-empaquetados, por ejemplo, si se importan desde un monorepo o node_modules. Esta página le guiará sobre cómo analizar y configurar el empaquetado de paquetes.

Análisis de paquetes JavaScript

@next/bundle-analyzer es un complemento para Next.js que le ayuda a gestionar el tamaño de los paquetes de su aplicación. Genera un informe visual del tamaño de cada paquete y sus dependencias. Puede usar esta información para eliminar dependencias grandes, dividir o cargar de forma diferida (lazy-load) su código.

Instalación

Instale el complemento ejecutando el siguiente comando:

npm i @next/bundle-analyzer
# o
yarn add @next/bundle-analyzer
# o
pnpm add @next/bundle-analyzer

Luego, agregue la configuración del analizador de paquetes a su next.config.js.

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {}

const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true',
})

module.exports = withBundleAnalyzer(nextConfig)

Generación de un informe

Ejecute el siguiente comando para analizar sus paquetes:

ANALYZE=true npm run build
# o
ANALYZE=true yarn build
# o
ANALYZE=true pnpm build

El informe abrirá tres nuevas pestañas en su navegador, las cuales puede inspeccionar. Evaluar periódicamente los paquetes de su aplicación puede ayudarle a mantener el rendimiento de la aplicación con el tiempo.

Optimización de importaciones de paquetes

Algunos paquetes, como bibliotecas de iconos, pueden exportar cientos de módulos, lo que puede causar problemas de rendimiento en desarrollo y producción.

Puede optimizar cómo se importan estos paquetes agregando la opción optimizePackageImports a su next.config.js. Esta opción solo cargará los módulos que realmente use, mientras mantiene la conveniencia de escribir declaraciones de importación con muchas exportaciones nombradas.

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  experimental: {
    optimizePackageImports: ['icon-library'],
  },
}

module.exports = nextConfig

Next.js también optimiza automáticamente algunas bibliotecas, por lo que no necesitan incluirse en la lista de optimizePackageImports. Consulte la lista completa.

Empaquetado de paquetes específicos

Para empaquetar paquetes específicos, puede usar la opción transpilePackages en su next.config.js. Esta opción es útil para empaquetar paquetes externos que no están pre-empaquetados, por ejemplo, en un monorepo o importados desde node_modules.

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  transpilePackages: ['package-name'],
}

module.exports = nextConfig

Empaquetado de todos los paquetes

Para empaquetar automáticamente todos los paquetes (comportamiento predeterminado en el Enrutador de Aplicación - App Router), puede usar la opción bundlePagesRouterDependencies en su next.config.js.

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  bundlePagesRouterDependencies: true,
}

module.exports = nextConfig

Exclusión de paquetes específicos del empaquetado

Si tiene habilitada la opción bundlePagesRouterDependencies, puede excluir paquetes específicos del empaquetado automático usando la opción serverExternalPackages en su next.config.js:

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  // Empaquetar automáticamente paquetes externos en el Enrutador de Páginas (Pages Router):
  bundlePagesRouterDependencies: true,
  // Excluir paquetes específicos del empaquetado para ambos enrutadores (App y Pages Router):
  serverExternalPackages: ['package-name'],
}

module.exports = nextConfig