Descripción general de la integración con Next.js
El soporte para Next.js está llegando a su fin más información
Este plugin habilita Module Federation en Next.js.
Compatibilidad
- next ^15 || ^14 || ^13 || ^12
- Renderizado en el servidor (SSR)
- Pages Router
Te recomiendo encarecidamente tomar como referencia esta aplicación, que aprovecha las mejores capacidades: https://github.com/module-federation/module-federation-examples
Requisitos
Este plugin establece internamente process.env.NEXT_PRIVATE_LOCAL_WEBPACK = 'true', pero es mejor definirlo en el entorno o exportarlo desde la línea de comandos.
"Webpack local" significa que debes tener webpack instalado como dependencia, y que Next no usará su copia empaquetada de webpack, que no sirve porque necesito acceder a todos los elementos internos de webpack
cross-env NEXT_PRIVATE_LOCAL_WEBPACK=true next devonext buildnpm install webpack
Uso
Para evitar errores de hidratación, usa React.lazy en lugar de next/dynamic para la carga diferida de componentes federados.
Consulta la implementación aquí: https://github.com/module-federation/module-federation-examples/tree/master/nextjs-v13/home/pages
Con un límite asíncrono instalado a nivel de página, puedes hacer lo siguiente
Demo
Puedes verlo en acción aquí: https://github.com/module-federation/module-federation-examples/tree/master/nextjs-ssr
Opciones
Este plugin funciona exactamente igual que ModuleFederationPlugin; úsalo como lo harías normalmente. Ten en cuenta que ya compartimos automáticamente por ti lo relacionado con react y next.
Además, NextFederationPlugin tiene su propio argumento opcional extraOptions, con el que puedes desbloquear funcionalidades adicionales de este plugin:
debug– activa el modo de depuración. Imprime información adicional sobre lo que ocurre internamente.exposePages– expone automáticamente todas las páginas de Next.js y su./pages-map.enableImageLoaderFix– añade el hostname público a todos los assets empaquetados pornextjs-image-loader. Así, si sirves remoteEntry desdehttp://example.com, todos los assets empaquetados obtendrán ese hostname en runtime. Es algo parecido a la Base URL de HTML, pero para módulos federados.enableUrlLoaderFix– añade el hostname público a todos los assets empaquetados porurl-loader.skipSharingNextInternals– desactiva la compartición de los elementos internos de Next. Puedes usarlo si quieres compartir tú mismo los elementos internos de Next o si quieres usar este plugin en aplicaciones que no son NextscriptTimeout– el tiempo de espera, en milisegundos, del script de entrada del remote en el navegador para cada intento de carga. Por defecto es8000; los valores que no son números finitos positivos vuelven a este valor por defecto. Auméntalo para conexiones lentas y usa@module-federation/retry-pluginpara reintentar los fallos transitorios. Esta opción no activa reintentos ni cambia los tiempos de espera de carga en el servidor.
Next.js obtiene de mf-manifest.json los campos de assets de los exposes que usa el flushChunks() legacy, sin recorrer adicionalmente los stats de Webpack, de modo que las aplicaciones con versiones anteriores siguen funcionando durante las actualizaciones progresivas. Las herramientas personalizadas que leen otros campos legacy de los stats deberían migrar a mf-manifest.json; configurar manifest: false conserva la salida legacy completa.
Demo
Puedes verlo en acción aquí: https://github.com/module-federation/module-federation-examples/pull/2147
Implementar el plugin
- Usa
NextFederationPluginen elnext.config.jsde la app desde la que quieres exponer módulos. La llamaremos "next2".
- Usa react.lazy, la API de bajo nivel o require/import from para importar remotes.
RuntimePlugins
Para aportar extensibilidad y "middleware" a la federación, puedes consultar @module-federation/enhanced/runtime
Utilidades
loadRemote se ha eliminado; puedes aprovechar las nuevas APIs de runtime: https://module-federation.io/guide/runtime/runtime-api.html#loadremote
revalidate
Habilita la recarga en caliente del servidor Node (no del cliente) en producción. Se recomienda: sin ella, los servidores no podrán obtener las actualizaciones de los remotes sin un reinicio completo.
Más información aquí: https://github.com/module-federation/nextjs-mf/tree/main/packages/node#utilities
Para Express.js
La recarga en caliente de Express.js requiere pasos adicionales: https://github.com/module-federation/core/blob/main/packages/node/README.md
¿Qué se comparte por defecto?
Internamente compartimos de forma automática algunos elementos internos de Next. No necesitas compartir estos paquetes; compartir tú mismo los elementos internos de Next provocará errores.