Dominando tu paso de construcción - Dominando tu código

Rate this content
Bookmark

Desde que JavaScript se convirtió en un lenguaje para escribir aplicaciones, las herramientas de construcción y especialmente los bundlers han estado presentes. Resuelven la discrepancia entre escribir código que sea fácil de mantener y escribir código que se cargue eficientemente en un navegador. Pero hay ventajas en el empaquetamiento del código JavaScript que van más allá del navegador, desde funciones en la nube hasta servidores y herramientas de línea de comandos.


RollupJS es especial porque siempre fue diseñado desde cero para ser un bundler de propósito general en lugar de una herramienta específica para el frontend. En esta charla, veremos de qué manera otros escenarios pueden beneficiarse del empaquetamiento. Pero lo más importante, te mostraré cómo RollupJS no solo genera una salida superior en muchas situaciones, sino lo fácil que es adaptar su salida a requisitos personalizados y escenarios no estándar. Veremos cómo parchear código, simular y reemplazar dependencias, inyectar elegantemente información de construcción y controlar la generación de fragmentos al dividir el código, todo con solo unas pocas líneas de código.

This talk has been presented at DevOps.js Conf 2021, check out the latest edition of this JavaScript Conference.

FAQ

Rollup ayuda a optimizar el tiempo de carga y el tamaño del código al evitar la 'cascada' de solicitudes de red y al empaquetar todos los archivos necesarios en uno solo. También es agnóstico al entorno objetivo, lo que permite su uso en diversos contextos como el navegador o Node.js, y ofrece una buena eliminación de código muerto.

El empaquetado puede reducir significativamente los tiempos de carga al minimizar el número de solicitudes de red necesarias. Por ejemplo, una aplicación probada mostró un tiempo de carga de 18.3 segundos sin empaquetar, mientras que con empaquetado el tiempo se redujo a 7.5 segundos.

Un complemento en Rollup es un módulo que introduce funcionalidades adicionales. Estos pueden manipular o transformar el código durante el proceso de empaquetado, como cambiar configuraciones de desarrollo a producción o eliminar código específico no deseado en la compilación final.

Rollup soporta varios formatos de salida incluyendo CommonJS, módulos ES, y otros como AMD y módulos ES. El formato de módulos ES es especialmente relevante ya que es el formato nativo de Rollup.

Rollup es beneficioso en escenarios donde el tiempo de inicio rápido es crucial, como en funciones Cloud y herramientas de línea de comandos. Esto se debe a que la optimización del empaquetado reduce tanto el tamaño del código como el tiempo necesarios para que la aplicación se vuelva operativa.

Un gancho en Rollup es una función que permite a los complementos interactuar con el proceso de empaquetado en diferentes etapas. Por ejemplo, el gancho de carga manipula cómo se carga un módulo, mientras que el gancho de transformación permite modificar el código antes de su empaquetado final.

Una estrategia es la eliminación de archivos innecesarios en los módulos, como tipos de TypeScript y documentación, que no son necesarios en producción. Rollup también puede compilar todos los archivos necesarios en uno solo, reduciendo el tamaño total y mejorando el tiempo de inicio del servidor.

Rollup es único en que está diseñado desde cero para ser agnóstico al entorno y admite una personalización extensa mediante complementos. Aunque otras herramientas pueden ser efectivas, Rollup es especialmente útil para bibliotecas y aplicaciones que requieren configuraciones de empaquetado específicas.

Lukas Taegert-Atkinson
Lukas Taegert-Atkinson
28 min
01 Jul, 2021

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Esta charla explora la optimización del código JavaScript utilizando Rollup, mostrando ejemplos de tiempos de carga mejorados y tamaño reducido del servidor. Se adentra en la personalización de Rollup y el desarrollo de complementos, demostrando cómo escribir complementos y eliminar código utilizando hooks. La charla también cubre la carga de código de módulo, el control avanzado de código y la importación/emisión de archivos con Rollup. Además, destaca la adopción del sistema de complementos de Rollup por parte de otras herramientas e introduce un terminal hecho a medida utilizado en la presentación.

1. Introducción a la optimización del código JavaScript

Short description:

Hola y gracias por sintonizar mi sesión sobre cómo mejorar tu código JavaScript generado utilizando Rollup. Quiero abordar otra pregunta. ¿Por qué estamos utilizando todos estos complejos pipelines de construcción y agregando todas estas cosas alrededor de nuestro código JavaScript? Para darte dos razones, te mostraré algunos ejemplos. El primer ejemplo es una implementación de Scrum Poker de código abierto y pequeña. Se puede ejecutar durante el desarrollo sin empaquetar, y el tiempo de carga se reduce significativamente con el empaquetado. La diferencia se debe a las solicitudes de red y al efecto de cascada de carga de archivos JavaScript. Ahora consideremos un escenario de servidor con una configuración básica de Apollo server en Docker. El tamaño de la imagen de la imagen alpina de Node 14 es de 116 megabytes.

