este artículo.\n\n- `repository`: Aquí puedes especificar la URL de tu repositorio de código. No es obligatorio, pero es útil si quieres que otros desarrolladores puedan encontrar tu código fuente.\n\n```json\n{\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/baumannzone/mi-super-app\"\n }\n}\n```\n\n## Ejemplo completo\n\nEste es un ejemplo completo del `package.json` de esta web que estás leyendo ahora mismo, que es un proyecto Astro:\n\n```json\n{\n \"name\": \"baumannzone-astro\",\n \"type\": \"module\",\n \"version\": \"0.0.1\",\n \"scripts\": {\n \"dev\": \"astro dev\",\n \"start\": \"astro dev\",\n \"build\": \"astro build\",\n \"preview\": \"astro preview\",\n \"astro\": \"astro\"\n },\n \"dependencies\": {\n \"@astrojs/mdx\": \"^3.1.6\",\n \"@astrojs/rss\": \"^4.0.7\",\n \"@astrojs/sitemap\": \"^3.1.6\",\n \"@astrojs/tailwind\": \"^5.1.0\",\n \"@tailwindcss/typography\": \"^0.5.13\",\n \"astro\": \"^4.15.6\",\n \"tailwindcss\": \"^3.4.3\"\n },\n \"devDependencies\": {\n \"sharp\": \"^0.33.4\"\n }\n}\n```\n\nAquí puedes ver las dependencias que usa este proyecto y qué versiones se están utilizando.\n\n---\n\nExisten muchas más propiedades (como `homepage`, `engines`, `peerDependencies`, etc.) que puedes añadir a tu `package.json`, pero estas son las más comunes y las que deberías conocer para empezar.\n\n## El drama de los gestores de paquetes\n\nAhora, hablemos de algo un poco más controversial: los gestores de paquetes. Es como la guerra de las consolas, pero para developers.\n\n### npm\n\nnpm (_node package manager_) es el gestor de paquetes por defecto en Node.js, y aunque otros han surgido, sigue siendo el más utilizado en la comunidad. Tiene sus defectos, pero lo conoces bien y sabes cómo funciona.\n\n### Yarn\n\nYarn fue desarrollado por Facebook como una alternativa a npm, con el objetivo de resolver problemas de consistencia, seguridad y rendimiento. Fue muy popular en su lanzamiento, pero ha perdido algo de tracción en los últimos años.\n\n### pnpm\n\n`pnpm` (_performant npm_) es otra alternativa que se centra en la eficiencia del almacenamiento y la velocidad de instalación. En lugar de instalar paquetes en carpetas separadas, pnpm crea enlaces simbólicos a los paquetes compartidos. Es lo que podrías llamar \"el chico nuevo del barrio\".\n\n### bun\n\nBun es una herramienta todo en uno que incluye un runtime de JavaScript, un bundler, un test runner y un gestor de paquetes. Lanzado más recientemente que Yarn y pnpm, Bun se ha ganado rápidamente popularidad debido a su enfoque en el rendimiento y por su velocidad. Si lo usas a día de hoy en producción, es porque eres un hipster profesional.\n\n## ¿Cuál elegir?\n\nDepende. Por lo general, cualquiera de estas herramientas hará el trabajo que necesitas. **npm** es el más común, **Yarn** vino con fuerza pero ahora nadie lo usa, **pnpm** es el que uso actualmente, y **Bun** acaba de salir y parece prometedor.\n\n¿Mi consejo? **pruébalos todos**. Usa el que te resulte más cómodo y que mejor se adapte a tu flujo de trabajo. No hay una respuesta correcta, solo la que funcione mejor para ti.\n\nLo importante es que, sin importar qué herramienta uses, `package.json` sigue siendo el jefe.\n\n## Conclusión\n\n`package.json` es un archivo esencial en casi cualquier proyecto de JavaScript. Asegúrate de entender cómo funciona y qué propiedades puedes añadir para mejorar la calidad de tu proyecto.\n","collection":"blog","data":{"title":"Entendiendo package.json: una guía para dummies","description":"Este artículo te guía a través de los conceptos fundamentales del package.json, revisando sus propiedades esenciales y qué gestores de paquetes puedes usar.","pubDate":"2024-09-23T00:00:00.000Z","published":true,"tags":["JavaScript","Node.js","Fundamentals"],"author":"Jorge Baumann","type":"blog","ogImage":"https://baumannzone-dev-og.vercel.app/api/og?title=Entendiendo%20package.json%3A%20una%20gu%C3%ADa%20para%20dummies&tags=JavaScript,Node.js,Fundamentals"}},{"id":"la-gran-mentira-de-letter-spacing-en-css-que-no-sabias.md","slug":"la-gran-mentira-de-letter-spacing-en-css-que-no-sabias","body":"\nEl espaciado de letras o letter-spacing en CSS parece una propiedad sencilla, ¿verdad? Ajustar el espacio entre letras no debería ser un problema. Pero te han mentido. Lo que parece inofensivo puede estar desmoronando la estética de tus diseños sin que lo notes.\n\nEs probable que hayas estado usando mal el espaciado de letras todo este tiempo. Y lo peor es que este error pasa desapercibido para la mayoría de los desarrolladores y diseñadores. Sus efectos se manifiestan en la alineación y el ritmo visual de tus textos.\n\nPero no te preocupes, hoy entenderás por qué `letter-spacing` está roto en CSS.\n\n## ¿Qué es `letter-spacing` en CSS?\n\nLa pregunta es obvia, pero vale la pena responderla. `letter-spacing` es una propiedad de CSS que te permite ajustar el espacio entre las letras de un texto. Puedes usar valores positivos o negativos para aumentar o disminuir el espacio entre las letras.\n\n```css\nh1 {\n letter-spacing: 16px;\n}\n```\n\nEn este caso, el espaciado entre las letras de todos los títulos `` será de `16px`. Si quieres reducir el espacio, puedes usar un valor más pequeño o un valor negativo:\n\n```css\nh1 {\n letter-spacing: -2px;\n}\n```\n\n## ¿Por qué `letter-spacing` está roto?\n\nLa especificación dice lo siguiente: \"_This property specifies additional spacing between adjacent typographic character units._\" (traducido: \"Esta propiedad especifica el espaciado adicional entre unidades de caracteres tipográficos adyacentes\").\n\nPor lo tanto, que si tienes este código HTML:\n\n```html\n
abcd\n```\n\ny este código CSS:\n\n```css\np {\n letter-spacing: 1rem;\n}\n\nspan {\n letter-spacing: 2rem;\n}\n```\n\nEl resultado debería ser algo así:\n\n\n\nEs decir, que el espaciado entre las letras `a` y `b` y entre las letras `c` y `d` debería ser de `1rem` y entre las letras `b` y `c` debería ser de `2rem`.\n\nSin embargo, si ejecutas este código en Chrome, verás que el espacio entre las letras `c` y `d` también es de `2rem`:\n\n\n\nEsto es un error en la implementación de la propiedad `letter-spacing` en los navegadores. En lugar de aplicar el espaciado solo entre las letras adyacentes, también lo aplica al final, por lo que el espaciado entre las letras `c` y `d` es de `2rem` en lugar de `1rem`.\n\n\n\n## ¿Qué esperar en el futuro?\n\nDesde el [CSSWG](https://github.com/w3c/csswg-drafts/issues/10193) ya han reconocido el problema y se espera que en futuras versiones se realicen mejoras para corregir este comportamiento, así que solo queda esperar y estar atentos a las actualizaciones.\n\nAhora ya sabes por qué `letter-spacing` está roto en CSS.\n","collection":"blog","data":{"title":"La gran mentira de letter-spacing en CSS que no sabías","description":"Te han mentido sobre letter-spacing en CSS. No funciona como crees. ¿Llevas años usando mal el espaciado de letras? Spoiler: sí. Este error silencioso está arruinando tu tipografía, y ni siquiera te diste cuenta.","pubDate":"2024-09-16T00:00:00.000Z","updatedDate":"2024-09-17T00:00:00.000Z","published":true,"tags":["TIL","CSS"],"author":"Jorge Baumann","type":"blog","ogImage":"https://baumannzone-dev-og.vercel.app/api/og?title=La%20gran%20mentira%20de%20letter-spacing%20en%20CSS%20que%20no%20sab%C3%ADas&tags=TIL,CSS"}},{"id":"como-detectar-el-elemento-con-el-foco-en-tiempo-real.md","slug":"como-detectar-el-elemento-con-el-foco-en-tiempo-real","body":"\nSaber qué elemento HTML tiene el foco (`focus`) en tu navegador puede ser un poco complicado, ya que si quieres usar JavaScript para detectarlo, tendrías que estar constantemente revisando si el foco cambió con un evento de escucha.\n\nAfortunadamente, la consola de tu navegador tiene una funcionalidad llamada \"live expressions\" que te permite ejecutar expresiones en tiempo real.\n\nPara detectar el elemento con el foco en tiempo real, sigue estos pasos:\n\n- Abre las Developer Tools de tu navegador, en la pestaña de consola. Puedes abrir las DevTools presionando `F12` o `Cmd` + `Option` + `I` (en macOS).\n- En la parte superior verás un botón con un icono en forma de ojo. Haz clic en él para crear una expresión en vivo.\n- En el cuadro de texto que aparece, escribe `document.activeElement`. Este código hace referencia al elemento del DOM que tiene el foco en ese momento.\n- Ahora navega por la página haciendo clic o usando la tecla de tabulación (`Tab`) para cambiar el foco entre los elementos interactivos. La expresión en vivo se actualizará automáticamente para reflejar cuál es el elemento que tiene el foco en ese momento.\n\n\n\nCon esta sencilla técnica, puedes ver de forma dinámica qué elemento tiene el foco en cualquier momento mientras interactúas con tu página web.\n\n¿Qué otros casos de uso conoces para las \"_live expressions_\" de la consola de tu navegador? ¡Déjame un comentario abajo!\n","collection":"blog","data":{"title":"Cómo detectar el elemento con el foco en tiempo real","description":"Aprende a usar las \"live expressions\" de la consola de tu navegador para detectar qué elemento HTML tiene el focus en tiempo real.","pubDate":"2024-09-01T00:00:00.000Z","published":true,"tags":["DevTools","JavaScript"],"author":"Jorge Baumann","type":"blog","ogImage":"https://baumannzone-dev-og.vercel.app/api/og?title=C%C3%B3mo%20detectar%20el%20elemento%20con%20el%20foco%20en%20tiempo%20real&tags=DevTools,JavaScript"}},{"id":"nan-en-javascript-guia-rapida.md","slug":"nan-en-javascript-guia-rapida","body":"\nUna chuleta (_cheatsheet_) sobre `NaN` (_Not a Number_) en JavaScript.\n\n## Propiedades y funciones\n\nJavaScript tiene la propiedad global `NaN` y dos funciones para verificar valores `NaN`.\n\n### Propiedad global `NaN`\n\n- Representa _Not a Number_ (_No es un Número_)\n- Es el resultado de expresiones que deberían producir un número pero fallaron (por ejemplo, `Math.sqrt(-1)`)\n- Es de tipo número: `typeof NaN === 'number'`\n- `NaN` es distinto de `NaN`: `NaN === NaN` es `false`\n\n### Función `isNaN()`\n\n- Verifica si el valor es `NaN` después de convertirlo a un número\n- Devuelve `true` si el valor es NaN\n- Devuelve `true` si el valor no se puede convertir a un número (como `\"Baumann\"`)\n- Devuelve `false` si el valor se puede convertir a un número (como `string: \"36\"`)\n- Devuelve `false` si el valor es un número válido (como `number: 36`)\n\n### Función `Number.isNaN()`\n\n- Sin convertir el valor a un número, verifica si el valor es `NaN`\n- Devuelve `true` si el valor es `NaN`\n- Devuelve `false` para el resto de los valores\n\n## Generando NaN\n\nHay varias maneras de producir un valor `NaN`.\n\n### Convertir a número\n\nConvertir un valor a un número que no se puede convertir a un número resulta en `NaN`.\n\n```javascript\nNumber(\"WTF\");\n```\n\n```javascript\nparseInt(\"Baumann\");\n```\n\n```javascript\nparseFloat(\"Rambito.js\");\n```\n\n### No es un número real\n\nHacer una operación matemática donde el resultado no es un número real resulta en `NaN`.\n\n```javascript\n0 / 0;\n```\n\n```javascript\nMath.sqrt(-1);\n```\n\n```javascript\nInfinity - Infinity;\n```\n\n### Operación con NaN\n\nHacer una operación matemática con `NaN` resulta en `NaN`.\n\n```javascript\n1 * NaN;\n```\n\n```javascript\n2 + NaN;\n```\n\n```javascript\nNaN / NaN;\n```\n\n### Forma indeterminada\n\nOperaciones que están en formas indefinidas producen `NaN`.\n\n```javascript\nundefined * 2;\n```\n\n```javascript\nundefined + undefined;\n```\n\n### Operaciones con cadena de texto\n\nHacer una operación con un string que no se puede convertir a un número produce `NaN`, excepto las operaciones de suma, que unen los valores.\n\n```javascript\n\"Rambito.js\" * 2; // => NaN\n```\n\n```javascript\n\"Hola\" + 2; // => \"Hola2\"\n```\n\n## Extra 🚀\n\n\n \n 🤯 Si le preguntas a Siri \"¿Cuánto es 0 dividido por 0?\", te dirá esto:\n \n\nHace algunos años, Siri respondía con esta brillante respuesta:\n\n> Imaginas que tienes 0 galletas y las repartes entre 0 amigos. ¿Cuántas galletas le tocan a cada amigo? No tiene sentido, ¿lo ves?
Así que el monstruo de las galletas está triste porqué no tiene galletas y tu estás triste porque no tienes amigos.\n\n\n","collection":"blog","data":{"title":"NaN en JavaScript: guía rápida para desarrolladores","description":"¿Qué es NaN en JavaScript? En esta cheatsheet te explico todo lo que necesitas saber sobre NaN en JavaScript y cómo se generan los valores NaN en JavaScript.","pubDate":"2024-08-20T00:00:00.000Z","published":true,"tags":["JavaScript","Cheatsheet"],"author":"Jorge Baumann","type":"blog","ogImage":"https://baumannzone-dev-og.vercel.app/api/og?title=NaN%20en%20JavaScript%3A%20gu%C3%ADa%20r%C3%A1pida%20para%20desarrolladores&tags=JavaScript,Cheatsheet"}},{"id":"no-uses-google-analytics-nunca-mas.md","slug":"no-uses-google-analytics-nunca-mas","body":"\nDurante años, Google Analytics ha sido mi herramienta favorita para analizar el tráfico de mis webs. Sin embargo, he decidido abandonarla en favor de una alternativa más respetuosa con la privacidad: **Fathom Analytics**. Aquí te cuento por qué.\n\n## El lado oscuro de Google Analytics\n\nGoogle Analytics es popular por una razón: es gratuito y ofrece una gran cantidad de datos. Pero, ¿a qué precio? Cuando algo es gratis, **usualmente tú y tus usuarios sois el producto**. En el caso de Google Analytics, la privacidad de tus usuarios es el precio que pagas por usar la herramienta.\n\n## La importancia de la privacidad\n\nEn la era digital, la privacidad es un bien preciado. Los usuarios confían en nosotros para proteger sus datos, y es nuestra responsabilidad hacerlo. Google Analytics no solo recolecta datos en masa, sino que también los comparte con terceros. ¿Realmente queremos ser cómplices de esto?\n\n## Una alternativa respetuosa a Google Analytics\n\nDecidí buscar una alternativa más ética y encontré Fathom Analytics. La transición fue sorprendentemente sencilla, aunque acostumbrados a tener todo gratis, el precio de Fathom Analytics puede parecer un poco elevado. Sin embargo, la privacidad de mis usuarios es más importante que unos cuantos dólares al mes.\n\nCon **una sola línea de código**, pude implementar Fathom y comenzar a recibir datos sin comprometer la privacidad de mis usuarios.\n\nAsí es como se ve la línea de código de Fathom:\n\n```javascript\n