<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web on Commentary of Takao</title><link>https://takao.blog/es/categories/web/</link><description>Recent content in Web 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/categories/web/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>Comparativa de generadores de sitios estáticos 2026</title><link>https://takao.blog/es/web/static-site-generators-2026-comparison/</link><pubDate>Tue, 05 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/static-site-generators-2026-comparison/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/static-site-generators-2026-comparison-es.png" alt="Featured image of post Comparativa de generadores de sitios estáticos 2026" /&gt;&lt;p&gt;Los SSG han evolucionado. En 2026, las opciones principales ofrecen rendimiento, flexibilidad y DX mejorada.&lt;/p&gt;
&lt;h2 id="hugo"&gt;Hugo
&lt;/h2&gt;&lt;p&gt;Más rápido (&amp;lt;1ms por página). Go templates. Ideal para blogs y sitios de contenido. Ecosistema de temas maduro.&lt;/p&gt;
&lt;h2 id="astro"&gt;Astro
&lt;/h2&gt;&lt;p&gt;Islas de interactividad. Multi-framework (React, Vue, Svelte). Zero JS por defecto. Ideal para marketing sites y documentación.&lt;/p&gt;
&lt;h2 id="nextjs"&gt;Next.js
&lt;/h2&gt;&lt;p&gt;SSG + SSR + PPR. Más complejo pero más potente. Ideal para aplicaciones y e-commerce con contenido dinámico.&lt;/p&gt;</description></item><item><title>WebGPU: Gráficos nativos en el navegador</title><link>https://takao.blog/es/web/webgpu-native-browser-graphics-generation/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/webgpu-native-browser-graphics-generation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/webgpu-native-browser-graphics-generation-es.png" alt="Featured image of post WebGPU: Gráficos nativos en el navegador" /&gt;&lt;p&gt;WebGPU es la nueva API de gráficos y cómputo para la web. Sucesora de WebGL, ofrece acceso directo a GPUs modernas con rendimiento nativo.&lt;/p&gt;
&lt;h2 id="diferencias-con-webgl"&gt;Diferencias con WebGL
&lt;/h2&gt;&lt;p&gt;WebGPU usa una API más cercana a Vulkan/DX12/Metal. Menos overhead de driver. Compute shaders nativos. Soporte gráfico moderno.&lt;/p&gt;
&lt;h2 id="conceptos-clave"&gt;Conceptos clave
&lt;/h2&gt;&lt;p&gt;Adapter (GPU física), Device (contexto lógico), Queue (comandos), Pipeline (shaders), Buffer, Texture, BindGroup.&lt;/p&gt;
&lt;h2 id="shaders-con-wgsl"&gt;Shaders con WGSL
&lt;/h2&gt;&lt;p&gt;WGSL (WebGPU Shading Language) es el lenguaje de shaders. Tipado fuerte. Similar a SPIR-V. Compilado a código nativo de GPU.&lt;/p&gt;</description></item><item><title>Cloudflare Workers y WebAssembly en el Edge</title><link>https://takao.blog/es/web/cloudflare-workers-wasm-edge-developments/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/cloudflare-workers-wasm-edge-developments/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cloudflare-workers-wasm-edge-developments-es.png" alt="Featured image of post Cloudflare Workers y WebAssembly en el Edge" /&gt;&lt;p&gt;Cloudflare Workers ejecuta código JavaScript, WASM y Python en el edge. Ofrece latencia ultrabaja al procesar solicitudes cerca del usuario.&lt;/p&gt;
&lt;h2 id="workers-runtime"&gt;Workers Runtime
&lt;/h2&gt;&lt;p&gt;Basado en V8. Aislado por contexto. Sin Node.js (API propia: Fetch, Cache, KV, D1, R2, Queues). Arranque en frío &amp;lt; 5ms.&lt;/p&gt;
&lt;h2 id="webassembly-en-workers"&gt;WebAssembly en Workers
&lt;/h2&gt;&lt;p&gt;Compila Rust, C/C++, Go, Zig a WASM. Workers carga módulos WASM estáticos. Procesamiento de imágenes, parsing, cálculos pesados en el edge.&lt;/p&gt;
&lt;h2 id="almacenamiento-en-el-edge"&gt;Almacenamiento en el edge
&lt;/h2&gt;&lt;p&gt;KV (clave-valor, baja latencia), D1 (SQLite), R2 (S3-compatible), Durable Objects (estado coordinado). Bases de datos geodistribuidas.&lt;/p&gt;</description></item><item><title>Cloudflare y Privacy Sandbox: El fin de las cookies de terceros</title><link>https://takao.blog/es/web/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation/</link><pubDate>Fri, 05 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation-es.png" alt="Featured image of post Cloudflare y Privacy Sandbox: El fin de las cookies de terceros" /&gt;&lt;p&gt;Google está eliminando gradualmente las cookies de terceros. Cloudflare ofrece soluciones para mantener la funcionalidad del sitio sin depender de ellas.&lt;/p&gt;
&lt;h2 id="el-problema"&gt;El problema
&lt;/h2&gt;&lt;p&gt;Las cookies de terceros se usan para tracking, autenticación y personalización. Su desaparición afecta a analytics, ads y widgets sociales.&lt;/p&gt;
&lt;h2 id="privacy-sandbox"&gt;Privacy Sandbox
&lt;/h2&gt;&lt;p&gt;APIs de Google: Topics API (intereses), Protected Audience (remarketing), Attribution Reporting (conversiones), Shared Storage (datos entre contextos).&lt;/p&gt;
&lt;h2 id="alternativas-con-cloudflare"&gt;Alternativas con Cloudflare
&lt;/h2&gt;&lt;p&gt;Cookies propias (first-party) con Cloudflare Workers para tracking. Cloudflare Zaraz para analytics sin cookies. Turnstile para CAPTCHA sin tracking.&lt;/p&gt;</description></item><item><title>ESM estable en Node.js: Soporte de require</title><link>https://takao.blog/es/web/node-esm-require-support-stable/</link><pubDate>Wed, 05 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/node-esm-require-support-stable/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/node-esm-require-support-stable-es.png" alt="Featured image of post ESM estable en Node.js: Soporte de require" /&gt;&lt;p&gt;Node.js ha estabilizado el soporte de ES Modules. La función &lt;code&gt;require(esm)&lt;/code&gt; permite cargar módulos ESM desde CJS de forma síncrona, simplificando la migración.&lt;/p&gt;
&lt;h2 id="requireesm-en-nodejs-22"&gt;require(esm) en Node.js 22+
&lt;/h2&gt;&lt;p&gt;Node.js 22+ permite &lt;code&gt;require()&lt;/code&gt; de módulos ESM sincrónicamente si no tienen top-level await. Facilita la adopción híbrida.&lt;/p&gt;
&lt;h2 id="configuración"&gt;Configuración
&lt;/h2&gt;&lt;p&gt;No requiere flags de línea de comandos. Los paquetes ESM deben declararse con &lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code&gt; o &lt;code&gt;.mjs&lt;/code&gt;. &lt;code&gt;require()&lt;/code&gt; resuelve automáticamente.&lt;/p&gt;
&lt;h2 id="limitaciones"&gt;Limitaciones
&lt;/h2&gt;&lt;p&gt;Top-level await deshabilita require(esm). Paquetes ESM con solo named exports pueden necesitar ajustes. Los loaders personalizados afectan el comportamiento.&lt;/p&gt;</description></item><item><title>Accesibilidad web: Fundamentos de ARIA</title><link>https://takao.blog/es/web/web-accessibility-aria-basics/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/web-accessibility-aria-basics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-accessibility-aria-basics-es.png" alt="Featured image of post Accesibilidad web: Fundamentos de ARIA" /&gt;&lt;p&gt;ARIA (Accessible Rich Internet Applications) proporciona atributos HTML para mejorar la accesibilidad de contenido dinámico y componentes personalizados.&lt;/p&gt;
&lt;h2 id="principios-aria"&gt;Principios ARIA
&lt;/h2&gt;&lt;p&gt;No uses ARIA cuando los elementos HTML nativos funcionan. ARIA modifica el árbol de accesibilidad pero no el comportamiento. Primera regla: usa HTML semántico.&lt;/p&gt;
&lt;h2 id="roles-y-propiedades"&gt;Roles y propiedades
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;role=&amp;quot;button&amp;quot;&lt;/code&gt;, &lt;code&gt;aria-label&lt;/code&gt;, &lt;code&gt;aria-expanded&lt;/code&gt;, &lt;code&gt;aria-hidden&lt;/code&gt;, &lt;code&gt;aria-live&lt;/code&gt;. Roles de landmarks (&lt;code&gt;navigation&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;complementary&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="componentes-dinámicos"&gt;Componentes dinámicos
&lt;/h2&gt;&lt;p&gt;Tabs, modales, acordeones, sliders necesitan roles y estados ARIA. &lt;code&gt;aria-controls&lt;/code&gt;, &lt;code&gt;aria-selected&lt;/code&gt;, &lt;code&gt;aria-current&lt;/code&gt;, &lt;code&gt;aria-valuenow&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Vite 6 vs Rspack: Velocidades de bundler en 2026</title><link>https://takao.blog/es/web/vite-6-rspack-bundler-speeds/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/vite-6-rspack-bundler-speeds/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vite-6-rspack-bundler-speeds-es.png" alt="Featured image of post Vite 6 vs Rspack: Velocidades de bundler en 2026" /&gt;&lt;p&gt;Vite y Rspack son los bundlers más rápidos del ecosistema. Ambos usan Rust para tareas críticas pero con filosofías diferentes.&lt;/p&gt;
&lt;h2 id="vite-6"&gt;Vite 6
&lt;/h2&gt;&lt;p&gt;Usa esbuild para desarrollo (bundling nativo en Go) y Rollup para producción (con rolldown en desarrollo para unificar). HMR instantáneo. Ecosistema maduro de plugins.&lt;/p&gt;
&lt;h2 id="rspack"&gt;Rspack
&lt;/h2&gt;&lt;p&gt;Bundler escrito en Rust, compatible con webpack API y plugins. Ofrece migración directa desde webpack con 5-10x mejora en tiempo de build.&lt;/p&gt;
&lt;h2 id="comparativa"&gt;Comparativa
&lt;/h2&gt;&lt;p&gt;Rspack: mejor para migraciones desde webpack, SSR complejo, monorepos. Vite: mejor para proyectos nuevos, SPA, desarrollo con HMR. Ambos superan webpack 4/5 significativamente.&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>WWDC 2025: Novedades de Safari</title><link>https://takao.blog/es/web/apple-wwdc-2025-safari-updates/</link><pubDate>Thu, 05 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/apple-wwdc-2025-safari-updates/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/apple-wwdc-2025-safari-updates-es.png" alt="Featured image of post WWDC 2025: Novedades de Safari" /&gt;&lt;p&gt;Apple anunció importantes actualizaciones para Safari en WWDC 2025, incluyendo nuevas APIs web, mejoras de rendimiento y compatibilidad con estándares.&lt;/p&gt;
&lt;h2 id="nuevas-apis"&gt;Nuevas APIs
&lt;/h2&gt;&lt;p&gt;Soporte completo de WebGPU, CSS Anchor Positioning, View Transitions API. Mejoras en Service Workers y Push Notifications en iOS.&lt;/p&gt;
&lt;h2 id="rendimiento"&gt;Rendimiento
&lt;/h2&gt;&lt;p&gt;Mejoras en JavaScript Core (JIT más rápido). Reducción de uso de memoria. Perfilado de rendimiento mejorado en Safari Web Inspector.&lt;/p&gt;
&lt;h2 id="css-y-diseño"&gt;CSS y diseño
&lt;/h2&gt;&lt;p&gt;Soporte de &lt;code&gt;@scope&lt;/code&gt;, &lt;code&gt;@starting-style&lt;/code&gt;, &lt;code&gt;scroll-driven-animations&lt;/code&gt;. Mejoras en Subgrid y Container Queries. Propiedades de texto avanzadas.&lt;/p&gt;</description></item><item><title>npm, pnpm y yarn: Comparativa de gestores de paquetes</title><link>https://takao.blog/es/web/npm-pnpm-yarn-package-managers/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/npm-pnpm-yarn-package-managers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/npm-pnpm-yarn-package-managers-es.png" alt="Featured image of post npm, pnpm y yarn: Comparativa de gestores de paquetes" /&gt;&lt;p&gt;Los gestores de paquetes de JavaScript han evolucionado. Cada uno ofrece ventajas en velocidad, almacenamiento y seguridad.&lt;/p&gt;
&lt;h2 id="npm"&gt;npm
&lt;/h2&gt;&lt;p&gt;El gestor oficial. npm 10+ es más rápido que versiones anteriores. &lt;code&gt;package-lock.json&lt;/code&gt;. Workspaces para monorepos. Audit de seguridad integrado.&lt;/p&gt;
&lt;h2 id="pnpm"&gt;pnpm
&lt;/h2&gt;&lt;p&gt;Usa un almacenamiento global con enlaces duros. Los paquetes se almacenan una vez, ahorrando espacio en disco. Instalación más rápida y estricta.&lt;/p&gt;
&lt;h2 id="yarn"&gt;Yarn
&lt;/h2&gt;&lt;p&gt;Yarn Berry (v4+) con Plug&amp;rsquo;n&amp;rsquo;Play: sin node_modules, genera un solo archivo &lt;code&gt;.pnp.cjs&lt;/code&gt;. Resuelve dependencias más rápido. Zero-installs.&lt;/p&gt;</description></item><item><title>Gestión de tareas para desarrolladores</title><link>https://takao.blog/es/web/task-managenemt/</link><pubDate>Tue, 14 Jan 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/task-managenemt/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/task-management-es.png" alt="Featured image of post Gestión de tareas para desarrolladores" /&gt;&lt;p&gt;La gestión eficiente de tareas es crucial para la productividad del desarrollador. Sistemas como GTD, Kanban y timeboxing ayudan a organizar el trabajo.&lt;/p&gt;
&lt;h2 id="kanban"&gt;Kanban
&lt;/h2&gt;&lt;p&gt;Tablero visual: To Do, In Progress, Done. Limita el WIP (Work In Progress). Herramientas: GitHub Projects, Linear, Trello, Notion.&lt;/p&gt;
&lt;h2 id="gtd-getting-things-done"&gt;GTD (Getting Things Done)
&lt;/h2&gt;&lt;p&gt;Capturar, clarificar, organizar, reflexionar, ejecutar. Ideal para desarrolladores con muchas tareas interrumpidas.&lt;/p&gt;
&lt;h2 id="timeboxing"&gt;Timeboxing
&lt;/h2&gt;&lt;p&gt;Asigna bloques de tiempo fijos a tareas. Técnica Pomodoro (25 min trabajo, 5 min descanso). Evita el perfectionismo y la procrastinación.&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>Git Hooks: Automatización del flujo de trabajo</title><link>https://takao.blog/es/web/git-hooks-automation/</link><pubDate>Tue, 24 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/git-hooks-automation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-hooks-automation-es.png" alt="Featured image of post Git Hooks: Automatización del flujo de trabajo" /&gt;&lt;p&gt;Los hooks de Git son scripts que se ejecutan en eventos específicos del ciclo de vida de Git. Automatizan validaciones, pruebas y despliegues.&lt;/p&gt;
&lt;h2 id="hooks-del-lado-cliente"&gt;Hooks del lado cliente
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pre-commit&lt;/code&gt;: antes del mensaje de commit. &lt;code&gt;pre-push&lt;/code&gt;: antes del push. &lt;code&gt;post-commit&lt;/code&gt;: después del commit. &lt;code&gt;pre-rebase&lt;/code&gt;: antes del rebase.&lt;/p&gt;
&lt;h2 id="hooks-del-lado-servidor"&gt;Hooks del lado servidor
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pre-receive&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;post-receive&lt;/code&gt;. Se ejecutan en el repositorio remoto. Ideales para CI/CD y políticas de equipo.&lt;/p&gt;
&lt;h2 id="ejemplos-prácticos"&gt;Ejemplos prácticos
&lt;/h2&gt;&lt;p&gt;pre-commit: lint, formateo, pruebas rápidas. pre-push: tests completos, verificación de builds. post-commit: notificaciones, actualización de issues.&lt;/p&gt;</description></item><item><title>Rendimiento en Node.js: Optimización y profiling</title><link>https://takao.blog/es/web/nodejs-performance/</link><pubDate>Wed, 18 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/nodejs-performance/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-performance-es.png" alt="Featured image of post Rendimiento en Node.js: Optimización y profiling" /&gt;&lt;p&gt;Node.js puede manejar alto rendimiento si se optimizan correctamente el bucle de eventos, la memoria y las operaciones asíncronas.&lt;/p&gt;
&lt;h2 id="bucle-de-eventos"&gt;Bucle de eventos
&lt;/h2&gt;&lt;p&gt;No bloquees el event loop con operaciones síncronas pesadas. Usa &lt;code&gt;setImmediate()&lt;/code&gt;, &lt;code&gt;nextTick()&lt;/code&gt; y &lt;code&gt;Worker Threads&lt;/code&gt; para descargar trabajo.&lt;/p&gt;
&lt;h2 id="profiling"&gt;Profiling
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;--inspect&lt;/code&gt; + Chrome DevTools para CPU profiling. &lt;code&gt;--prof&lt;/code&gt; para logs de V8. &lt;code&gt;clinic.js&lt;/code&gt; (Doctor, Bubbleprof, Flame) para diagnóstico visual.&lt;/p&gt;
&lt;h2 id="gestión-de-memoria"&gt;Gestión de memoria
&lt;/h2&gt;&lt;p&gt;Evita fugas con correcta limpieza de listeners y referencias. Usa &lt;code&gt;heapdump&lt;/code&gt; o &lt;code&gt;v8.writeHeapSnapshot()&lt;/code&gt;. Monitorea con &lt;code&gt;process.memoryUsage()&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>WebAssembly (WASM): Aplicaciones nativas en el navegador</title><link>https://takao.blog/es/web/wasm-browser-apps/</link><pubDate>Sat, 30 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/wasm-browser-apps/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/wasm-browser-apps-es.png" alt="Featured image of post WebAssembly (WASM): Aplicaciones nativas en el navegador" /&gt;&lt;p&gt;WebAssembly (WASM) ejecuta código compilado (C, C++, Rust, Go) en el navegador a velocidad casi nativa. Abre nuevas posibilidades para aplicaciones web.&lt;/p&gt;
&lt;h2 id="rendimiento"&gt;Rendimiento
&lt;/h2&gt;&lt;p&gt;WASM es 10-40% más lento que código nativo pero mucho más rápido que JavaScript para cálculos intensivos. Compilado a binario, parseado en microsegundos.&lt;/p&gt;
&lt;h2 id="ecosistema"&gt;Ecosistema
&lt;/h2&gt;&lt;p&gt;Rust + wasm-pack: el más popular. C/C++ con Emscripten. Go, Zig, Kotlin también compilan a WASM. WASI para WASM fuera del navegador.&lt;/p&gt;
&lt;h2 id="casos-de-uso"&gt;Casos de uso
&lt;/h2&gt;&lt;p&gt;Procesamiento de imagen/video, juegos, simulaciones, compiladores, ofimática, cifrado. Figma, AutoCAD, Google Earth usan WASM.&lt;/p&gt;</description></item><item><title>Git LFS: Gestión de archivos grandes</title><link>https://takao.blog/es/web/git-lfs/</link><pubDate>Tue, 26 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/git-lfs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-lfs-es.png" alt="Featured image of post Git LFS: Gestión de archivos grandes" /&gt;&lt;p&gt;Git LFS (Large File Storage) reemplaza archivos grandes con punteros de texto en el repositorio, mientras almacena el contenido real en un servidor remoto.&lt;/p&gt;
&lt;h2 id="instalación"&gt;Instalación
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git lfs install&lt;/code&gt; configura Git para usar LFS. Luego &lt;code&gt;git lfs track &amp;quot;*.psd&amp;quot;&lt;/code&gt; para rastrear archivos grandes por patrón.&lt;/p&gt;
&lt;h2 id="flujo-de-trabajo"&gt;Flujo de trabajo
&lt;/h2&gt;&lt;p&gt;Los archivos LFS se usan como archivos normales. Git LFS maneja automáticamente la descarga/subida. El diff muestra el puntero, no el binario.&lt;/p&gt;
&lt;h2 id="límites-y-costos"&gt;Límites y costos
&lt;/h2&gt;&lt;p&gt;GitHub: 1GB gratis, luego pago por ancho de banda. Bitbucket y GitLab tienen políticas similares. Bandwidth se consume en push y pull.&lt;/p&gt;</description></item><item><title>Monorepos con Turborepo: Gestión eficiente de proyectos</title><link>https://takao.blog/es/web/monorepo-turborepo/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/monorepo-turborepo/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/monorepo-turborepo-es.png" alt="Featured image of post Monorepos con Turborepo: Gestión eficiente de proyectos" /&gt;&lt;p&gt;Turborepo es una herramienta de construcción de alto rendimiento para monorepos JavaScript/TypeScript. Acelera builds con caché y paralelización.&lt;/p&gt;
&lt;h2 id="por-qué-monorepo"&gt;Por qué monorepo
&lt;/h2&gt;&lt;p&gt;Código compartido entre proyectos, dependencias únicas, cambios atómicos, CI unificada. Ideal para equipos que mantienen múltiples paquetes.&lt;/p&gt;
&lt;h2 id="turborepo-vs-nx"&gt;Turborepo vs Nx
&lt;/h2&gt;&lt;p&gt;Turborepo: más simple, configuración mínima, caché remota integrada con Vercel. Nx: más características, generadores, migraciones automáticas.&lt;/p&gt;
&lt;h2 id="configuración"&gt;Configuración
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;turbo.json&lt;/code&gt; define pipeline de tareas. &lt;code&gt;dependsOn&lt;/code&gt; para orden de ejecución. &lt;code&gt;cache&lt;/code&gt; para outputs. &lt;code&gt;outputs&lt;/code&gt; para artefactos cacheados.&lt;/p&gt;</description></item><item><title>Patrones Serverless: Arquitecturas modernas</title><link>https://takao.blog/es/web/serverless-patterns/</link><pubDate>Tue, 17 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/serverless-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/serverless-patterns-es.png" alt="Featured image of post Patrones Serverless: Arquitecturas modernas" /&gt;&lt;p&gt;Serverless abstrae la infraestructura. El código se ejecuta en respuesta a eventos sin gestionar servidores. Escala automáticamente.&lt;/p&gt;
&lt;h2 id="funciones-como-unidad"&gt;Funciones como unidad
&lt;/h2&gt;&lt;p&gt;AWS Lambda, Cloudflare Functions, Vercel Functions, Deno Deploy. Una función por endpoint. Stateless por defecto. Límites de duración (15min Lambda, 30s Workers).&lt;/p&gt;
&lt;h2 id="bases-de-datos-serverless"&gt;Bases de datos serverless
&lt;/h2&gt;&lt;p&gt;PlanetScale, Neon, Supabase (SQL). DynamoDB, Firestore (NoSQL). Conexiones pooling automático. Escalado a cero cuando no se usa.&lt;/p&gt;
&lt;h2 id="patrón-api-gateway--funciones"&gt;Patrón: API Gateway + Funciones
&lt;/h2&gt;&lt;p&gt;API Gateway recibe solicitudes, enruta a funciones. Autenticación, rate limiting, validación en el gateway. Las funciones solo manejan lógica de negocio.&lt;/p&gt;</description></item><item><title>Logging en Node.js: Prácticas y herramientas</title><link>https://takao.blog/es/web/nodejs-logging/</link><pubDate>Tue, 06 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/nodejs-logging/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-logging-es.png" alt="Featured image of post Logging en Node.js: Prácticas y herramientas" /&gt;&lt;p&gt;El logging es esencial para depuración, monitoreo y análisis. Node.js ofrece &lt;code&gt;console.log&lt;/code&gt; pero las aplicaciones en producción necesitan más.&lt;/p&gt;
&lt;h2 id="niveles-de-log"&gt;Niveles de log
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;error&lt;/code&gt;, &lt;code&gt;warn&lt;/code&gt;, &lt;code&gt;info&lt;/code&gt;, &lt;code&gt;debug&lt;/code&gt;, &lt;code&gt;trace&lt;/code&gt;. Configura el nivel mínimo: en producción solo &lt;code&gt;info&lt;/code&gt; y superiores, en desarrollo también &lt;code&gt;debug&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="bibliotecas-populares"&gt;Bibliotecas populares
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Pino&lt;/strong&gt;: rápido, JSON nativo, niveles, child loggers. &lt;strong&gt;Winston&lt;/strong&gt;: flexible, transports múltiples (archivo, consola, remoto). &lt;strong&gt;Bunyan&lt;/strong&gt;: JSON con soporte de streams.&lt;/p&gt;
&lt;h2 id="formato-json"&gt;Formato JSON
&lt;/h2&gt;&lt;p&gt;Los logs en JSON son parseables por herramientas de análisis (ELK, Datadog, Grafana). Incluye timestamp, nivel, mensaje, contexto y correlation ID.&lt;/p&gt;</description></item><item><title>Web Bluetooth API: Conexión con dispositivos BLE</title><link>https://takao.blog/es/web/web-bluetooth-api/</link><pubDate>Tue, 23 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/web-bluetooth-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-bluetooth-api-es.png" alt="Featured image of post Web Bluetooth API: Conexión con dispositivos BLE" /&gt;&lt;p&gt;La Web Bluetooth API permite que aplicaciones web se comuniquen con dispositivos Bluetooth Low Energy (BLE) cercanos.&lt;/p&gt;
&lt;h2 id="cómo-funciona"&gt;Cómo funciona
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;navigator.bluetooth.requestDevice()&lt;/code&gt; muestra un selector de dispositivos. Requiere interacción del usuario (click). Solo HTTPS.&lt;/p&gt;
&lt;h2 id="servicios-y-características"&gt;Servicios y características
&lt;/h2&gt;&lt;p&gt;Los dispositivos BLE exponen servicios (UUIDs) con características (lectura, escritura, notificaciones). &lt;code&gt;getPrimaryService()&lt;/code&gt;, &lt;code&gt;getCharacteristic()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="casos-de-uso"&gt;Casos de uso
&lt;/h2&gt;&lt;p&gt;Monitoreo de sensores (temperatura, ritmo cardíaco), IoT, balizas, dispositivos de fitness, impresoras, controles remotos.&lt;/p&gt;
&lt;h2 id="limitaciones"&gt;Limitaciones
&lt;/h2&gt;&lt;p&gt;Solo Chrome/Edge (Chromium). El usuario debe seleccionar el dispositivo manualmente. No hay escaneo en segundo plano. Desconexión al cerrar la página.&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>Squash Merge: Limpieza de historial en GitHub</title><link>https://takao.blog/es/web/git-squash-merge/</link><pubDate>Tue, 21 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/git-squash-merge/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-squash-merge-es.png" alt="Featured image of post Squash Merge: Limpieza de historial en GitHub" /&gt;&lt;p&gt;Squash merge combina todos los commits de una rama en un solo commit al mergear. Produce un historial limpio sin commits de WIP ni experimentales.&lt;/p&gt;
&lt;h2 id="cómo-funciona"&gt;Cómo funciona
&lt;/h2&gt;&lt;p&gt;GitHub (y GitLab) ofrecen squash merge como opción al fusionar PRs. Todos los commits de la rama se comprimen en uno con un mensaje nuevo.&lt;/p&gt;
&lt;h2 id="beneficios"&gt;Beneficios
&lt;/h2&gt;&lt;p&gt;Historial lineal y legible. Cada commit en main representa una característica completa. Fácil revertir características enteras con un solo revert.&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>GitHub Actions: Técnicas avanzadas</title><link>https://takao.blog/es/web/github-actions-advanced/</link><pubDate>Tue, 16 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/github-actions-advanced/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/github-actions-advanced-es.png" alt="Featured image of post GitHub Actions: Técnicas avanzadas" /&gt;&lt;p&gt;Más allá de los workflows básicos, GitHub Actions ofrece matrices, reutilización, entornos y despliegues avanzados.&lt;/p&gt;
&lt;h2 id="build-matrix"&gt;Build Matrix
&lt;/h2&gt;&lt;p&gt;Ejecuta el mismo job en múltiples configuraciones: SO, versión de Node, dependencias. Acelera la retroalimentación de compatibilidad.&lt;/p&gt;
&lt;h2 id="reusable-workflows"&gt;Reusable Workflows
&lt;/h2&gt;&lt;p&gt;Define un workflow en &lt;code&gt;.github/workflows/reusable.yml&lt;/code&gt; con &lt;code&gt;workflow_call&lt;/code&gt;. Reutiliza en otros workflows con &lt;code&gt;uses: ./&lt;/code&gt;. Reduce duplicación.&lt;/p&gt;
&lt;h2 id="entornos-y-approval-gates"&gt;Entornos y approval gates
&lt;/h2&gt;&lt;p&gt;Entornos con reviewers requeridos antes de desplegar a producción. Variables de entorno y secretos por ambiente. Protección de ramas.&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>Service Workers: Experiencia offline y caché avanzada</title><link>https://takao.blog/es/web/service-workers-offline/</link><pubDate>Mon, 12 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/service-workers-offline/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/service-workers-offline-es.png" alt="Featured image of post Service Workers: Experiencia offline y caché avanzada" /&gt;&lt;p&gt;Los Service Workers actúan como proxy entre el navegador y la red. Permiten experiencias offline, sincronización en segundo plano y push notifications.&lt;/p&gt;
&lt;h2 id="ciclo-de-vida"&gt;Ciclo de vida
&lt;/h2&gt;&lt;p&gt;Instalación → Activación → Fetch. &lt;code&gt;self.addEventListener('install')&lt;/code&gt; para precargar recursos. &lt;code&gt;activate&lt;/code&gt; para limpiar cachés antiguas.&lt;/p&gt;
&lt;h2 id="estrategias-de-caché"&gt;Estrategias de caché
&lt;/h2&gt;&lt;p&gt;Cache First: para assets estáticos. Network First: para APIs. Stale While Revalidate: balance. Network Only: datos sensibles. Cache Only: recursos offline.&lt;/p&gt;
&lt;h2 id="offline-primero"&gt;Offline primero
&lt;/h2&gt;&lt;p&gt;Precarga recursos en &lt;code&gt;install&lt;/code&gt;. Sirve desde caché en &lt;code&gt;fetch&lt;/code&gt;. Actualiza en segundo plano. Sincroniza cambios cuando vuelve la conexión (Background Sync).&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>Git Submodules: Dependencias anidadas</title><link>https://takao.blog/es/web/git-submodules/</link><pubDate>Mon, 22 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/git-submodules/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-submodules-es.png" alt="Featured image of post Git Submodules: Dependencias anidadas" /&gt;&lt;p&gt;Los submódulos de Git permiten incluir un repositorio dentro de otro como una referencia versionada. Mantienen independencia de historial.&lt;/p&gt;
&lt;h2 id="añadir-un-submódulo"&gt;Añadir un submódulo
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;/code&gt; clona el repositorio y crea un archivo &lt;code&gt;.gitmodules&lt;/code&gt;. El commit padre registra el hash exacto del submódulo.&lt;/p&gt;
&lt;h2 id="clonar-con-submódulos"&gt;Clonar con submódulos
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git clone --recurse-submodules &amp;lt;url&amp;gt;&lt;/code&gt; clona el proyecto y todos los submódulos. Para repos existentes: &lt;code&gt;git submodule update --init --recursive&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="actualizar-submódulos"&gt;Actualizar submódulos
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git submodule update --remote&lt;/code&gt; actualiza al último commit de la rama configurada. Luego commitear el cambio de hash en el repositorio padre.&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>Cloudflare Pages: Despliegue de sitios estáticos</title><link>https://takao.blog/es/web/cloudflare-pages/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/cloudflare-pages/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-cloudflare-pages-es.png" alt="Featured image of post Cloudflare Pages: Despliegue de sitios estáticos" /&gt;&lt;p&gt;Cloudflare Pages aloja sitios estáticos y aplicaciones Jamstack con integración directa desde repositorios de Git.&lt;/p&gt;
&lt;h2 id="configuración-inicial"&gt;Configuración inicial
&lt;/h2&gt;&lt;p&gt;Conecta tu repositorio (GitHub/GitLab). Selecciona la rama, framework (Hugo, Next, React) y comandos de build. Despliegue automático en cada push.&lt;/p&gt;
&lt;h2 id="funciones-serverless"&gt;Funciones serverless
&lt;/h2&gt;&lt;p&gt;Cloudflare Functions ejecutan código en el edge. Basadas en Workers. Formularios, autenticación, APIs ligeras.&lt;/p&gt;
&lt;h2 id="ramas-y-previsualizaciones"&gt;Ramas y previsualizaciones
&lt;/h2&gt;&lt;p&gt;Deploy preview por PR. Ramas de producción y staging. URLs únicas por preview. Ideal para revisión de cambios.&lt;/p&gt;</description></item><item><title>Guía de Cloudflare para desarrolladores web</title><link>https://takao.blog/es/web/cloudflare/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/cloudflare/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-cloudflare-es.png" alt="Featured image of post Guía de Cloudflare para desarrolladores web" /&gt;&lt;p&gt;Cloudflare ofrece CDN, seguridad, DNS y optimización de rendimiento para sitios web. Configurarlo correctamente mejora velocidad y protección.&lt;/p&gt;
&lt;h2 id="configuración-dns"&gt;Configuración DNS
&lt;/h2&gt;&lt;p&gt;Añade tu dominio, configura registros DNS (A, CNAME, MX). Activa el proxy naranja (proxy) para proteger IPs de origen y activar optimizaciones.&lt;/p&gt;
&lt;h2 id="ssltls"&gt;SSL/TLS
&lt;/h2&gt;&lt;p&gt;Modos: Off, Flexible, Full, Full (strict). Recomendado: Full (strict) con certificado de origen. HSTS para forzar HTTPS.&lt;/p&gt;
&lt;h2 id="reglas-de-page-rules-y-waf"&gt;Reglas de Page Rules y WAF
&lt;/h2&gt;&lt;p&gt;Reglas de caché, redirecciones, seguridad por ruta. Firewall con reglas custom, rate limiting y protección DDoS.&lt;/p&gt;</description></item><item><title>Google Analytics para desarrolladores</title><link>https://takao.blog/es/web/google-analytics/</link><pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/google-analytics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-google-analytics-es.png" alt="Featured image of post Google Analytics para desarrolladores" /&gt;&lt;p&gt;Google Analytics 4 (GA4) es la plataforma de análisis de Google. Los desarrolladores deben implementarlo correctamente para obtener datos precisos.&lt;/p&gt;
&lt;h2 id="implementación"&gt;Implementación
&lt;/h2&gt;&lt;p&gt;GTag: &lt;code&gt;gtag('config', 'G-XXXXXXXXXX')&lt;/code&gt;. GA4 Measurement ID. Eventos recomendados: &lt;code&gt;page_view&lt;/code&gt;, &lt;code&gt;scroll&lt;/code&gt;, &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;view_item&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="eventos-personalizados"&gt;Eventos personalizados
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;gtag('event', 'tutorial_completed', { name: 'React Guide' })&lt;/code&gt;. Hasta 25 parámetros por evento. Eventos únicos para acciones clave del negocio.&lt;/p&gt;
&lt;h2 id="privacidad-y-gdpr"&gt;Privacidad y GDPR
&lt;/h2&gt;&lt;p&gt;Anonimización de IP (automática en GA4). Consent Mode para cumplir con regulaciones. Sin cookies de terceros para mediciones básicas.&lt;/p&gt;</description></item><item><title>Guía de OWASP ZAP para pruebas de seguridad</title><link>https://takao.blog/es/web/owasp-zap/</link><pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/owasp-zap/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-owasp-zap-es.png" alt="Featured image of post Guía de OWASP ZAP para pruebas de seguridad" /&gt;&lt;p&gt;OWASP ZAP (Zed Attack Proxy) es una herramienta de seguridad open source para encontrar vulnerabilidades en aplicaciones web.&lt;/p&gt;
&lt;h2 id="instalación"&gt;Instalación
&lt;/h2&gt;&lt;p&gt;Descarga desde zaproxy.org. Versión con JRE incluida. O via Docker: &lt;code&gt;docker pull softwaresecurityproject/zap-stable&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="escaneo-automático"&gt;Escaneo automático
&lt;/h2&gt;&lt;p&gt;Spider: rastrea URLs. Active Scan: inyecta payloads de seguridad. Modo automático: &lt;code&gt;zap -quickurl https://target.com&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="integración-cicd"&gt;Integración CI/CD
&lt;/h2&gt;&lt;p&gt;ZAP API para automatización. &lt;code&gt;zap-full-scan.py&lt;/code&gt; para escaneo completo. &lt;code&gt;zap-api-scan.py&lt;/code&gt; para APIs. Reports en JSON/HTML.&lt;/p&gt;
&lt;h2 id="principales-hallazgos"&gt;Principales hallazgos
&lt;/h2&gt;&lt;p&gt;XSS, SQL Injection, CSRF, missing headers (CSP, HSTS), authentication bypass, directory traversal, información sensible expuesta.&lt;/p&gt;</description></item><item><title>Wayback Machine: Archivo de la web para desarrolladores</title><link>https://takao.blog/es/web/waybackmachine/</link><pubDate>Mon, 11 Sep 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/waybackmachine/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/wayback-machine-es.png" alt="Featured image of post Wayback Machine: Archivo de la web para desarrolladores" /&gt;&lt;p&gt;The Wayback Machine (archive.org) archiva páginas web desde 1996. Útil para desarrolladores para debugging, análisis y referencia histórica.&lt;/p&gt;
&lt;h2 id="casos-de-uso"&gt;Casos de uso
&lt;/h2&gt;&lt;p&gt;Recuperar código perdido, analizar cambios de diseño/SEO de competidores, verificar contenido histórico, debugging de cambios que rompieron algo.&lt;/p&gt;
&lt;h2 id="api"&gt;API
&lt;/h2&gt;&lt;p&gt;Disponible en &lt;code&gt;https://archive.org/help/wayback_api_usage.html&lt;/code&gt;. Búsqueda por URL y rango de fechas. Save Page Now para archivar páginas.&lt;/p&gt;
&lt;h2 id="integración-con-desarrollo"&gt;Integración con desarrollo
&lt;/h2&gt;&lt;p&gt;Ver cómo cambiaron las APIs de terceros. Recuperar documentación eliminada. Analizar la evolución de estándares web.&lt;/p&gt;</description></item></channel></rss>