Hola y gracias por sintonizar mi sesión sobre cómo mejorar tu código JavaScript generado utilizando Rollup. Antes de entrar en esa parte, en realidad, quiero abordar otra pregunta. La pregunta es la pregunta básica de JavaScript. ¿Por qué estamos utilizando todos estos complejos pipelines de construcción y agregando todas estas cosas alrededor de nuestro código JavaScript? Para darte dos razones, te mostraré algunos ejemplos primero.

El primer ejemplo es algo que construimos en nuestra empresa. Es de código abierto, una pequeña implementación de Scrum Poker. Puedes probarlo si quieres. La parte importante de esto, por qué lo elegí, es porque con esta aplicación es posible ejecutarla durante el desarrollo sin empaquetar. Hice algunas mediciones simulando una conexión de red muy lenta en un teléfono móvil pequeño. Los tiempos que obtuve sin empaquetar fueron alrededor de 18.3 segundos para cargar, pero con el empaquetado, tarda siete segundos y medio. Ahora, quiero decir que el único cambio entre esos números fue el empaquetado. No hay mucho menos código en el lado derecho. No hay compresión, no hay minificación. ¿Por qué es eso, en realidad? ¿Por qué hay esta diferencia en los números? La diferencia se puede ver en estas dos imágenes. Son estos escalones verdes aquí, o generalmente se les llama cascada. Lo que está sucediendo es que comienza con el primer archivo JavaScript y luego ve que hay algunas importaciones en el archivo. Una vez que descubre esas importaciones, envía la solicitud de red para obtener más archivos. Necesita cargar esos archivos, pasar esos archivos y descubrir algunas importaciones más, y así sucesivamente. Entre todos esos pasos, básicamente hay solicitudes de red de ida y vuelta, y esto se acumula. Por supuesto, lo que hace el empaquetado es evitar la cascada.

Ahora la pregunta es, bueno, esto es una aplicación web, sé lo que estamos haciendo aquí. ¿Qué pasa con nuestras situaciones? Digamos que estamos mirando un servidor. Esta vez, tengo un servidor Apollo muy básico configurado aquí, tomado del sitio web. Esta vez, no te daré números inventados. Esta vez, lo haremos en vivo. Voy a construir un servidor en Docker. Para darte un punto de referencia, tengo una pequeña terminal aquí conectada que está ejecutando comandos en mi máquina. Vamos a construir una imagen alpina de Node 14.

2. Configuración de Dockerfile y Reducción del Tamaño del Servidor

Short description:

Aquí tenemos dos archivos Docker preparados. El primero es una configuración tradicional, copiando archivos de paquete, instalando dependencias de producción y copiando el archivo del servidor. El segundo Dockerfile utiliza rollup para reducir el tamaño del servidor de 18MB a 4MB eliminando archivos innecesarios en los módulos de nodo. Esto reduce el tiempo de inicio y es beneficioso para las Cloud Functions y las herramientas de línea de comandos.

Imagen de Docker. Esto es 116 megabytes. Tal vez quieras recordar este número. Aquí tenemos dos archivos Docker preparados. El primero que voy a ejecutar es una configuración muy tradicional. Lo que estamos haciendo es copiar los archivos de paquete. Estamos instalando las dependencias de producción. Estamos copiando el archivo del servidor. Este es el archivo. Hay un pequeño envoltorio aquí. Este envoltorio está ahí solo porque inicia un temporizador pequeño. El temporizador se detiene una vez que el servidor dice que está completamente funcional. Eso es solo para las mediciones. Estoy ejecutando un comando que también iniciará inmediatamente el servidor para obtener algún tiempo. Lo que estoy haciendo aquí también es copiar todo a otra imagen, solo la carpeta que acabamos de crear. La razón es que durante este año, se crean muchas cachés, y esto ahorra otros dos o tres megabytes. Estoy haciendo esto ahora. Esto solo tomará un momento porque todo está en caché en este momento. Lo primero que ves, recuerdas, eran 160 megabytes antes, ahora son 134 megabytes, por lo que básicamente es un servidor de 18 megabytes. El tiempo de inicio fue casi de 300 milisegundos.

