<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Javascript on Commentary of Takao</title><link>https://takao.blog/es/tags/javascript/</link><description>Recent content in Javascript on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>Commentary of Takao</copyright><lastBuildDate>Sun, 12 Jul 2026 04:12:51 +0900</lastBuildDate><atom:link href="https://takao.blog/es/tags/javascript/index.xml" rel="self" type="application/rss+xml"/><item><title>React 19: Novedades que los desarrolladores deben conocer</title><link>https://takao.blog/es/web/react-19-new-features/</link><pubDate>Wed, 08 Jul 2026 10:00:00 +0900</pubDate><guid>https://takao.blog/es/web/react-19-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-19-new-features-es.png" alt="Featured image of post React 19: Novedades que los desarrolladores deben conocer" /&gt;&lt;h2 id="qué-cambió-en-react-19"&gt;Qué cambió en React 19
&lt;/h2&gt;&lt;p&gt;React 19 no es una actualización menor sino un cambio de paradigma. Server Components estables, nuevos hooks y el React Compiler cambian fundamentalmente cómo se escriben las aplicaciones.&lt;/p&gt;
&lt;h2 id="server-components-estables"&gt;Server Components estables
&lt;/h2&gt;&lt;p&gt;Los React Server Components (RSC) ahora están listos para producción. Al renderizar en el servidor y enviar HTML al cliente, reducen significativamente el tamaño del bundle. Los componentes que usan useState o useEffect deben declarar &amp;ldquo;use client&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Reemplazando localStorage: localForage como wrapper de IndexedDB</title><link>https://takao.blog/es/web/js-indexeddb-localforage-localstorage/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-indexeddb-localforage-localstorage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-indexeddb-localforage-localstorage-es.png" alt="Featured image of post Reemplazando localStorage: localForage como wrapper de IndexedDB" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;El almacenamiento del lado del cliente es fundamental. localStorage tiene límites dolorosos: ~5 MB, API síncrona, solo strings.&lt;/p&gt;
&lt;h2 id="indexeddb-potente-pero-complejo"&gt;IndexedDB: Potente pero complejo
&lt;/h2&gt;&lt;p&gt;Ofrece almacenamiento virtualmente ilimitado, API asíncrona, datos estructurados y consultas indexadas. Pero es notoriamente verboso.&lt;/p&gt;
&lt;h2 id="localforage-lo-mejor-de-ambos-mundos"&gt;localForage: Lo mejor de ambos mundos
&lt;/h2&gt;&lt;p&gt;Wrapper ligero que envuelve IndexedDB (con WebSQL y localStorage como respaldo) tras una API simple basada en promesas, inspirada en localStorage.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;localforage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;role&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;admin&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;localforage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Detección del mejor driver disponible: 1. IndexedDB, 2. WebSQL, 3. localStorage. Para la mayoría de necesidades de almacenamiento, localForage es la elección pragmática.&lt;/p&gt;</description></item><item><title>Potenciando tus expresiones regulares con el flag v</title><link>https://takao.blog/es/web/js-regex-v-flag/</link><pubDate>Wed, 15 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-regex-v-flag/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-regex-v-flag-es.png" alt="Featured image of post Potenciando tus expresiones regulares con el flag v" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;ES2024 introduce el flag &lt;code&gt;v&lt;/code&gt;, un superconjunto del flag &lt;code&gt;u&lt;/code&gt; que permite notación de conjuntos, resta de clases, intersección y coincidencia de emojis Unicode.&lt;/p&gt;
&lt;h2 id="resta-de-clases---"&gt;Resta de clases (&lt;code&gt;--&lt;/code&gt;)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;re&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;/[\p{Letter}--[aeiouAEIOU]]/v; // letras excepto vocales&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="intersección-"&gt;Intersección (&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;re&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;/[\p{Letter}&amp;amp;&amp;amp;\p{Script=Greek}]/v; // solo letras griegas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="clases-anidadas"&gt;Clases anidadas
&lt;/h2&gt;&lt;p&gt;El flag &lt;code&gt;v&lt;/code&gt; permite anidar clases con corchetes, eliminando secuencias de escape confusas.&lt;/p&gt;
&lt;h2 id="coincidencia-de-emojis"&gt;Coincidencia de emojis
&lt;/h2&gt;&lt;p&gt;Nuevas propiedades: &lt;code&gt;\p{RGI_Emoji}&lt;/code&gt;, &lt;code&gt;\p{Basic_Emoji}&lt;/code&gt;, &lt;code&gt;\p{Emoji_Keycap_Sequence}&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h2 id="migración-desde-flag-u"&gt;Migración desde flag u
&lt;/h2&gt;&lt;p&gt;El flag &lt;code&gt;v&lt;/code&gt; es estrictamente un superconjunto pero tiene cambios disruptivos: &lt;code&gt;\d&lt;/code&gt; dentro de clase no está permitido, &lt;code&gt;--&lt;/code&gt; y &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; son operadores.&lt;/p&gt;</description></item><item><title>Reglas para crear hooks personalizados en React</title><link>https://takao.blog/es/web/react-custom-hooks-rules/</link><pubDate>Sun, 10 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/react-custom-hooks-rules/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-custom-hooks-rules-es.png" alt="Featured image of post Reglas para crear hooks personalizados en React" /&gt;&lt;p&gt;Los hooks personalizados son la forma principal de extraer lógica con estado en React. Deben seguir las mismas reglas que los hooks integrados.&lt;/p&gt;
&lt;h2 id="reglas-fundamentales"&gt;Reglas fundamentales
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Solo llama hooks en el nivel superior (no en condicionales, bucles o funciones anidadas).&lt;/li&gt;
&lt;li&gt;Solo llama hooks desde componentes React o desde otros hooks.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="patrones-de-hooks-personalizados"&gt;Patrones de hooks personalizados
&lt;/h2&gt;&lt;p&gt;Un hook debe comenzar con &lt;code&gt;use&lt;/code&gt;. Debe devolver un objeto o array con valores y funciones. La lógica de efecto debe limpiarse en el cleanup.&lt;/p&gt;</description></item><item><title>Interoperabilidad ESM y CJS en Node.js</title><link>https://takao.blog/es/web/node-esm-cjs-interoperability/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/node-esm-cjs-interoperability/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/node-esm-cjs-interoperability-es.png" alt="Featured image of post Interoperabilidad ESM y CJS en Node.js" /&gt;&lt;p&gt;Node.js soporta dos sistemas de módulos: CommonJS (require) y ES Modules (import). La interoperabilidad entre ambos tiene reglas específicas.&lt;/p&gt;
&lt;h2 id="detección-del-tipo-de-módulo"&gt;Detección del tipo de módulo
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;.mjs&lt;/code&gt; siempre ESM. &lt;code&gt;.cjs&lt;/code&gt; siempre CJS. &lt;code&gt;.js&lt;/code&gt; depende del &lt;code&gt;package.json&lt;/code&gt; más cercano: &lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code&gt; para ESM, &lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;commonjs&amp;quot;&lt;/code&gt; o sin campo para CJS.&lt;/p&gt;
&lt;h2 id="importar-cjs-desde-esm"&gt;Importar CJS desde ESM
&lt;/h2&gt;&lt;p&gt;Los módulos CJS se importan con &lt;code&gt;import&lt;/code&gt; desde ESM. Node.js envuelve &lt;code&gt;module.exports&lt;/code&gt; como default export. Named exports requieren análisis estático limitado.&lt;/p&gt;</description></item><item><title>Optimizaciones con requestIdleCallback</title><link>https://takao.blog/es/web/web-performance-requestidlecallback-optimizations/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/web-performance-requestidlecallback-optimizations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-requestidlecallback-optimizations-es.png" alt="Featured image of post Optimizaciones con requestIdleCallback" /&gt;&lt;p&gt;&lt;code&gt;requestIdleCallback&lt;/code&gt; programa tareas no urgentes para cuando el navegador está inactivo. Mejora la capacidad de respuesta de la página.&lt;/p&gt;
&lt;h2 id="cómo-funciona"&gt;Cómo funciona
&lt;/h2&gt;&lt;p&gt;El navegador ejecuta callbacks en los tiempos muertos entre frames. &lt;code&gt;requestIdleCallback(callback, { timeout: 2000 })&lt;/code&gt;. &lt;code&gt;IdleDeadline.timeRemaining()&lt;/code&gt; indica el tiempo disponible.&lt;/p&gt;
&lt;h2 id="casos-de-uso"&gt;Casos de uso
&lt;/h2&gt;&lt;p&gt;Análisis (analytics), logging, precarga de datos no críticos, cleanups, procesamiento diferido, renderizado de contenido secundario.&lt;/p&gt;
&lt;h2 id="alternativas"&gt;Alternativas
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;setTimeout&lt;/code&gt; con 0: menos eficiente. &lt;code&gt;Scheduler.postTask&lt;/code&gt; (experimental) con prioridades. &lt;code&gt;requestAnimationFrame&lt;/code&gt; para animaciones. Elige según la urgencia.&lt;/p&gt;</description></item><item><title>Novedades emocionantes en ECMAScript 2025 (ES16)</title><link>https://takao.blog/es/web/js-es2025-new-features/</link><pubDate>Thu, 15 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-es2025-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-es2025-new-features-es.png" alt="Featured image of post Novedades emocionantes en ECMAScript 2025 (ES16)" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;Cada año, el comité TC39 actualiza las especificaciones ECMAScript. Para ECMAScript 2025 (ES16), varias propuestas han alcanzado Stage 3 o 4.&lt;/p&gt;
&lt;h2 id="promisetry"&gt;Promise.try
&lt;/h2&gt;&lt;p&gt;Unifica el manejo de errores síncronos y asíncronos. Si el callback lanza una excepción síncrona, &lt;code&gt;Promise.try()&lt;/code&gt; la captura y retorna una Promise rechazada, permitiendo un solo &lt;code&gt;.catch()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="iterator-helpers"&gt;Iterator Helpers
&lt;/h2&gt;&lt;p&gt;Añade &lt;code&gt;.map()&lt;/code&gt; y &lt;code&gt;.filter()&lt;/code&gt; a todos los objetos iterables (Set, Map, etc.). Evaluación perezosa: los elementos se procesan solo cuando se solicitan.&lt;/p&gt;</description></item><item><title>Lanzamiento oficial de React 19 y guía de funcionalidades prácticas</title><link>https://takao.blog/es/web/react-19-new-features-practical/</link><pubDate>Wed, 05 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/react-19-new-features-practical/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-19-new-features-practical-es.png" alt="Featured image of post Lanzamiento oficial de React 19 y guía de funcionalidades prácticas" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;React 19 representa un cambio de paradigma importante. Funciones antes restringidas a meta-frameworks como Next.js ahora están integradas en el núcleo estable de React.&lt;/p&gt;
&lt;h2 id="actions-api-y-useactionstate"&gt;Actions API y useActionState
&lt;/h2&gt;&lt;p&gt;Simplifica la gestión de mutaciones asíncronas. &lt;code&gt;useActionState&lt;/code&gt; enlaza manejadores asíncronos directamente a atributos de formulario nativos, manejando automáticamente indicadores de carga.&lt;/p&gt;
&lt;h2 id="useoptimistic"&gt;useOptimistic
&lt;/h2&gt;&lt;p&gt;Para acciones interactivas como &amp;ldquo;me gusta&amp;rdquo; o envío de chats. Actualiza la IU instantáneamente antes de que la solicitud al servidor se complete, con capacidad de rollback integrada.&lt;/p&gt;</description></item><item><title>Patrones a evitar con async/await en JavaScript</title><link>https://takao.blog/es/web/javascript-async-await-tips/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/javascript-async-await-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/javascript-async-await-tips-es.png" alt="Featured image of post Patrones a evitar con async/await en JavaScript" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;async/await&lt;/code&gt; hizo la programación asíncrona más intuitiva, pero puede ocultar problemas de rendimiento y errores.&lt;/p&gt;
&lt;h2 id="antipatrón-1-serialización-innecesaria"&gt;Antipatrón 1: Serialización innecesaria
&lt;/h2&gt;&lt;p&gt;No uses &lt;code&gt;await&lt;/code&gt; secuencial para tareas independientes. Usa &lt;code&gt;Promise.all&lt;/code&gt; para ejecución en paralelo.&lt;/p&gt;
&lt;h2 id="antipatrón-2-bloques-try-catch-anidados"&gt;Antipatrón 2: Bloques try-catch anidados
&lt;/h2&gt;&lt;p&gt;El anidamiento profundo derrota el propósito de async/await. Usa un solo bloque try-catch al más alto nivel.&lt;/p&gt;
&lt;h2 id="antipatrón-3-async-callbacks-en-foreach"&gt;Antipatrón 3: async callbacks en forEach
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;forEach&lt;/code&gt; con async callback ejecuta los callbacks síncronamente. Usa &lt;code&gt;for...of&lt;/code&gt; para secuencial o &lt;code&gt;Promise.all&lt;/code&gt; con &lt;code&gt;map&lt;/code&gt; para paralelo.&lt;/p&gt;</description></item><item><title>File System Access API: Acceso a archivos en el navegador</title><link>https://takao.blog/es/web/file-system-access-api/</link><pubDate>Sat, 28 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/file-system-access-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/file-system-access-api-es.png" alt="Featured image of post File System Access API: Acceso a archivos en el navegador" /&gt;&lt;p&gt;La File System Access API permite a las aplicaciones web leer, escribir y gestionar archivos y directorios en el sistema local del usuario.&lt;/p&gt;
&lt;h2 id="lectura-de-archivos"&gt;Lectura de archivos
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;window.showOpenFilePicker()&lt;/code&gt; devuelve un FileSystemFileHandle. Lee con &lt;code&gt;getFile()&lt;/code&gt; y &lt;code&gt;file.text()&lt;/code&gt; o &lt;code&gt;file.stream()&lt;/code&gt;. Múltiples archivos con &lt;code&gt;multiple: true&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="escritura-de-archivos"&gt;Escritura de archivos
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;window.showSaveFilePicker()&lt;/code&gt; permite guardar archivos. &lt;code&gt;handle.createWritable()&lt;/code&gt; devuelve un writable stream. Escritura segura con permisos del usuario.&lt;/p&gt;
&lt;h2 id="directorios"&gt;Directorios
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;window.showDirectoryPicker()&lt;/code&gt; permite seleccionar directorios. Iteración con &lt;code&gt;dir.entries()&lt;/code&gt;. Creación de archivos y subdirectorios.&lt;/p&gt;</description></item><item><title>Métodos de arrays JavaScript: De básicos a patrones avanzados</title><link>https://takao.blog/es/web/js-array-methods/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-array-methods/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-array-methods-es.png" alt="Featured image of post Métodos de arrays JavaScript: De básicos a patrones avanzados" /&gt;&lt;p&gt;Los arrays de JavaScript son el pilar de la manipulación de datos en el desarrollo web moderno. Con ES2023 introduciendo alternativas inmutables a métodos mutantes, es momento de revisar cómo trabajamos con arrays.&lt;/p&gt;
&lt;h2 id="panorama-de-métodos-de-array"&gt;Panorama de métodos de array
&lt;/h2&gt;&lt;p&gt;Los métodos se dividen en mutantes y no mutantes. ES2023 introdujo cuatro métodos inmutables: &lt;code&gt;toSorted()&lt;/code&gt;, &lt;code&gt;toReversed()&lt;/code&gt;, &lt;code&gt;toSpliced()&lt;/code&gt;, &lt;code&gt;with()&lt;/code&gt;. Estos crean nuevos arrays sin modificar el original, ideal para React o Redux.&lt;/p&gt;
&lt;h2 id="map-filter-y-reduce-en-profundidad"&gt;Map, Filter y Reduce en profundidad
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;map&lt;/code&gt; transforma cada elemento, &lt;code&gt;filter&lt;/code&gt; selecciona elementos, &lt;code&gt;reduce&lt;/code&gt; es el más versátil. Una anti-patrón común es encadenar &lt;code&gt;map&lt;/code&gt; seguido de &lt;code&gt;filter&lt;/code&gt; cuando un solo &lt;code&gt;flatMap&lt;/code&gt; sería suficiente.&lt;/p&gt;</description></item><item><title>Typed Arrays en JavaScript: Procesamiento de datos binarios en el navegador</title><link>https://takao.blog/es/web/js-typed-arrays/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-typed-arrays/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-typed-arrays-es.png" alt="Featured image of post Typed Arrays en JavaScript: Procesamiento de datos binarios en el navegador" /&gt;&lt;p&gt;El tipo &lt;code&gt;Number&lt;/code&gt; nativo de JavaScript es ineficiente para datos binarios. Los Typed Arrays (ES2015) traen gestión de memoria tipo C al navegador.&lt;/p&gt;
&lt;h2 id="arraybuffer"&gt;ArrayBuffer
&lt;/h2&gt;&lt;p&gt;Buffer binario raw de longitud fija. No se puede leer/escribir directamente — debe usarse una vista.&lt;/p&gt;
&lt;h2 id="vistas-typedarray"&gt;Vistas TypedArray
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Int8Array&lt;/code&gt;, &lt;code&gt;Uint8Array&lt;/code&gt;, &lt;code&gt;Float32Array&lt;/code&gt;, etc. Cada vista interpreta los bytes como un tipo numérico específico. &lt;code&gt;subarray()&lt;/code&gt; crea una subvista sin copia.&lt;/p&gt;
&lt;h2 id="dataview-para-estructuras-complejas"&gt;DataView para estructuras complejas
&lt;/h2&gt;&lt;p&gt;Permite lectura/escritura en offsets arbitrarios con tipo y endianness explícitos. Ideal para formatos binarios como BMP, PNG, WAV.&lt;/p&gt;</description></item><item><title>Module Federation: Micro-frontends con Webpack 5</title><link>https://takao.blog/es/web/module-federation/</link><pubDate>Tue, 09 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/module-federation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/module-federation-es.png" alt="Featured image of post Module Federation: Micro-frontends con Webpack 5" /&gt;&lt;p&gt;Module Federation permite cargar código JavaScript desde otra aplicación en tiempo de ejecución. Es la base de los micro-frontends modernos.&lt;/p&gt;
&lt;h2 id="cómo-funciona"&gt;Cómo funciona
&lt;/h2&gt;&lt;p&gt;Una aplicación expone módulos via &lt;code&gt;ModuleFederationPlugin&lt;/code&gt;. Otra aplicación los consume como si fueran locales. Los módulos compartidos se cargan una sola vez.&lt;/p&gt;
&lt;h2 id="configuración-expósitor"&gt;Configuración expósitor
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ModuleFederationPlugin&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;app1&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;exposes&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#e6db74"&gt;&amp;#39;./Button&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./src/Button&amp;#39;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;shared&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;react&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;singleton&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuración-consumidor"&gt;Configuración consumidor
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;remotes: { app1: 'app1@http://...' }&lt;/code&gt;. Importa &lt;code&gt;import('app1/Button')&lt;/code&gt;. React y otras librerías compartidas como singletons.&lt;/p&gt;</description></item><item><title>API Proxy y Reflect de JavaScript: Patrones de metaprogramación</title><link>https://takao.blog/es/web/js-proxy-reflect/</link><pubDate>Tue, 04 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-proxy-reflect/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-proxy-reflect-es.png" alt="Featured image of post API Proxy y Reflect de JavaScript: Patrones de metaprogramación" /&gt;&lt;p&gt;&lt;code&gt;Proxy&lt;/code&gt; y &lt;code&gt;Reflect&lt;/code&gt; permiten interceptar y personalizar operaciones fundamentales en objetos: acceso a propiedades, asignación, enumeración, invocación de funciones y llamadas a constructores.&lt;/p&gt;
&lt;h2 id="los-13-traps-de-proxy"&gt;Los 13 traps de Proxy
&lt;/h2&gt;&lt;p&gt;Desde &lt;code&gt;get&lt;/code&gt;/&lt;code&gt;set&lt;/code&gt; (lectura/escritura) hasta &lt;code&gt;apply&lt;/code&gt;/&lt;code&gt;construct&lt;/code&gt; (llamadas de función/constructor). Cada trap debe cumplir invariantes.&lt;/p&gt;
&lt;h2 id="api-reflect"&gt;API Reflect
&lt;/h2&gt;&lt;p&gt;Los métodos de &lt;code&gt;Reflect&lt;/code&gt; reflejan cada trap de Proxy. Usar &lt;code&gt;Reflect&lt;/code&gt; dentro de traps asegura propagación correcta del argumento &lt;code&gt;receiver&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="validación-e-integridad"&gt;Validación e integridad
&lt;/h2&gt;&lt;p&gt;El trap &lt;code&gt;set&lt;/code&gt; puede imponer restricciones de esquema. Proxy de solo lectura bloquea todos los traps de mutación.&lt;/p&gt;</description></item><item><title>WebSockets: Comunicación en tiempo real</title><link>https://takao.blog/es/web/websocket-applications/</link><pubDate>Tue, 14 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/websocket-applications/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/websocket-applications-es.png" alt="Featured image of post WebSockets: Comunicación en tiempo real" /&gt;&lt;p&gt;WebSocket proporciona un canal de comunicación bidireccional full-duplex sobre una sola conexión TCP. Ideal para aplicaciones en tiempo real.&lt;/p&gt;
&lt;h2 id="diferencias-con-http"&gt;Diferencias con HTTP
&lt;/h2&gt;&lt;p&gt;HTTP es request-response. WebSocket es persistente y bidireccional. Menos overhead (sin headers en cada mensaje). Latencia reducida.&lt;/p&gt;
&lt;h2 id="api-javascript"&gt;API JavaScript
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ws&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WebSocket&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;wss://server.com&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ws&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onmessage&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ws&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;chat&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Hola&amp;#39;&lt;/span&gt; }));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="casos-de-uso"&gt;Casos de uso
&lt;/h2&gt;&lt;p&gt;Chat, notificaciones en vivo, colaboración en tiempo real (Google Docs), juegos multijugador, datos financieros, paneles de monitoreo.&lt;/p&gt;
&lt;h2 id="consideraciones"&gt;Consideraciones
&lt;/h2&gt;&lt;p&gt;Reconexión automática. Heartbeats/pings para mantener conexión. Escalado: sticky sessions o pub/sub (Redis). Seguridad: WSS (WebSocket Secure).&lt;/p&gt;</description></item><item><title>Worker Threads en Node.js: Paralelismo real</title><link>https://takao.blog/es/web/nodejs-worker-threads/</link><pubDate>Tue, 23 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/nodejs-worker-threads/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-worker-threads-es.png" alt="Featured image of post Worker Threads en Node.js: Paralelismo real" /&gt;&lt;p&gt;Worker Threads permite ejecutar JavaScript en múltiples hilos, descargando tareas CPU-intensive del event loop principal.&lt;/p&gt;
&lt;h2 id="cuándo-usar-workers"&gt;Cuándo usar workers
&lt;/h2&gt;&lt;p&gt;Cálculos matemáticos pesados, procesamiento de imágenes, parsing de archivos grandes, compresión, cifrado. No para operaciones I/O (ya son asíncronas).&lt;/p&gt;
&lt;h2 id="api-básica"&gt;API básica
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Worker&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;worker_threads&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;worker&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Worker&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;./worker.js&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;workerData&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;worker&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; =&amp;gt; {});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="comunicación"&gt;Comunicación
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;postMessage&lt;/code&gt;: copia estructurada (serializable). SharedArrayBuffer: memoria compartida. &lt;code&gt;parentPort.postMessage&lt;/code&gt; desde el worker. Atomics para sincronización.&lt;/p&gt;
&lt;h2 id="pool-de-workers"&gt;Pool de workers
&lt;/h2&gt;&lt;p&gt;Crear workers por tarea tiene overhead. Usa &lt;code&gt;workerpool&lt;/code&gt; o &lt;code&gt;piscina&lt;/code&gt; para pooling. Mantén un número fijo de workers (CPU cores - 1).&lt;/p&gt;</description></item><item><title>Novedades de ES2024 en JavaScript</title><link>https://takao.blog/es/web/es2024-new-features/</link><pubDate>Tue, 12 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/es2024-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/es2024-new-features-es.png" alt="Featured image of post Novedades de ES2024 en JavaScript" /&gt;&lt;p&gt;ES2024 (ES15) introduce nuevas funcionalidades al lenguaje, centradas en async, arrays y gestión de datos.&lt;/p&gt;
&lt;h2 id="promisewithresolvers"&gt;Promise.withResolvers()
&lt;/h2&gt;&lt;p&gt;Crea una promesa con sus funciones resolve y reject expuestas externamente. Útil para promisificar APIs callback sin anidar constructores.&lt;/p&gt;
&lt;h2 id="array-grouping"&gt;Array Grouping
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Object.groupBy()&lt;/code&gt; y &lt;code&gt;Map.groupBy()&lt;/code&gt; agrupan elementos de un array según una función callback. Reemplaza implementaciones manuales con reduce.&lt;/p&gt;
&lt;h2 id="well-formed-unicode-strings"&gt;Well-formed Unicode Strings
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;String.prototype.isWellFormed()&lt;/code&gt; y &lt;code&gt;toWellFormed()&lt;/code&gt; para manejar cadenas Unicode mal formadas. Previene errores en APIs que requieren Unicode válido.&lt;/p&gt;</description></item><item><title>ESLint Flat Config: La nueva configuración</title><link>https://takao.blog/es/web/eslint-flat-config/</link><pubDate>Mon, 26 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/eslint-flat-config/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/eslint-flat-config-es.png" alt="Featured image of post ESLint Flat Config: La nueva configuración" /&gt;&lt;p&gt;ESLint Flat Config (v9+) reemplaza el formato jerárquico .eslintrc con un sistema de configuración plano basado en arrays de objetos.&lt;/p&gt;
&lt;h2 id="diferencias-clave"&gt;Diferencias clave
&lt;/h2&gt;&lt;p&gt;Un solo archivo &lt;code&gt;eslint.config.js&lt;/code&gt;. Sin herencia de configuraciones anidadas. Las reglas se evalúan en orden. Adiós a &lt;code&gt;.eslintrc&lt;/code&gt;, &lt;code&gt;extends&lt;/code&gt;, &lt;code&gt;overrides&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;rules&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#e6db74"&gt;&amp;#39;no-unused-vars&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;error&amp;#39;&lt;/span&gt; } },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;**/*.ts&amp;#39;&lt;/span&gt;], &lt;span style="color:#a6e22e"&gt;rules&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#e6db74"&gt;&amp;#39;@typescript-eslint/no-explicit-any&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;error&amp;#39;&lt;/span&gt; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="migración"&gt;Migración
&lt;/h2&gt;&lt;p&gt;Usa &lt;code&gt;eslint --flag unstable_flat_config&lt;/code&gt; para probar. &lt;code&gt;@eslint/migrate-config&lt;/code&gt; convierte .eslintrc. Las configuraciones populares (typescript-eslint, eslint-plugin-react) ya soportan flat config.&lt;/p&gt;</description></item><item><title>Profundizando en el Event Loop de JavaScript: Microtasks, Macrotasks y más</title><link>https://takao.blog/es/web/js-event-loop/</link><pubDate>Mon, 19 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-event-loop/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-event-loop-es.png" alt="Featured image of post Profundizando en el Event Loop de JavaScript: Microtasks, Macrotasks y más" /&gt;&lt;p&gt;El event loop de JavaScript es uno de los conceptos más importantes y menos entendidos. A pesar de ser single-threaded, su event loop permite concurrencia no bloqueante mediante un sistema de colas.&lt;/p&gt;
&lt;h2 id="call-stack"&gt;Call Stack
&lt;/h2&gt;&lt;p&gt;Estructura LIFO. Principio de run-to-completion: cada función se ejecuta hasta completarse antes de que otro código la interrumpa.&lt;/p&gt;
&lt;h2 id="cola-de-macrotasks"&gt;Cola de Macrotasks
&lt;/h2&gt;&lt;p&gt;Origen: &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, I/O, eventos UI. El event loop toma UNA macrotask por iteración, la ejecuta, luego procesa la cola de microtasks.&lt;/p&gt;</description></item><item><title>Desarrollo de plugins para Vite</title><link>https://takao.blog/es/web/vite-plugin-dev/</link><pubDate>Mon, 05 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/vite-plugin-dev/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vite-plugin-dev-es.png" alt="Featured image of post Desarrollo de plugins para Vite" /&gt;&lt;p&gt;Los plugins de Vite transforman código en tiempo de build y desarrollo. Siguen la interfaz de Rollup con hooks específicos de Vite.&lt;/p&gt;
&lt;h2 id="hooks-básicos"&gt;Hooks básicos
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;resolveId&lt;/code&gt;, &lt;code&gt;load&lt;/code&gt;, &lt;code&gt;transform&lt;/code&gt; son los hooks universales. &lt;code&gt;handleHotUpdate&lt;/code&gt; para HMR personalizado. &lt;code&gt;config&lt;/code&gt; para modificar la configuración de Vite.&lt;/p&gt;
&lt;h2 id="ejemplo-de-plugin"&gt;Ejemplo de plugin
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;myPlugin&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;transform&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;endsWith&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;.special&amp;#39;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transformSpecial&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hooks-de-vite"&gt;Hooks de Vite
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;configResolved&lt;/code&gt;, &lt;code&gt;configureServer&lt;/code&gt;, &lt;code&gt;transformIndexHtml&lt;/code&gt;, &lt;code&gt;closeBundle&lt;/code&gt;. Cada hook se ejecuta en una fase específica del pipeline.&lt;/p&gt;</description></item><item><title>Streams en Node.js: Procesamiento eficiente de datos</title><link>https://takao.blog/es/web/nodejs-streams/</link><pubDate>Wed, 20 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/nodejs-streams/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-streams-es.png" alt="Featured image of post Streams en Node.js: Procesamiento eficiente de datos" /&gt;&lt;p&gt;Los streams de Node.js permiten procesar datos en fragmentos (chunks) sin cargar todo en memoria. Esencial para archivos grandes y redes.&lt;/p&gt;
&lt;h2 id="tipos-de-streams"&gt;Tipos de streams
&lt;/h2&gt;&lt;p&gt;Readable: fuente de datos. Writable: destino de datos. Transform: transforma datos (compress, encrypt). Duplex: ambos (net socket).&lt;/p&gt;
&lt;h2 id="pipe-y-pipeline"&gt;Pipe y pipeline
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;readable.pipe(writable)&lt;/code&gt; encadena streams. &lt;code&gt;pipeline&lt;/code&gt; (recomendada) maneja errores y limpia correctamente: &lt;code&gt;pipeline(readable, transform, writable, callback)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="backpressure"&gt;Backpressure
&lt;/h2&gt;&lt;p&gt;Cuando el writable es más lento que el readable, se aplica backpressure. &lt;code&gt;highWaterMark&lt;/code&gt; controla el buffer interno. El stream pause automáticamente.&lt;/p&gt;</description></item><item><title>Patrones avanzados de Promises en JavaScript: Dominio del flujo asíncrono</title><link>https://takao.blog/es/web/js-promise-patterns/</link><pubDate>Tue, 05 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-promise-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-promise-patterns-es.png" alt="Featured image of post Patrones avanzados de Promises en JavaScript: Dominio del flujo asíncrono" /&gt;&lt;p&gt;Las Promises son fundamentales en JavaScript moderno. Más allá de cadenas básicas &lt;code&gt;.then()&lt;/code&gt;, existen patrones avanzados para control de concurrencia, manejo de errores y cancelación.&lt;/p&gt;
&lt;h2 id="combinadores-de-promises"&gt;Combinadores de Promises
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Promise.all&lt;/code&gt; resuelve cuando todas resuelven. &lt;code&gt;Promise.allSettled&lt;/code&gt; cuando todas se settling (nunca rechaza). &lt;code&gt;Promise.race&lt;/code&gt; con la primera que se settling. &lt;code&gt;Promise.any&lt;/code&gt; con la primera que resuelve.&lt;/p&gt;
&lt;h2 id="control-de-concurrencia"&gt;Control de concurrencia
&lt;/h2&gt;&lt;p&gt;Un limitador de concurrencia encola tareas y asegura que solo un número específico se ejecute simultáneamente. El patrón &lt;code&gt;pMap&lt;/code&gt; con &lt;code&gt;Promise.race&lt;/code&gt; soporta contrapresión.&lt;/p&gt;</description></item></channel></rss>