Sería posible alguna información o tutorial acerca de la carga asíncrona de módulos por parte de Webpack?

Pregunta de la clase:
Víctor Julio Molano Bolívar

Víctor Julio Molano Bolívar

Pregunta
studenthace 8 años

Es muy bonito todo en un bundle pero y cuando la aplicación crezca(si lo hace) que va pasar con la experiencia de usuario?

Aqui con el ejercicio del curso muy práctico todo porque el bundle queda pesando muy poco.

Pero una vez que tenga uno muchas páginas y componentes descargar todo eso en un bundle inicial sería innecesario y además arruinaría la experiencia de usuario al tener que esperar quien sabe cuando para descargar toda la lógica de la app y posiblemente solo use 1 o 2 páginas.

Sé que webpack permite hacer carga asíncrona de módulos y creo seria un MUY BUEN PLUS para el curso, ver un ejemplo del trabajo con esa funcionalidad tanto en desarrollo como en producción.

Se me ocurre que podríamos crear/cargar un mini-bundle por cada página o grupo de páginas de la app.

**Ejemplo:

Imaginen un software administrativo que tenga diferentes modulos (de negocio) como por ejemplo (nomina, ventas, inventario, almacén, etc…)**

Cada módulo a su vez tendría varias/muchas páginas para gestionar datos básicos, para hacer transacciones y demás.

Mi punto es que si un usuario quiere ver el reporte de nómina por ejemplo y todo está en un bundle sería muy mala la experiencia de esperar a que se baje todo el js de todos los módulos.

No sería mejor que por ejemplo si entramos al home de la página

http://myapp.com
se baje el js unicamente de las rutas de la app y del componente
<Home />
?

Luego al ingresar a la ruta

http://myapp.com/login
se baje el bundle de ese componente, luego si voy a
http://myapp.com/nomina
el bundle de <Nomina />, luego el de la página de reportes,… etc.

El punto es que se va descargando asíncronamente el js que se va necesitando y no todo el de la app.

De antemano gracias y espero pueda ser tomada esta sugerencia como un BONUS para el curso, seria de gran utilidad.

Saludos!

2 respuestas
para escribir tu comentario
    Víctor Julio Molano Bolívar

    Víctor Julio Molano Bolívar

    studenthace 8 años

    Hola Sergio, no hay lio, gracias por la info.

    Yo he estado mirando un poco sobre esto:

    https://medium.com/modus-create-front-end-development/automatic-code-splitting-for-react-router-w-es6-imports-a0abdaa491e9#.8v9s1efcm

    Y aquí pusieron un demo en línea que, al revisar con las herramientas de desarrollo de chrome, es justo lo que pretendo hacer que es separación de código por rutas de react-router:

    https://burning-heat-4609.firebaseapp.com/

    Ahí hacen la separación con los 2 entry points (más o menos como ud dice, separando dependencias y lógica)

    Sin embargo lo que no me queda claro es la integración con redux y con react-redux, no se si depronto me pueda ayudar de alguna forma con ese tema, pues no se como se “repartirian” las acciones y reducers en cada mini-bundle.

    La idea es usar de una vez Webpack2 y aprovecharme de ese pseudo-feature “automático”, para hacer el code splitting. He estado leyendo mucho entre otras sobre esto:

    https://medium.com/@ryanflorence/welcome-to-future-of-web-application-delivery-9750b7564d9f#.196r4nbf4

    Y no me queda muy claro cómo sería el despliegue de la app.

    Entonces cualquier info o ejemplo al respecto sería de gran ayuda.

    Gracias

    Off-topic: finalmente descartado este tema como un Bonus para el curso?

    Sergio Daniel Xalambrí

    Sergio Daniel Xalambrí

    studenthace 8 años

    Hola Victor, lamento mucho haber tardado tanto en responderte, soy una mala persona por eso y me siento muy mal 😦.

    Tu idea es excelente, y de hecho es lo mejor que se puede hacer en aplicaciones grandes como mencionas 😃

    Hay varias formas de hacerlo, en Webpack v1 (la usada en el curso, aunque probablemente se pueda usar en la v2 también) existe un plugin muy interesante llamado DLL que te permite definir ciertos archivos y generar un bundled separado de tu aplicación con estos, por ejemplo con tus dependencias instaladas de npm, este archivo se puede generar 1 vez, agregarle una cache muy grande (o inmutable) y enviarlo por separado de tu código.

    Con solo hacer esto ya extrajiste un montón de kb de peso de tu aplicación y al tener una cache a largo plazo te evitas que el usuario tenga que descargar este archivo una y otra vez, pero te permitís cambiar tu código muy seguido sin problemas.

    En mi experiencia con generar este archivo podés quitar 1 o 2 mb de peso y la verdad normalmente el código que uno crea no pesa tanto, son más las dependencias que usamos (React, React Router, Redux, React Redux, Immutable, etc. etc.) las que pesan mucho.

    Te dejo un enlace que me ayudó a entender como funciona este plugin y como implementarlo: https://robertknight.github.io/posts/webpack-dll-plugins/


    Ahora si querés separar tu código hay varias formas, una es crear multiples entry points, esto sirve para tener aplicaciones multi página, de esta forma cada página tiene su propio JS, aunque de esta forma es más difícil usar rutas en el navegador, esto sirve mucho si las rutas las maneja solo el backend y no hacemos una SPA, lo cual depende de la necesidad puede ser una buena idea.

    Otra opción es separar dinamicamente el código, por ejemplo en Webpack v2 podés usar

    import('ruta/al/modulo')
    el cual devuelve una promesa que recibe el código, esto se puede combinar con React Router sin mucha dificultad, aunque complicando un poco el server render 😦 (no es imposible, solo más difícil).

    Como vez siempre hay pros y contras de cada implementación, y depende de las necesidades de nuestra aplicación debemos decidir cual opción usar y que cosas sacrificar (como con todas las librerías y decisiones que tomamos al programar)

    En la nueva documentación de Webpack v2 hay una guía de como hacer separación de código con

    import();
    y una de como podemos cargar asíncronamente componentes de React antes de hacer el render. Te dejo los enlaces abajo.

    https://webpack.js.org/guides/code-splitting-import/

    https://webpack.js.org/guides/lazy-load-react/


    Por última hay una opción muy buena que es Next.js, en el curso vemos un material bonus sobre como usar la v1, y actualmente está por salir la v2 la cual incluye muchas mejoras.

    Una de las cosas más interesantes (que existe tanto en la v1 como la v2) es que Next.js separa código por página, nos de server-render y a su vez maneja un sistema de SPA que se encarga de cargar el código de otra página y hacer render en el cliente. Next es una muy buena opción para empezar proyectos listos para producción.

    Obviamente no es perfecto, en Next es difícil usar CSS de forma normal ya que nos propone usar CSS en JS mediante styled-jsx en vez de tener archivos

    .css
    (o con un preprocesador como SASS o Stylus). Igual la comunidad de React lo está adoptando mucho y crece a un ritmo muy rápido.

Curso Profesional de React con Redux 2016

Curso Profesional de React con Redux 2016

Desarrolla apps modulares en Javascript con React.js, la librería de más crecimiento en la web, creada por Facebook. Aprende desarrollo ágil de aplicaciones web con Redux y JSX.

Curso Profesional de React con Redux 2016
Curso Profesional de React con Redux 2016

Curso Profesional de React con Redux 2016

Desarrolla apps modulares en Javascript con React.js, la librería de más crecimiento en la web, creada por Facebook. Aprende desarrollo ágil de aplicaciones web con Redux y JSX.