Ahora tengo aquí un segundo Dockerfile, que es este. Entonces, lo que hace este es básicamente ejecutar rollup aquí, tomando el servidor como punto de entrada y siendo travieso, sobrescribiéndolo nuevamente, y hay tres complementos, Node.resolve, CommonJS y JSON, que son necesarios para la compatibilidad con nodo y estamos creando un archivo CommonJS, y eso es todo. Luego, básicamente copiamos el artefacto creado, y cuando hago esto, veamos cuáles son los números ahora. Verás, son 120 megabytes, por lo que el servidor de 18 megabytes se convirtió en un servidor de cuatro megabytes.

Entonces, ¿por qué es eso? Eso se debe a que realmente hay muchas cosas innecesarias en tus módulos de nodo. Estos son los tipos de TypeScript, estos son archivos de prueba, documentación, quién sabe qué utilidades innecesarias. Entonces, esto tal vez no sea tan relevante si dices, okay, 130 versus 120, pero esta fue una configuración realmente básica. Entonces, esto sigue sumando, cuanto más grande se vuelve tu servidor, y por supuesto, el tiempo de inicio fue de 171 milisegundos, por lo que es casi la mitad del tiempo de inicio. Y esto es, nuevamente, la misma razón que viste antes. Estás reduciendo el tiempo de cascada. Entonces, vemos que esto reduce el tamaño y el tiempo de inicio, por lo que los servidores tal vez no sean tan importantes, pero las Cloud Functions definitivamente sí lo son. Esas Cloud Functions realmente necesitan un tiempo de inicio rápido o también las herramientas de línea de comandos. Entonces, otra pregunta, ¿por qué querrías usar rollup para

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Elevando Monorepos con los Espacios de Trabajo de npm
DevOps.js Conf 2022DevOps.js Conf 2022
33 min
Elevando Monorepos con los Espacios de Trabajo de npm
Top Content
NPM workspaces help manage multiple nested packages within a single top-level package, improving since the release of NPM CLI 7.0. You can easily add dependencies to workspaces and handle duplications. Running scripts and orchestration in a monorepo is made easier with NPM workspaces. The npm pkg command is useful for setting and retrieving keys and values from package.json files. NPM workspaces offer benefits compared to Lerna and future plans include better workspace linking and adding missing features.
Automatizando Todo el Código y las Pruebas con GitHub Actions
React Advanced 2021React Advanced 2021
19 min
Automatizando Todo el Código y las Pruebas con GitHub Actions
Top Content
We will learn how to automate code and testing with GitHub Actions, including linting, formatting, testing, and deployments. Automating deployments with scripts and Git hooks can help avoid mistakes. Popular CI-CD frameworks like Jenkins offer powerful orchestration but can be challenging to work with. GitHub Actions are flexible and approachable, allowing for environment setup, testing, deployment, and custom actions. A custom AppleTools Eyes GitHub action simplifies visual testing. Other examples include automating content reminders for sharing old content and tutorials.
Ajustando DevOps para las Personas sobre la Perfección
DevOps.js Conf 2022DevOps.js Conf 2022
33 min
Ajustando DevOps para las Personas sobre la Perfección
Top Content
DevOps is a journey that varies for each company, and remote work makes transformation challenging. Pull requests can be frustrating and slow, but success stories like Mateo Colia's company show the benefits of deploying every day. Challenges with tools and vulnerabilities require careful consideration and prioritization. Investing in documentation and people is important for efficient workflows and team growth. Trust is more important than excessive control when deploying to production.
¿Por qué es tan lento el CI?
DevOps.js Conf 2022DevOps.js Conf 2022
27 min
¿Por qué es tan lento el CI?
Slow CI has a negative impact on productivity and finances. Debugging CI workflows and tool slowness is even worse. Dependencies impact CI and waiting for NPM or YARN is frustrating. The ideal CI job involves native programs for static jobs and lightweight environments for dynamic jobs. Improving formatter performance and linting is a priority. Performance optimization and fast tools are essential for CI and developers using slower hardware.
El Núcleo de Turbopack Explicado (Codificación en Vivo)
JSNation 2023JSNation 2023
29 min
El Núcleo de Turbopack Explicado (Codificación en Vivo)
Tobias Koppers introduces TurboPack and TurboEngine, addressing the limitations of Webpack. He demonstrates live coding to showcase the optimization of cache validation and build efficiency. The talk covers adding logging and memorization, optimizing execution and tracking dependencies, implementing invalidation and watcher, and storing and deleting invalidators. It also discusses incremental compilation, integration with other monorepo tools, error display, and the possibility of a plugin system for Toolpag. Lastly, the comparison with Bunn's Builder is mentioned.
La filosofía de Yarn
DevOps.js Conf 2022DevOps.js Conf 2022
31 min
La filosofía de Yarn
Let's talk about React and TypeScript, Yarn's philosophy and long-term relevance, stability and error handling in Yarn, Yarn's behavior and open source sustainability, investing in maintenance and future contributors, contributing to the JavaScript ecosystem, open-source contribution experience, maintaining naming consistency in large projects, version consistency and strictness in Yarn, and Yarn 4 experiments for performance improvement.

Workshops on related topic

Despliegue de aplicaciones React Native en la nube
React Summit 2023React Summit 2023
88 min
Despliegue de aplicaciones React Native en la nube
WorkshopFree
Cecelia Martinez
Cecelia Martinez
Desplegar aplicaciones React Native manualmente en una máquina local puede ser complejo. Las diferencias entre Android e iOS requieren que los desarrolladores utilicen herramientas y procesos específicos para cada plataforma, incluidos los requisitos de hardware para iOS. Los despliegues manuales también dificultan la gestión de las credenciales de firma, las configuraciones de entorno, el seguimiento de las versiones y la colaboración en equipo.
Appflow es la plataforma de DevOps móvil en la nube creada por Ionic. Utilizar un servicio como Appflow para construir aplicaciones React Native no solo proporciona acceso a potentes recursos informáticos, sino que también simplifica el proceso de despliegue al proporcionar un entorno centralizado para gestionar y distribuir tu aplicación en múltiples plataformas. Esto puede ahorrar tiempo y recursos, permitir la colaboración, así como mejorar la confiabilidad y escalabilidad general de una aplicación.
En este masterclass, desplegarás una aplicación React Native para su entrega en dispositivos de prueba Android e iOS utilizando Appflow. También aprenderás los pasos para publicar en Google Play y Apple App Stores. No se requiere experiencia previa en el despliegue de aplicaciones nativas, y obtendrás una comprensión más profunda del proceso de despliegue móvil y las mejores prácticas para utilizar una plataforma de DevOps móvil en la nube para enviar rápidamente a gran escala.
Despliegue de Aplicación MERN Stack en Kubernetes
DevOps.js Conf 2022DevOps.js Conf 2022
152 min
Despliegue de Aplicación MERN Stack en Kubernetes
Workshop
Joel Lord
Joel Lord
Desplegar y gestionar aplicaciones JavaScript en Kubernetes puede volverse complicado. Especialmente cuando una base de datos también debe formar parte del despliegue. MongoDB Atlas ha facilitado mucho la vida de los desarrolladores, sin embargo, ¿cómo se integra un producto SaaS con su clúster de Kubernetes existente? Aquí es donde entra en juego el Operador de MongoDB Atlas. En este masterclass, los asistentes aprenderán cómo crear una aplicación MERN (MongoDB, Express, React, Node.js) localmente y cómo desplegar todo en un clúster de Kubernetes con el Operador de Atlas.
Azure Static Web Apps (SWA) con Azure DevOps
DevOps.js Conf 2022DevOps.js Conf 2022
13 min
Azure Static Web Apps (SWA) con Azure DevOps
WorkshopFree
Juarez Barbosa Junior
Juarez Barbosa Junior
Las Azure Static Web Apps se lanzaron a principios de 2021 y, de forma predeterminada, pueden integrar su repositorio existente y implementar su aplicación web estática desde Azure DevOps. Este masterclass demuestra cómo publicar una Azure Static Web App con Azure DevOps.
Cómo desarrollar, construir e implementar microservicios Node.js con Pulumi y Azure DevOps
DevOps.js Conf 2022DevOps.js Conf 2022
163 min
Cómo desarrollar, construir e implementar microservicios Node.js con Pulumi y Azure DevOps
Workshop
Alex Korzhikov
Andrew Reddikh
2 authors
El masterclass ofrece una perspectiva práctica de los principios clave necesarios para desarrollar, construir y mantener un conjunto de microservicios en el stack Node.js. Cubre los detalles específicos de la creación de servicios TypeScript aislados utilizando el enfoque de monorepo con lerna y yarn workspaces. El masterclass incluye una descripción general y un ejercicio en vivo para crear un entorno en la nube con el framework Pulumi y los servicios de Azure. Las sesiones están dirigidas a los mejores desarrolladores que deseen aprender y practicar técnicas de construcción e implementación utilizando el stack Azure y Pulumi para Node.js.