[{"data":1,"prerenderedAt":3118},["ShallowReactive",2],{"es-main-blog_es-\u002Fes\u002Fblog\u002Fapt-install-node-26-on-ubuntu-26\u002F":3,"es-alternative-blog_en-\u002Fblog\u002Fapt-install-node-26-on-ubuntu-26":1715,"blog_es-related-\u002Fes\u002Fblog\u002Fapt-install-node-26-on-ubuntu-26\u002F":3065},{"id":4,"title":5,"body":6,"date":1701,"description":1702,"extension":1703,"image":1704,"meta":1705,"navigation":767,"path":1706,"readingTime":1707,"schemaOrg":1704,"seo":1708,"stem":1709,"tags":1710,"toc":1713,"updatedAt":1704,"__hash__":1714},"blog_es\u002Fes\u002Fblog\u002F0004.apt-install-node-26-on-ubuntu-26.md","Instalar Node.js 26 con apt en Ubuntu 26.04",{"type":7,"value":8,"toc":1686},"minimark",[9,21,39,67,72,75,128,143,147,169,192,196,214,246,257,263,291,295,298,303,306,339,342,370,385,389,416,424,428,434,466,481,502,506,514,535,553,557,567,598,602,605,629,641,645,650,665,1587,1591,1594,1655,1665,1679,1682],[10,11,12,13,20],"p",{},"El 21 de octubre de 2026, Node.js publicó ",[14,15,19],"a",{"href":16,"rel":17},"https:\u002F\u002Fnodejs.org\u002Fen\u002Fblog\u002Fvulnerability\u002Foctober-2026-security-releases",[18],"nofollow","parches de seguridad"," para diez vulnerabilidades que afectan a sus versiones con soporte, cuatro de ellas graves, incluida una ejecución remota de código. Las versiones sin soporte, como Node.js 20 y 25, no recibirán actualizaciones.",[10,22,23,24,28,29,34,35,38],{},"Mantener Node.js al día no es opcional: merece la pena dedicarle un rato, tanto en tu ordenador personal como en tu servidor. Lo más sencillo es que sea el propio sistema operativo quien gestione esas actualizaciones. Para eso, instalas Node.js con ",[25,26,27],"code",{},"apt"," desde el repositorio de ",[14,30,33],{"href":31,"rel":32},"https:\u002F\u002Fnodesource.com\u002F",[18],"NodeSource"," y ",[25,36,37],{},"sudo apt upgrade"," se encarga del resto.",[10,40,41,42,47,48,52,53,47,58,61,62,66],{},"Ahora que ",[14,43,46],{"href":44,"rel":45},"https:\u002F\u002Fnodejs.org\u002F",[18],"Node.js 26"," (",[49,50,51],"em",{},"Lithium",") es LTS desde el 28 de octubre de 2026 y ",[14,54,57],{"href":55,"rel":56},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Frelease-notes\u002F26.04\u002F",[18],"Ubuntu 26.04 LTS",[49,59,60],{},"Resolute Raccoon",") lleva meses publicado, es buen momento para dejarlo bien instalado. La receta es la misma que en mi ",[14,63,65],{"href":64},"\u002Fes\u002Fblog\u002Finstall-node-24-on-ubuntu-24\u002F","guía de Node.js 24 en Ubuntu 24",".",[68,69,71],"h2",{"id":70},"fechas-de-soporte-de-un-vistazo","Fechas de soporte de un vistazo",[10,73,74],{},"Las dos versiones tienen periodos de soporte largos, así que esta instalación te va a durar una buena temporada:",[76,77,78,97],"table",{},[79,80,81],"thead",{},[82,83,84,88,91,94],"tr",{},[85,86,87],"th",{},"Versión",[85,89,90],{},"Publicación",[85,92,93],{},"LTS \u002F soporte estándar",[85,95,96],{},"Fin de vida",[98,99,100,115],"tbody",{},[82,101,102,106,109,112],{},[103,104,105],"td",{},"Node.js 26 (Lithium)",[103,107,108],{},"5 de mayo de 2026",[103,110,111],{},"Active LTS desde el 28 de octubre de 2026",[103,113,114],{},"30 de abril de 2029",[82,116,117,119,122,125],{},[103,118,57],{},[103,120,121],{},"23 de abril de 2026",[103,123,124],{},"Soporte estándar hasta abril de 2031",[103,126,127],{},"ESM con Ubuntu Pro durante 10 años",[10,129,130,131,136,137,142],{},"Node.js 26 pasa a mantenimiento el 20 de octubre de 2027 (lo tienes en el ",[14,132,135],{"href":133,"rel":134},"https:\u002F\u002Fgithub.com\u002Fnodejs\u002FRelease#release-schedule",[18],"calendario oficial",") y es la última versión del modelo de pares e impares: a partir de ",[14,138,141],{"href":139,"rel":140},"https:\u002F\u002Fnodejs.org\u002Fes\u002Fblog\u002Fannouncements\u002Fevolving-the-nodejs-release-schedule",[18],"Node.js 27",", el proyecto publica una sola versión mayor al año y todas pasan a ser LTS. Si sigues en Node.js 24, tranquilidad: tiene soporte hasta abril de 2028 (y Node.js 22, hasta abril de 2027).",[68,144,146],{"id":145},"qué-ha-cambiado-desde-nodejs-24","Qué ha cambiado desde Node.js 24",[10,148,149,150,154,155,158,159,164,165,168],{},"Casi todos los pasos son iguales, pero hay un cambio importante: ",[151,152,153],"strong",{},"Corepack ya no viene incluido con Node.js",". Se eliminó en Node.js 25, así que ",[25,156,157],{},"corepack enable"," no funciona en una instalación limpia de Node.js 26. La ",[14,160,163],{"href":161,"rel":162},"https:\u002F\u002Fnodejs.org\u002Fdocs\u002Flatest-v25.x\u002Fapi\u002Fcorepack.html",[18],"documentación de Node.js"," recomienda usar el paquete ",[25,166,167],{},"corepack"," de npm si todavía lo necesitas.",[10,170,171,172,177,178,183,184,186,187,191],{},"Yo he optado por lo más sencillo y ahora instalo ",[14,173,176],{"href":174,"rel":175},"https:\u002F\u002Fpnpm.io\u002F",[18],"pnpm"," con su propio instalador. Si usas ",[14,179,182],{"href":180,"rel":181},"https:\u002F\u002Fyarnpkg.com\u002F",[18],"Yarn",", puedes instalar el paquete ",[25,185,167],{}," de forma global (lo vemos ",[14,188,190],{"href":189},"#y-yarn","más abajo",").",[68,193,195],{"id":194},"la-vía-fácil","La vía fácil",[10,197,198,199,204,205,208,209,66],{},"Igual que antes, puedes instalarlo todo con un solo comando. El script instala Node.js 26 desde NodeSource, configura un prefijo global de ",[14,200,203],{"href":201,"rel":202},"https:\u002F\u002Fdocs.npmjs.com\u002F",[18],"npm"," (para que no necesites ",[25,206,207],{},"sudo"," con los paquetes globales) y, opcionalmente, instala pnpm y ",[14,210,213],{"href":211,"rel":212},"https:\u002F\u002Fbun.sh\u002F",[18],"Bun",[215,216,221],"pre",{"className":217,"code":218,"language":219,"meta":220,"style":220},"language-bash shiki shiki-themes catppuccin-latte catppuccin-mocha","curl -fsSL https:\u002F\u002Fangelblanco.dev\u002Fscripts\u002Fubuntu-install-node-26.sh | bash\n","bash","",[25,222,223],{"__ignoreMap":220},[224,225,228,232,236,239,243],"span",{"class":226,"line":227},"line",1,[224,229,231],{"class":230},"sMmZK","curl",[224,233,235],{"class":234},"sgueU"," -fsSL",[224,237,238],{"class":234}," https:\u002F\u002Fangelblanco.dev\u002Fscripts\u002Fubuntu-install-node-26.sh",[224,240,242],{"class":241},"sjJjI"," |",[224,244,245],{"class":230}," bash\n",[10,247,248,249,253,254,256],{},"El script te pide confirmación en cada paso importante. Como siempre, échale un vistazo ",[14,250,252],{"href":251},"#el-script","al script"," antes de pasárselo a ",[25,255,219],{},". Ejecutar scripts aleatorios de internet es muy divertido hasta que deja de serlo.",[10,258,259,260,262],{},"Si no tienes ",[25,261,231],{}," instalado:",[215,264,266],{"className":217,"code":265,"language":219,"meta":220,"style":220},"sudo apt update\nsudo apt install curl\n",[25,267,268,278],{"__ignoreMap":220},[224,269,270,272,275],{"class":226,"line":227},[224,271,207],{"class":230},[224,273,274],{"class":234}," apt",[224,276,277],{"class":234}," update\n",[224,279,281,283,285,288],{"class":226,"line":280},2,[224,282,207],{"class":230},[224,284,274],{"class":234},[224,286,287],{"class":234}," install",[224,289,290],{"class":234}," curl\n",[68,292,294],{"id":293},"la-guía-paso-a-paso","La guía paso a paso",[10,296,297],{},"Esto es lo que hace el script, por si prefieres ir paso a paso.",[299,300,302],"h3",{"id":301},"_1-actualizar-dependencias-y-añadir-el-repositorio-de-nodesource","1. Actualizar dependencias y añadir el repositorio de NodeSource",[10,304,305],{},"Primero, instala las herramientas necesarias para descargar y verificar paquetes:",[215,307,309],{"className":217,"code":308,"language":219,"meta":220,"style":220},"sudo apt update\nsudo apt install -y ca-certificates curl gnupg\n",[25,310,311,319],{"__ignoreMap":220},[224,312,313,315,317],{"class":226,"line":227},[224,314,207],{"class":230},[224,316,274],{"class":234},[224,318,277],{"class":234},[224,320,321,323,325,327,330,333,336],{"class":226,"line":280},[224,322,207],{"class":230},[224,324,274],{"class":234},[224,326,287],{"class":234},[224,328,329],{"class":234}," -y",[224,331,332],{"class":234}," ca-certificates",[224,334,335],{"class":234}," curl",[224,337,338],{"class":234}," gnupg\n",[10,340,341],{},"Después, añade el repositorio de NodeSource para Node.js 26:",[215,343,345],{"className":217,"code":344,"language":219,"meta":220,"style":220},"curl -fsSL https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_26.x | sudo -E bash -\n",[25,346,347],{"__ignoreMap":220},[224,348,349,351,353,356,358,361,364,367],{"class":226,"line":227},[224,350,231],{"class":230},[224,352,235],{"class":234},[224,354,355],{"class":234}," https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_26.x",[224,357,242],{"class":241},[224,359,360],{"class":230}," sudo",[224,362,363],{"class":234}," -E",[224,365,366],{"class":234}," bash",[224,368,369],{"class":234}," -\n",[10,371,372,373,376,377,380,381,384],{},"NodeSource usa una única suite ",[25,374,375],{},"nodistro"," para todas las distribuciones basadas en Debian, así que funciona en Ubuntu 26.04 sin esperar a un repositorio específico para su nombre en clave. El script de NodeSource también añade un pin de apt con prioridad ",[25,378,379],{},"600",", de modo que el paquete de NodeSource siempre gana al paquete ",[25,382,383],{},"nodejs"," del archivo de Ubuntu. Sin él, podrías acabar con un Node.js más antiguo de los repositorios de Ubuntu.",[299,386,388],{"id":387},"_2-instalar-nodejs-y-npm","2. Instalar Node.js y npm",[215,390,392],{"className":217,"code":391,"language":219,"meta":220,"style":220},"sudo apt-get install -y nodejs\nnode --version\n",[25,393,394,408],{"__ignoreMap":220},[224,395,396,398,401,403,405],{"class":226,"line":227},[224,397,207],{"class":230},[224,399,400],{"class":234}," apt-get",[224,402,287],{"class":234},[224,404,329],{"class":234},[224,406,407],{"class":234}," nodejs\n",[224,409,410,413],{"class":226,"line":280},[224,411,412],{"class":230},"node",[224,414,415],{"class":234}," --version\n",[10,417,418,419,421,422,66],{},"Esto instala tanto el entorno de ejecución ",[25,420,412],{}," como ",[25,423,203],{},[299,425,427],{"id":426},"_3-configurar-el-prefijo-global-de-npm","3. Configurar el prefijo global de npm",[10,429,430,431,433],{},"Para instalar paquetes globales sin ",[25,432,207],{},", configura un directorio dentro de tu carpeta personal:",[215,435,437],{"className":217,"code":436,"language":219,"meta":220,"style":220},"mkdir -p ~\u002F.npm-global\nnpm config set prefix '~\u002F.npm-global'\n",[25,438,439,450],{"__ignoreMap":220},[224,440,441,444,447],{"class":226,"line":227},[224,442,443],{"class":230},"mkdir",[224,445,446],{"class":234}," -p",[224,448,449],{"class":234}," ~\u002F.npm-global\n",[224,451,452,454,457,460,463],{"class":226,"line":280},[224,453,203],{"class":230},[224,455,456],{"class":234}," config",[224,458,459],{"class":234}," set",[224,461,462],{"class":234}," prefix",[224,464,465],{"class":234}," '~\u002F.npm-global'\n",[10,467,468,469,472,473,476,477,480],{},"Y añádelo a tu ",[25,470,471],{},"PATH"," en ",[25,474,475],{},"~\u002F.bashrc"," o ",[25,478,479],{},"~\u002F.zshrc",":",[215,482,484],{"className":217,"code":483,"language":219,"meta":220,"style":220},"export PATH=~\u002F.npm-global\u002Fbin:$PATH\n",[25,485,486],{"__ignoreMap":220},[224,487,488,492,496,499],{"class":226,"line":227},[224,489,491],{"class":490},"sAS4m","export",[224,493,495],{"class":494},"s0aCy"," PATH",[224,497,498],{"class":241},"=~",[224,500,501],{"class":494},"\u002F.npm-global\u002Fbin:$PATH\n",[299,503,505],{"id":504},"_4-instalar-pnpm","4. Instalar pnpm",[10,507,508,509,480],{},"Como Corepack ya no viene incluido, instala pnpm con su ",[14,510,513],{"href":511,"rel":512},"https:\u002F\u002Fpnpm.io\u002Finstallation",[18],"script oficial",[215,515,517],{"className":217,"code":516,"language":219,"meta":220,"style":220},"curl -fsSL https:\u002F\u002Fget.pnpm.io\u002Finstall.sh | sh -\n",[25,518,519],{"__ignoreMap":220},[224,520,521,523,525,528,530,533],{"class":226,"line":227},[224,522,231],{"class":230},[224,524,235],{"class":234},[224,526,527],{"class":234}," https:\u002F\u002Fget.pnpm.io\u002Finstall.sh",[224,529,242],{"class":241},[224,531,532],{"class":230}," sh",[224,534,369],{"class":234},[10,536,537,538,540,541,544,545,548,549,552],{},"El instalador añade pnpm al ",[25,539,471],{}," en la configuración de tu shell, así que abre una terminal nueva (o haz ",[25,542,543],{},"source"," de tu fichero de configuración) antes de ejecutar ",[25,546,547],{},"pnpm --version",". A partir de ahí, ",[25,550,551],{},"pnpm self-update"," lo mantiene actualizado.",[299,554,556],{"id":555},"_5-instalar-bun-opcional","5. Instalar Bun (opcional)",[10,558,559,560,563,564,480],{},"Si quieres probar ",[14,561,213],{"href":211,"rel":562},[18],", usa su instalador oficial, que necesita ",[25,565,566],{},"unzip",[215,568,570],{"className":217,"code":569,"language":219,"meta":220,"style":220},"sudo apt install -y unzip\ncurl -fsSL https:\u002F\u002Fbun.sh\u002Finstall | bash\n",[25,571,572,585],{"__ignoreMap":220},[224,573,574,576,578,580,582],{"class":226,"line":227},[224,575,207],{"class":230},[224,577,274],{"class":234},[224,579,287],{"class":234},[224,581,329],{"class":234},[224,583,584],{"class":234}," unzip\n",[224,586,587,589,591,594,596],{"class":226,"line":280},[224,588,231],{"class":230},[224,590,235],{"class":234},[224,592,593],{"class":234}," https:\u002F\u002Fbun.sh\u002Finstall",[224,595,242],{"class":241},[224,597,245],{"class":230},[68,599,601],{"id":600},"y-yarn","¿Y Yarn?",[10,603,604],{},"Si tus proyectos usan Yarn, puedes seguir usando Corepack. Solo tienes que instalarlo tú:",[215,606,608],{"className":217,"code":607,"language":219,"meta":220,"style":220},"npm install -g corepack\ncorepack enable\n",[25,609,610,622],{"__ignoreMap":220},[224,611,612,614,616,619],{"class":226,"line":227},[224,613,203],{"class":230},[224,615,287],{"class":234},[224,617,618],{"class":234}," -g",[224,620,621],{"class":234}," corepack\n",[224,623,624,626],{"class":226,"line":280},[224,625,167],{"class":230},[224,627,628],{"class":234}," enable\n",[10,630,631,632,634,635,640],{},"Como hemos configurado un prefijo global de npm, funciona sin ",[25,633,207],{},". Eso sí, el paquete ",[14,636,639],{"href":637,"rel":638},"https:\u002F\u002Fgithub.com\u002Fnodejs\u002Fcorepack",[18],"Corepack"," ahora se mantiene fuera del ciclo de versiones de Node.js, así que revisa su README si algo no se comporta como esperas en Node.js 26.",[68,642,644],{"id":643},"el-script","El script",[10,646,647,648,66],{},"Este es el script completo. Incluye confirmaciones, usa un directorio temporal que se borra al terminar y lee tus respuestas desde la terminal, así que funciona aunque lo ejecutes directamente desde ",[25,649,231],{},[10,651,652,653,658,659,664],{},"Este script sale de mi ",[14,654,657],{"href":655,"rel":656},"https:\u002F\u002Fgithub.com\u002Fangelblanco\u002Fkickstart.nvim",[18],"repo de configuración de Neovim",", donde guardo mis ",[14,660,663],{"href":661,"rel":662},"https:\u002F\u002Fgithub.com\u002Fangelblanco\u002Fkickstart.nvim\u002Fblob\u002Fmaster\u002Finstall\u002Finstall-node.sh",[18],"scripts de instalación",". El editor necesita Node.js para varios language servers y plugins, así que los actualizo con frecuencia. Si quieres la versión más reciente, pásate por allí.",[215,666,669],{"className":217,"code":667,"filename":668,"language":219,"meta":220,"style":220},"#!\u002Fbin\u002Fbash\n#\n# Author: Ángel Blanco\n# License: MIT\n#\n# This script is provided \"as is\", without warranty of any kind. Use at your own risk.\n#\n# Source: https:\u002F\u002Fangelblanco.dev\u002Fblog\u002Fapt-install-node-26-on-ubuntu-26\n#\n# Usage:\n#   curl -fsSL https:\u002F\u002Fangelblanco.dev\u002Fscripts\u002Fubuntu-install-node-26.sh | bash\n#\n# This script installs Node.js and several package managers.\n# Run it as your non-root user: it asks for elevated permissions\n# with sudo when needed.\n#\n\nset -e\n\n# Basic confirmation module before executing the script.\nconfirm_action() {\n    read -p \"$1 (y\u002Fn): \" choice \u003C \u002Fdev\u002Ftty\n    case \"$choice\" in\n        [Yy]|[Yy][Ee][Ss])\n            return 0\n            ;;\n        [Nn]|[Nn][Oo])\n            return 1\n            ;;\n        *)\n            echo \"Invalid choice. Please enter 'y' or 'n'.\"\n            confirm_action \"$1\"\n            ;;\n    esac\n}\n\n# You can configure these variables if needed\nNODE_VERSION=26\nNPM_PREFIX=\"~\u002F.npm-global\"\nDEPS=\"ca-certificates curl gnupg\"\n\nTMP_DIR=$(mktemp -d)\ntrap 'rm -rf \"$TMP_DIR\"' EXIT\n\necho \"This script will install Node.js and optionally other package managers.\"\necho \"\"\n\nif ! confirm_action \"Install Node.js version $NODE_VERSION?\"; then\n    echo \"Skipping Node.js installation. Exiting.\"\n    exit 0\nfi\n\necho \"Installing the dependencies needed to install Node.js...\"\n\nsudo apt update\nsudo apt install -y $DEPS\n\necho \"Installing Node.js...\"\ncurl -fsSL https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_$NODE_VERSION.x -o $TMP_DIR\u002Fnodesource_setup.sh\nsudo -E bash $TMP_DIR\u002Fnodesource_setup.sh\n\nsudo apt-get install -y nodejs\n\nmkdir -p ~\u002F.npm-global\nnpm config set prefix $NPM_PREFIX\necho \"npm prefix set to $NPM_PREFIX\"\n\necho \"Node.js installation completed.\"\necho \"Node version: \"\nnode --version\n\necho \"\"\n\nif confirm_action \"Install pnpm?\"; then\n    echo \"Installing pnpm...\"\n    curl -fsSL https:\u002F\u002Fget.pnpm.io\u002Finstall.sh | sh -\n    echo \"pnpm installation completed. Open a new terminal (or source your shell config) to use it.\"\nfi\n\necho \"\"\n\nif confirm_action \"Install Bun?\"; then\n    echo \"Installing Bun...\"\n    sudo apt install -y unzip\n    curl -fsSL https:\u002F\u002Fbun.sh\u002Finstall | bash\n    export BUN_INSTALL=\"$HOME\u002F.bun\"\n    export PATH=\"$BUN_INSTALL\u002Fbin:$PATH\"\n    echo \"Bun version: \"\n    bun --version\nfi\n\necho \"\"\necho \"Installation process finished.\"\necho \"\"\necho \"Add the global npm bin directory to your PATH by adding this line to your .bashrc or .zshrc:\"\necho 'export PATH=~\u002F.npm-global\u002Fbin:$PATH'\necho \"\"\necho \"Node.js now comes from apt, so keep it patched with:\"\necho \"sudo apt update && sudo apt upgrade\"\necho \"\"\n","ubuntu-install-node-26.sh",[25,670,671,677,683,689,695,700,706,711,717,722,728,734,739,745,751,757,762,769,779,784,790,803,830,847,883,893,899,924,932,937,943,952,965,970,976,982,987,993,1005,1016,1027,1032,1051,1063,1068,1077,1085,1090,1117,1126,1134,1140,1145,1153,1158,1167,1181,1186,1194,1218,1231,1236,1249,1254,1263,1277,1290,1295,1303,1311,1318,1323,1330,1335,1349,1357,1373,1381,1386,1391,1398,1403,1417,1425,1439,1452,1471,1493,1501,1509,1514,1519,1526,1534,1541,1549,1557,1564,1572,1580],{"__ignoreMap":220},[224,672,673],{"class":226,"line":227},[224,674,676],{"class":675},"skWWU","#!\u002Fbin\u002Fbash\n",[224,678,679],{"class":226,"line":280},[224,680,682],{"class":681},"som-u","#\n",[224,684,686],{"class":226,"line":685},3,[224,687,688],{"class":681},"# Author: Ángel Blanco\n",[224,690,692],{"class":226,"line":691},4,[224,693,694],{"class":681},"# License: MIT\n",[224,696,698],{"class":226,"line":697},5,[224,699,682],{"class":681},[224,701,703],{"class":226,"line":702},6,[224,704,705],{"class":681},"# This script is provided \"as is\", without warranty of any kind. Use at your own risk.\n",[224,707,709],{"class":226,"line":708},7,[224,710,682],{"class":681},[224,712,714],{"class":226,"line":713},8,[224,715,716],{"class":681},"# Source: https:\u002F\u002Fangelblanco.dev\u002Fblog\u002Fapt-install-node-26-on-ubuntu-26\n",[224,718,720],{"class":226,"line":719},9,[224,721,682],{"class":681},[224,723,725],{"class":226,"line":724},10,[224,726,727],{"class":681},"# Usage:\n",[224,729,731],{"class":226,"line":730},11,[224,732,733],{"class":681},"#   curl -fsSL https:\u002F\u002Fangelblanco.dev\u002Fscripts\u002Fubuntu-install-node-26.sh | bash\n",[224,735,737],{"class":226,"line":736},12,[224,738,682],{"class":681},[224,740,742],{"class":226,"line":741},13,[224,743,744],{"class":681},"# This script installs Node.js and several package managers.\n",[224,746,748],{"class":226,"line":747},14,[224,749,750],{"class":681},"# Run it as your non-root user: it asks for elevated permissions\n",[224,752,754],{"class":226,"line":753},15,[224,755,756],{"class":681},"# with sudo when needed.\n",[224,758,760],{"class":226,"line":759},16,[224,761,682],{"class":681},[224,763,765],{"class":226,"line":764},17,[224,766,768],{"emptyLinePlaceholder":767},true,"\n",[224,770,772,776],{"class":226,"line":771},18,[224,773,775],{"class":774},"s-0VM","set",[224,777,778],{"class":234}," -e\n",[224,780,782],{"class":226,"line":781},19,[224,783,768],{"emptyLinePlaceholder":767},[224,785,787],{"class":226,"line":786},20,[224,788,789],{"class":681},"# Basic confirmation module before executing the script.\n",[224,791,793,796,800],{"class":226,"line":792},21,[224,794,795],{"class":230},"confirm_action",[224,797,799],{"class":798},"sxyLT","()",[224,801,802],{"class":798}," {\n",[224,804,806,809,811,814,818,821,824,827],{"class":226,"line":805},22,[224,807,808],{"class":774},"    read",[224,810,446],{"class":234},[224,812,813],{"class":234}," \"",[224,815,817],{"class":816},"s2f33","$1",[224,819,820],{"class":234}," (y\u002Fn): \"",[224,822,823],{"class":234}," choice",[224,825,826],{"class":241}," \u003C",[224,828,829],{"class":234}," \u002Fdev\u002Ftty\n",[224,831,833,836,838,841,844],{"class":226,"line":832},23,[224,834,835],{"class":490},"    case",[224,837,813],{"class":234},[224,839,840],{"class":494},"$choice",[224,842,843],{"class":234},"\"",[224,845,846],{"class":490}," in\n",[224,848,850,853,856,859,862,865,867,870,873,875,878,880],{"class":226,"line":849},24,[224,851,852],{"class":798},"        [",[224,854,855],{"class":234},"Yy",[224,857,858],{"class":798},"]",[224,860,861],{"class":798},"|",[224,863,864],{"class":798},"[",[224,866,855],{"class":234},[224,868,869],{"class":798},"][",[224,871,872],{"class":234},"Ee",[224,874,869],{"class":798},[224,876,877],{"class":234},"Ss",[224,879,858],{"class":798},[224,881,882],{"class":241},")\n",[224,884,886,889],{"class":226,"line":885},25,[224,887,888],{"class":490},"            return",[224,890,892],{"class":891},"st0oN"," 0\n",[224,894,896],{"class":226,"line":895},26,[224,897,898],{"class":798},"            ;;\n",[224,900,902,904,907,909,911,913,915,917,920,922],{"class":226,"line":901},27,[224,903,852],{"class":798},[224,905,906],{"class":234},"Nn",[224,908,858],{"class":798},[224,910,861],{"class":798},[224,912,864],{"class":798},[224,914,906],{"class":234},[224,916,869],{"class":798},[224,918,919],{"class":234},"Oo",[224,921,858],{"class":798},[224,923,882],{"class":241},[224,925,927,929],{"class":226,"line":926},28,[224,928,888],{"class":490},[224,930,931],{"class":891}," 1\n",[224,933,935],{"class":226,"line":934},29,[224,936,898],{"class":798},[224,938,940],{"class":226,"line":939},30,[224,941,942],{"class":241},"        *)\n",[224,944,946,949],{"class":226,"line":945},31,[224,947,948],{"class":774},"            echo",[224,950,951],{"class":234}," \"Invalid choice. Please enter 'y' or 'n'.\"\n",[224,953,955,958,960,962],{"class":226,"line":954},32,[224,956,957],{"class":230},"            confirm_action",[224,959,813],{"class":234},[224,961,817],{"class":816},[224,963,964],{"class":234},"\"\n",[224,966,968],{"class":226,"line":967},33,[224,969,898],{"class":798},[224,971,973],{"class":226,"line":972},34,[224,974,975],{"class":490},"    esac\n",[224,977,979],{"class":226,"line":978},35,[224,980,981],{"class":798},"}\n",[224,983,985],{"class":226,"line":984},36,[224,986,768],{"emptyLinePlaceholder":767},[224,988,990],{"class":226,"line":989},37,[224,991,992],{"class":681},"# You can configure these variables if needed\n",[224,994,996,999,1002],{"class":226,"line":995},38,[224,997,998],{"class":494},"NODE_VERSION",[224,1000,1001],{"class":241},"=",[224,1003,1004],{"class":234},"26\n",[224,1006,1008,1011,1013],{"class":226,"line":1007},39,[224,1009,1010],{"class":494},"NPM_PREFIX",[224,1012,1001],{"class":241},[224,1014,1015],{"class":234},"\"~\u002F.npm-global\"\n",[224,1017,1019,1022,1024],{"class":226,"line":1018},40,[224,1020,1021],{"class":494},"DEPS",[224,1023,1001],{"class":241},[224,1025,1026],{"class":234},"\"ca-certificates curl gnupg\"\n",[224,1028,1030],{"class":226,"line":1029},41,[224,1031,768],{"emptyLinePlaceholder":767},[224,1033,1035,1038,1040,1043,1046,1049],{"class":226,"line":1034},42,[224,1036,1037],{"class":494},"TMP_DIR",[224,1039,1001],{"class":241},[224,1041,1042],{"class":798},"$(",[224,1044,1045],{"class":230},"mktemp",[224,1047,1048],{"class":234}," -d",[224,1050,882],{"class":798},[224,1052,1054,1057,1060],{"class":226,"line":1053},43,[224,1055,1056],{"class":774},"trap",[224,1058,1059],{"class":234}," 'rm -rf \"$TMP_DIR\"'",[224,1061,1062],{"class":234}," EXIT\n",[224,1064,1066],{"class":226,"line":1065},44,[224,1067,768],{"emptyLinePlaceholder":767},[224,1069,1071,1074],{"class":226,"line":1070},45,[224,1072,1073],{"class":774},"echo",[224,1075,1076],{"class":234}," \"This script will install Node.js and optionally other package managers.\"\n",[224,1078,1080,1082],{"class":226,"line":1079},46,[224,1081,1073],{"class":774},[224,1083,1084],{"class":234}," \"\"\n",[224,1086,1088],{"class":226,"line":1087},47,[224,1089,768],{"emptyLinePlaceholder":767},[224,1091,1093,1096,1099,1102,1105,1108,1111,1114],{"class":226,"line":1092},48,[224,1094,1095],{"class":490},"if",[224,1097,1098],{"class":241}," !",[224,1100,1101],{"class":230}," confirm_action",[224,1103,1104],{"class":234}," \"Install Node.js version ",[224,1106,1107],{"class":494},"$NODE_VERSION",[224,1109,1110],{"class":234},"?\"",[224,1112,1113],{"class":798},";",[224,1115,1116],{"class":490}," then\n",[224,1118,1120,1123],{"class":226,"line":1119},49,[224,1121,1122],{"class":774},"    echo",[224,1124,1125],{"class":234}," \"Skipping Node.js installation. Exiting.\"\n",[224,1127,1129,1132],{"class":226,"line":1128},50,[224,1130,1131],{"class":774},"    exit",[224,1133,892],{"class":891},[224,1135,1137],{"class":226,"line":1136},51,[224,1138,1139],{"class":490},"fi\n",[224,1141,1143],{"class":226,"line":1142},52,[224,1144,768],{"emptyLinePlaceholder":767},[224,1146,1148,1150],{"class":226,"line":1147},53,[224,1149,1073],{"class":774},[224,1151,1152],{"class":234}," \"Installing the dependencies needed to install Node.js...\"\n",[224,1154,1156],{"class":226,"line":1155},54,[224,1157,768],{"emptyLinePlaceholder":767},[224,1159,1161,1163,1165],{"class":226,"line":1160},55,[224,1162,207],{"class":230},[224,1164,274],{"class":234},[224,1166,277],{"class":234},[224,1168,1170,1172,1174,1176,1178],{"class":226,"line":1169},56,[224,1171,207],{"class":230},[224,1173,274],{"class":234},[224,1175,287],{"class":234},[224,1177,329],{"class":234},[224,1179,1180],{"class":494}," $DEPS\n",[224,1182,1184],{"class":226,"line":1183},57,[224,1185,768],{"emptyLinePlaceholder":767},[224,1187,1189,1191],{"class":226,"line":1188},58,[224,1190,1073],{"class":774},[224,1192,1193],{"class":234}," \"Installing Node.js...\"\n",[224,1195,1197,1199,1201,1204,1206,1209,1212,1215],{"class":226,"line":1196},59,[224,1198,231],{"class":230},[224,1200,235],{"class":234},[224,1202,1203],{"class":234}," https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_",[224,1205,1107],{"class":494},[224,1207,1208],{"class":234},".x",[224,1210,1211],{"class":234}," -o",[224,1213,1214],{"class":494}," $TMP_DIR",[224,1216,1217],{"class":234},"\u002Fnodesource_setup.sh\n",[224,1219,1221,1223,1225,1227,1229],{"class":226,"line":1220},60,[224,1222,207],{"class":230},[224,1224,363],{"class":234},[224,1226,366],{"class":234},[224,1228,1214],{"class":494},[224,1230,1217],{"class":234},[224,1232,1234],{"class":226,"line":1233},61,[224,1235,768],{"emptyLinePlaceholder":767},[224,1237,1239,1241,1243,1245,1247],{"class":226,"line":1238},62,[224,1240,207],{"class":230},[224,1242,400],{"class":234},[224,1244,287],{"class":234},[224,1246,329],{"class":234},[224,1248,407],{"class":234},[224,1250,1252],{"class":226,"line":1251},63,[224,1253,768],{"emptyLinePlaceholder":767},[224,1255,1257,1259,1261],{"class":226,"line":1256},64,[224,1258,443],{"class":230},[224,1260,446],{"class":234},[224,1262,449],{"class":234},[224,1264,1266,1268,1270,1272,1274],{"class":226,"line":1265},65,[224,1267,203],{"class":230},[224,1269,456],{"class":234},[224,1271,459],{"class":234},[224,1273,462],{"class":234},[224,1275,1276],{"class":494}," $NPM_PREFIX\n",[224,1278,1280,1282,1285,1288],{"class":226,"line":1279},66,[224,1281,1073],{"class":774},[224,1283,1284],{"class":234}," \"npm prefix set to ",[224,1286,1287],{"class":494},"$NPM_PREFIX",[224,1289,964],{"class":234},[224,1291,1293],{"class":226,"line":1292},67,[224,1294,768],{"emptyLinePlaceholder":767},[224,1296,1298,1300],{"class":226,"line":1297},68,[224,1299,1073],{"class":774},[224,1301,1302],{"class":234}," \"Node.js installation completed.\"\n",[224,1304,1306,1308],{"class":226,"line":1305},69,[224,1307,1073],{"class":774},[224,1309,1310],{"class":234}," \"Node version: \"\n",[224,1312,1314,1316],{"class":226,"line":1313},70,[224,1315,412],{"class":230},[224,1317,415],{"class":234},[224,1319,1321],{"class":226,"line":1320},71,[224,1322,768],{"emptyLinePlaceholder":767},[224,1324,1326,1328],{"class":226,"line":1325},72,[224,1327,1073],{"class":774},[224,1329,1084],{"class":234},[224,1331,1333],{"class":226,"line":1332},73,[224,1334,768],{"emptyLinePlaceholder":767},[224,1336,1338,1340,1342,1345,1347],{"class":226,"line":1337},74,[224,1339,1095],{"class":490},[224,1341,1101],{"class":230},[224,1343,1344],{"class":234}," \"Install pnpm?\"",[224,1346,1113],{"class":798},[224,1348,1116],{"class":490},[224,1350,1352,1354],{"class":226,"line":1351},75,[224,1353,1122],{"class":774},[224,1355,1356],{"class":234}," \"Installing pnpm...\"\n",[224,1358,1360,1363,1365,1367,1369,1371],{"class":226,"line":1359},76,[224,1361,1362],{"class":230},"    curl",[224,1364,235],{"class":234},[224,1366,527],{"class":234},[224,1368,242],{"class":241},[224,1370,532],{"class":230},[224,1372,369],{"class":234},[224,1374,1376,1378],{"class":226,"line":1375},77,[224,1377,1122],{"class":774},[224,1379,1380],{"class":234}," \"pnpm installation completed. Open a new terminal (or source your shell config) to use it.\"\n",[224,1382,1384],{"class":226,"line":1383},78,[224,1385,1139],{"class":490},[224,1387,1389],{"class":226,"line":1388},79,[224,1390,768],{"emptyLinePlaceholder":767},[224,1392,1394,1396],{"class":226,"line":1393},80,[224,1395,1073],{"class":774},[224,1397,1084],{"class":234},[224,1399,1401],{"class":226,"line":1400},81,[224,1402,768],{"emptyLinePlaceholder":767},[224,1404,1406,1408,1410,1413,1415],{"class":226,"line":1405},82,[224,1407,1095],{"class":490},[224,1409,1101],{"class":230},[224,1411,1412],{"class":234}," \"Install Bun?\"",[224,1414,1113],{"class":798},[224,1416,1116],{"class":490},[224,1418,1420,1422],{"class":226,"line":1419},83,[224,1421,1122],{"class":774},[224,1423,1424],{"class":234}," \"Installing Bun...\"\n",[224,1426,1428,1431,1433,1435,1437],{"class":226,"line":1427},84,[224,1429,1430],{"class":230},"    sudo",[224,1432,274],{"class":234},[224,1434,287],{"class":234},[224,1436,329],{"class":234},[224,1438,584],{"class":234},[224,1440,1442,1444,1446,1448,1450],{"class":226,"line":1441},85,[224,1443,1362],{"class":230},[224,1445,235],{"class":234},[224,1447,593],{"class":234},[224,1449,242],{"class":241},[224,1451,245],{"class":230},[224,1453,1455,1458,1461,1463,1465,1468],{"class":226,"line":1454},86,[224,1456,1457],{"class":490},"    export",[224,1459,1460],{"class":494}," BUN_INSTALL",[224,1462,1001],{"class":241},[224,1464,843],{"class":234},[224,1466,1467],{"class":494},"$HOME",[224,1469,1470],{"class":234},"\u002F.bun\"\n",[224,1472,1474,1476,1478,1480,1482,1485,1488,1491],{"class":226,"line":1473},87,[224,1475,1457],{"class":490},[224,1477,495],{"class":494},[224,1479,1001],{"class":241},[224,1481,843],{"class":234},[224,1483,1484],{"class":494},"$BUN_INSTALL",[224,1486,1487],{"class":234},"\u002Fbin:",[224,1489,1490],{"class":494},"$PATH",[224,1492,964],{"class":234},[224,1494,1496,1498],{"class":226,"line":1495},88,[224,1497,1122],{"class":774},[224,1499,1500],{"class":234}," \"Bun version: \"\n",[224,1502,1504,1507],{"class":226,"line":1503},89,[224,1505,1506],{"class":230},"    bun",[224,1508,415],{"class":234},[224,1510,1512],{"class":226,"line":1511},90,[224,1513,1139],{"class":490},[224,1515,1517],{"class":226,"line":1516},91,[224,1518,768],{"emptyLinePlaceholder":767},[224,1520,1522,1524],{"class":226,"line":1521},92,[224,1523,1073],{"class":774},[224,1525,1084],{"class":234},[224,1527,1529,1531],{"class":226,"line":1528},93,[224,1530,1073],{"class":774},[224,1532,1533],{"class":234}," \"Installation process finished.\"\n",[224,1535,1537,1539],{"class":226,"line":1536},94,[224,1538,1073],{"class":774},[224,1540,1084],{"class":234},[224,1542,1544,1546],{"class":226,"line":1543},95,[224,1545,1073],{"class":774},[224,1547,1548],{"class":234}," \"Add the global npm bin directory to your PATH by adding this line to your .bashrc or .zshrc:\"\n",[224,1550,1552,1554],{"class":226,"line":1551},96,[224,1553,1073],{"class":774},[224,1555,1556],{"class":234}," 'export PATH=~\u002F.npm-global\u002Fbin:$PATH'\n",[224,1558,1560,1562],{"class":226,"line":1559},97,[224,1561,1073],{"class":774},[224,1563,1084],{"class":234},[224,1565,1567,1569],{"class":226,"line":1566},98,[224,1568,1073],{"class":774},[224,1570,1571],{"class":234}," \"Node.js now comes from apt, so keep it patched with:\"\n",[224,1573,1575,1577],{"class":226,"line":1574},99,[224,1576,1073],{"class":774},[224,1578,1579],{"class":234}," \"sudo apt update && sudo apt upgrade\"\n",[224,1581,1583,1585],{"class":226,"line":1582},100,[224,1584,1073],{"class":774},[224,1586,1084],{"class":234},[68,1588,1590],{"id":1589},"mantén-todo-al-día","Mantén todo al día",[10,1592,1593],{},"Una vez instalado, mantenerlo al día es cuestión de un par de comandos:",[215,1595,1597],{"className":217,"code":1596,"language":219,"meta":220,"style":220},"# Sistema operativo y Node.js\nsudo apt update && sudo apt upgrade\n\n# Gestores de paquetes\npnpm self-update\nbun upgrade\nnpm update -g\n",[25,1598,1599,1604,1623,1627,1632,1639,1646],{"__ignoreMap":220},[224,1600,1601],{"class":226,"line":227},[224,1602,1603],{"class":681},"# Sistema operativo y Node.js\n",[224,1605,1606,1608,1610,1613,1616,1618,1620],{"class":226,"line":280},[224,1607,207],{"class":230},[224,1609,274],{"class":234},[224,1611,1612],{"class":234}," update",[224,1614,1615],{"class":798}," &&",[224,1617,360],{"class":230},[224,1619,274],{"class":234},[224,1621,1622],{"class":234}," upgrade\n",[224,1624,1625],{"class":226,"line":685},[224,1626,768],{"emptyLinePlaceholder":767},[224,1628,1629],{"class":226,"line":691},[224,1630,1631],{"class":681},"# Gestores de paquetes\n",[224,1633,1634,1636],{"class":226,"line":697},[224,1635,176],{"class":230},[224,1637,1638],{"class":234}," self-update\n",[224,1640,1641,1644],{"class":226,"line":702},[224,1642,1643],{"class":230},"bun",[224,1645,1622],{"class":234},[224,1647,1648,1650,1652],{"class":226,"line":708},[224,1649,203],{"class":230},[224,1651,1612],{"class":234},[224,1653,1654],{"class":234}," -g\n",[10,1656,1657,1658,34,1661,1664],{},"Y no te olvides de las dependencias de tus proyectos: ",[25,1659,1660],{},"pnpm outdated",[25,1662,1663],{},"pnpm audit"," te dicen qué toca actualizar.",[10,1666,1667,1668,1673,1674,1678],{},"Por eso mismo sigo sin usar ",[14,1669,1672],{"href":1670,"rel":1671},"https:\u002F\u002Fgithub.com\u002Fnvm-sh\u002Fnvm",[18],"NVM"," en el día a día, como ya conté en el ",[14,1675,1677],{"href":1676},"\u002Fes\u002Fblog\u002Finstall-node-24-on-ubuntu-24\u002F#y-qu%C3%A9-hay-de-nvm","post anterior",". Es estupendo si de verdad necesitas varias versiones de Node.js a la vez, pero cada versión que instalas con NVM es una más que tienes que acordarte de parchear.",[10,1680,1681],{},"Con una inteligencia artificial que acelera cómo se descubren y explotan las vulnerabilidades, y con brechas de seguridad que no paran de surgir, mantenerse al día tiene que ser lo más sencillo posible. Porque ahora, más que nunca, no es opcional.",[1683,1684,1685],"style",{},"html pre.shiki code .sMmZK, html code.shiki .sMmZK{--shiki-default:#1E66F5;--shiki-default-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic}html pre.shiki code .sgueU, html code.shiki .sgueU{--shiki-default:#40A02B;--shiki-dark:#A6E3A1}html pre.shiki code .sjJjI, html code.shiki .sjJjI{--shiki-default:#179299;--shiki-dark:#94E2D5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sAS4m, html code.shiki .sAS4m{--shiki-default:#8839EF;--shiki-dark:#CBA6F7}html pre.shiki code .s0aCy, html code.shiki .s0aCy{--shiki-default:#4C4F69;--shiki-dark:#CDD6F4}html pre.shiki code .skWWU, html code.shiki .skWWU{--shiki-default:#EA76CB;--shiki-default-font-style:italic;--shiki-dark:#F5C2E7;--shiki-dark-font-style:italic}html pre.shiki code .som-u, html code.shiki .som-u{--shiki-default:#7C7F93;--shiki-default-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic}html pre.shiki code .s-0VM, html code.shiki .s-0VM{--shiki-default:#D20F39;--shiki-default-font-style:italic;--shiki-dark:#F38BA8;--shiki-dark-font-style:italic}html pre.shiki code .sxyLT, html code.shiki .sxyLT{--shiki-default:#7C7F93;--shiki-dark:#9399B2}html pre.shiki code .s2f33, html code.shiki .s2f33{--shiki-default:#E64553;--shiki-default-font-style:italic;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic}html pre.shiki code .st0oN, html code.shiki .st0oN{--shiki-default:#FE640B;--shiki-dark:#FAB387}",{"title":220,"searchDepth":280,"depth":280,"links":1687},[1688,1689,1690,1691,1698,1699,1700],{"id":70,"depth":280,"text":71},{"id":145,"depth":280,"text":146},{"id":194,"depth":280,"text":195},{"id":293,"depth":280,"text":294,"children":1692},[1693,1694,1695,1696,1697],{"id":301,"depth":685,"text":302},{"id":387,"depth":685,"text":388},{"id":426,"depth":685,"text":427},{"id":504,"depth":685,"text":505},{"id":555,"depth":685,"text":556},{"id":600,"depth":280,"text":601},{"id":643,"depth":280,"text":644},{"id":1589,"depth":280,"text":1590},"2026-11-05","El 21 de octubre de 2026, Node.js publicó parches de seguridad para diez vulnerabilidades que afectan a sus versiones con soporte, cuatro de ellas graves, incluida una ejecución remota de código. Las versiones sin soporte, como Node.js 20 y 25, no recibirán actualizaciones.","md",null,{},"\u002Fes\u002Fblog\u002Fapt-install-node-26-on-ubuntu-26","8",{"title":5,"description":1702},"es\u002Fblog\u002F0004.apt-install-node-26-on-ubuntu-26",[383,1711,1712,219],"ubuntu","javascript",false,"w1AJ3KHpaK-nr5HEZvmTeOiURHHPkwnFuA-2IZX124k",{"id":1716,"title":1717,"body":1718,"date":1701,"description":3057,"extension":1703,"image":1704,"meta":3058,"navigation":767,"path":3059,"readingTime":3060,"schemaOrg":1704,"seo":3061,"stem":3062,"tags":3063,"toc":1713,"updatedAt":1704,"__hash__":3064},"blog_en\u002Fblog\u002F0004.apt-install-node-26-on-ubuntu-26.md","Install Node.js 26 with apt on Ubuntu 26.04",{"type":7,"value":1719,"toc":3042},[1720,1728,1741,1760,1764,1767,1813,1826,1830,1848,1866,1870,1883,1899,1910,1916,1938,1942,1945,1949,1952,1980,1983,2005,2017,2021,2043,2051,2055,2061,2085,2096,2110,2114,2121,2139,2154,2158,2167,2195,2199,2202,2222,2232,2236,2241,2254,2954,2958,2961,3016,3025,3037,3040],[10,1721,1722,1723,1727],{},"On October 21, 2026, Node.js released ",[14,1724,1726],{"href":16,"rel":1725},[18],"security patches"," for ten vulnerabilities affecting its supported versions, four of them rated high, including a remote code execution issue. Unsupported versions, such as Node.js 20 and 25, won't be updated.",[10,1729,1730,1731,1733,1734,1737,1738,1740],{},"Keeping Node.js up to date isn't optional: it's worth spending some time on it, both on your personal computer and on your server. The easiest way is to let the operating system handle those updates for you. To do that, install Node.js with ",[25,1732,27],{}," from the ",[14,1735,33],{"href":31,"rel":1736},[18]," repository and let ",[25,1739,37],{}," take care of the rest.",[10,1742,1743,1744,47,1747,1749,1750,47,1753,1755,1756,66],{},"Now that ",[14,1745,46],{"href":44,"rel":1746},[18],[49,1748,51],{},") has been LTS since October 28, 2026 and ",[14,1751,57],{"href":55,"rel":1752},[18],[49,1754,60],{},") has been out for months, it's a good time to get it properly installed. The recipe is the same as in my ",[14,1757,1759],{"href":1758},"\u002Fblog\u002Finstall-node-24-on-ubuntu-24\u002F","Node.js 24 on Ubuntu 24 guide",[68,1761,1763],{"id":1762},"support-dates-at-a-glance","Support dates at a glance",[10,1765,1766],{},"Both releases have long support windows, so this setup will last for a while:",[76,1768,1769,1785],{},[79,1770,1771],{},[82,1772,1773,1776,1779,1782],{},[85,1774,1775],{},"Release",[85,1777,1778],{},"Released",[85,1780,1781],{},"LTS \u002F standard support",[85,1783,1784],{},"End of life",[98,1786,1787,1800],{},[82,1788,1789,1791,1794,1797],{},[103,1790,105],{},[103,1792,1793],{},"May 5, 2026",[103,1795,1796],{},"Active LTS from Oct 28, 2026",[103,1798,1799],{},"April 30, 2029",[82,1801,1802,1804,1807,1810],{},[103,1803,57],{},[103,1805,1806],{},"April 23, 2026",[103,1808,1809],{},"Standard support until April 2031",[103,1811,1812],{},"ESM with Ubuntu Pro for 10 years",[10,1814,1815,1816,1820,1821,1825],{},"Node.js 26 moves to maintenance on October 20, 2027 (see the ",[14,1817,1819],{"href":133,"rel":1818},[18],"official release schedule","), and it's the last release under the odd\u002Feven model: from ",[14,1822,141],{"href":1823,"rel":1824},"https:\u002F\u002Fnodejs.org\u002Fen\u002Fblog\u002Fannouncements\u002Fevolving-the-nodejs-release-schedule",[18]," onwards, the project ships one major release per year and every release becomes LTS. If you're still on Node.js 24, don't panic: it's supported until April 2028 (and Node.js 22 until April 2027).",[68,1827,1829],{"id":1828},"what-changed-since-nodejs-24","What changed since Node.js 24",[10,1831,1832,1833,1836,1837,1839,1840,1844,1845,1847],{},"Most of the steps are the same, but there is one important change: ",[151,1834,1835],{},"Corepack is no longer bundled with Node.js",". It was removed in Node.js 25, so ",[25,1838,157],{}," doesn't work on a fresh Node.js 26 install. The ",[14,1841,1843],{"href":161,"rel":1842},[18],"Node.js docs"," point to the userland ",[25,1846,167],{}," package if you still want it.",[10,1849,1850,1851,1854,1855,1858,1859,1861,1862,191],{},"I took the simplest route and now install ",[14,1852,176],{"href":174,"rel":1853},[18]," with its own standalone installer. If you use ",[14,1856,182],{"href":180,"rel":1857},[18],", you can install the ",[25,1860,167],{}," package globally (see ",[14,1863,1865],{"href":1864},"#what-about-yarn","below",[68,1867,1869],{"id":1868},"the-easy-way","The easy way",[10,1871,1872,1873,1876,1877,1879,1880,66],{},"As before, you can install everything with a single command. The script installs Node.js 26 from NodeSource, configures a global ",[14,1874,203],{"href":201,"rel":1875},[18]," prefix (so you don't need ",[25,1878,207],{}," for global packages), and can optionally install pnpm and ",[14,1881,213],{"href":211,"rel":1882},[18],[215,1884,1885],{"className":217,"code":218,"language":219,"meta":220,"style":220},[25,1886,1887],{"__ignoreMap":220},[224,1888,1889,1891,1893,1895,1897],{"class":226,"line":227},[224,1890,231],{"class":230},[224,1892,235],{"class":234},[224,1894,238],{"class":234},[224,1896,242],{"class":241},[224,1898,245],{"class":230},[10,1900,1901,1902,1906,1907,1909],{},"The script asks for confirmation at each major step. As always, read ",[14,1903,1905],{"href":1904},"#the-script","the script"," before you pipe it into ",[25,1908,219],{},". Running random scripts from the internet is a fun hobby until it isn't.",[10,1911,1912,1913,1915],{},"If you don't have ",[25,1914,231],{}," installed:",[215,1917,1918],{"className":217,"code":265,"language":219,"meta":220,"style":220},[25,1919,1920,1928],{"__ignoreMap":220},[224,1921,1922,1924,1926],{"class":226,"line":227},[224,1923,207],{"class":230},[224,1925,274],{"class":234},[224,1927,277],{"class":234},[224,1929,1930,1932,1934,1936],{"class":226,"line":280},[224,1931,207],{"class":230},[224,1933,274],{"class":234},[224,1935,287],{"class":234},[224,1937,290],{"class":234},[68,1939,1941],{"id":1940},"the-step-by-step-guide","The step-by-step guide",[10,1943,1944],{},"Here's what the script does, in case you want to run it step by step.",[299,1946,1948],{"id":1947},"_1-update-dependencies-and-add-the-nodesource-repository","1. Update dependencies and add the NodeSource repository",[10,1950,1951],{},"First, install the tools needed to download and verify packages:",[215,1953,1954],{"className":217,"code":308,"language":219,"meta":220,"style":220},[25,1955,1956,1964],{"__ignoreMap":220},[224,1957,1958,1960,1962],{"class":226,"line":227},[224,1959,207],{"class":230},[224,1961,274],{"class":234},[224,1963,277],{"class":234},[224,1965,1966,1968,1970,1972,1974,1976,1978],{"class":226,"line":280},[224,1967,207],{"class":230},[224,1969,274],{"class":234},[224,1971,287],{"class":234},[224,1973,329],{"class":234},[224,1975,332],{"class":234},[224,1977,335],{"class":234},[224,1979,338],{"class":234},[10,1981,1982],{},"Then add the NodeSource repository for Node.js 26:",[215,1984,1985],{"className":217,"code":344,"language":219,"meta":220,"style":220},[25,1986,1987],{"__ignoreMap":220},[224,1988,1989,1991,1993,1995,1997,1999,2001,2003],{"class":226,"line":227},[224,1990,231],{"class":230},[224,1992,235],{"class":234},[224,1994,355],{"class":234},[224,1996,242],{"class":241},[224,1998,360],{"class":230},[224,2000,363],{"class":234},[224,2002,366],{"class":234},[224,2004,369],{"class":234},[10,2006,2007,2008,2010,2011,2013,2014,2016],{},"NodeSource uses a single ",[25,2009,375],{}," suite for every Debian-based distribution, so it works on Ubuntu 26.04 without waiting for a codename-specific repository. The setup script also adds an apt pin with priority ",[25,2012,379],{},", so the NodeSource package always wins over the ",[25,2015,383],{}," package from the Ubuntu archive. Without it, you could end up with an older Node.js from the Ubuntu repositories.",[299,2018,2020],{"id":2019},"_2-install-nodejs-and-npm","2. Install Node.js and npm",[215,2022,2023],{"className":217,"code":391,"language":219,"meta":220,"style":220},[25,2024,2025,2037],{"__ignoreMap":220},[224,2026,2027,2029,2031,2033,2035],{"class":226,"line":227},[224,2028,207],{"class":230},[224,2030,400],{"class":234},[224,2032,287],{"class":234},[224,2034,329],{"class":234},[224,2036,407],{"class":234},[224,2038,2039,2041],{"class":226,"line":280},[224,2040,412],{"class":230},[224,2042,415],{"class":234},[10,2044,2045,2046,2048,2049,66],{},"This installs both the ",[25,2047,412],{}," runtime and ",[25,2050,203],{},[299,2052,2054],{"id":2053},"_3-configure-npms-global-prefix","3. Configure npm's global prefix",[10,2056,2057,2058,2060],{},"To install global packages without ",[25,2059,207],{},", set up a directory in your home folder:",[215,2062,2063],{"className":217,"code":436,"language":219,"meta":220,"style":220},[25,2064,2065,2073],{"__ignoreMap":220},[224,2066,2067,2069,2071],{"class":226,"line":227},[224,2068,443],{"class":230},[224,2070,446],{"class":234},[224,2072,449],{"class":234},[224,2074,2075,2077,2079,2081,2083],{"class":226,"line":280},[224,2076,203],{"class":230},[224,2078,456],{"class":234},[224,2080,459],{"class":234},[224,2082,462],{"class":234},[224,2084,465],{"class":234},[10,2086,2087,2088,2090,2091,2093,2094,480],{},"Then add it to your ",[25,2089,471],{}," in ",[25,2092,475],{}," or ",[25,2095,479],{},[215,2097,2098],{"className":217,"code":483,"language":219,"meta":220,"style":220},[25,2099,2100],{"__ignoreMap":220},[224,2101,2102,2104,2106,2108],{"class":226,"line":227},[224,2103,491],{"class":490},[224,2105,495],{"class":494},[224,2107,498],{"class":241},[224,2109,501],{"class":494},[299,2111,2113],{"id":2112},"_4-install-pnpm","4. Install pnpm",[10,2115,2116,2117,480],{},"Since Corepack is no longer included, install pnpm with its ",[14,2118,2120],{"href":511,"rel":2119},[18],"standalone script",[215,2122,2123],{"className":217,"code":516,"language":219,"meta":220,"style":220},[25,2124,2125],{"__ignoreMap":220},[224,2126,2127,2129,2131,2133,2135,2137],{"class":226,"line":227},[224,2128,231],{"class":230},[224,2130,235],{"class":234},[224,2132,527],{"class":234},[224,2134,242],{"class":241},[224,2136,532],{"class":230},[224,2138,369],{"class":234},[10,2140,2141,2142,2144,2145,2147,2148,2150,2151,2153],{},"The installer adds pnpm to your ",[25,2143,471],{}," in your shell config, so open a new terminal (or ",[25,2146,543],{}," your config file) before you run ",[25,2149,547],{},". From then on, ",[25,2152,551],{}," keeps it up to date.",[299,2155,2157],{"id":2156},"_5-install-bun-optional","5. Install Bun (optional)",[10,2159,2160,2161,2164,2165,480],{},"If you want to try ",[14,2162,213],{"href":211,"rel":2163},[18],", use its official installer, which needs ",[25,2166,566],{},[215,2168,2169],{"className":217,"code":569,"language":219,"meta":220,"style":220},[25,2170,2171,2183],{"__ignoreMap":220},[224,2172,2173,2175,2177,2179,2181],{"class":226,"line":227},[224,2174,207],{"class":230},[224,2176,274],{"class":234},[224,2178,287],{"class":234},[224,2180,329],{"class":234},[224,2182,584],{"class":234},[224,2184,2185,2187,2189,2191,2193],{"class":226,"line":280},[224,2186,231],{"class":230},[224,2188,235],{"class":234},[224,2190,593],{"class":234},[224,2192,242],{"class":241},[224,2194,245],{"class":230},[68,2196,2198],{"id":2197},"what-about-yarn","What about Yarn?",[10,2200,2201],{},"If your projects use Yarn, you can still use Corepack. You just need to install it yourself:",[215,2203,2204],{"className":217,"code":607,"language":219,"meta":220,"style":220},[25,2205,2206,2216],{"__ignoreMap":220},[224,2207,2208,2210,2212,2214],{"class":226,"line":227},[224,2209,203],{"class":230},[224,2211,287],{"class":234},[224,2213,618],{"class":234},[224,2215,621],{"class":234},[224,2217,2218,2220],{"class":226,"line":280},[224,2219,167],{"class":230},[224,2221,628],{"class":234},[10,2223,2224,2225,2227,2228,2231],{},"Because we configured a global npm prefix, this works without ",[25,2226,207],{},". Keep in mind that the ",[14,2229,639],{"href":637,"rel":2230},[18]," package is now maintained outside the Node.js release cycle, so check its README if something behaves unexpectedly on Node.js 26.",[68,2233,2235],{"id":2234},"the-script","The script",[10,2237,2238,2239,66],{},"This is the complete script. It includes confirmations, uses a temporary directory that is removed on exit, and reads your answers from the terminal, so it works when you pipe it from ",[25,2240,231],{},[10,2242,2243,2244,2248,2249,2253],{},"This script comes from my ",[14,2245,2247],{"href":655,"rel":2246},[18],"Neovim configuration repo",", where I keep my ",[14,2250,2252],{"href":661,"rel":2251},[18],"install scripts",". The editor needs Node.js for several language servers and plugins, so I update them regularly. If you want the latest version, look there first.",[215,2255,2256],{"className":217,"code":667,"filename":668,"language":219,"meta":220,"style":220},[25,2257,2258,2262,2266,2270,2274,2278,2282,2286,2290,2294,2298,2302,2306,2310,2314,2318,2322,2326,2332,2336,2340,2348,2366,2378,2404,2410,2414,2436,2442,2446,2450,2456,2466,2470,2474,2478,2482,2486,2494,2502,2510,2514,2528,2536,2540,2546,2552,2556,2574,2580,2586,2590,2594,2600,2604,2612,2624,2628,2634,2652,2664,2668,2680,2684,2692,2704,2714,2718,2724,2730,2736,2740,2746,2750,2762,2768,2782,2788,2792,2796,2802,2806,2818,2824,2836,2848,2862,2880,2886,2892,2896,2900,2906,2912,2918,2924,2930,2936,2942,2948],{"__ignoreMap":220},[224,2259,2260],{"class":226,"line":227},[224,2261,676],{"class":675},[224,2263,2264],{"class":226,"line":280},[224,2265,682],{"class":681},[224,2267,2268],{"class":226,"line":685},[224,2269,688],{"class":681},[224,2271,2272],{"class":226,"line":691},[224,2273,694],{"class":681},[224,2275,2276],{"class":226,"line":697},[224,2277,682],{"class":681},[224,2279,2280],{"class":226,"line":702},[224,2281,705],{"class":681},[224,2283,2284],{"class":226,"line":708},[224,2285,682],{"class":681},[224,2287,2288],{"class":226,"line":713},[224,2289,716],{"class":681},[224,2291,2292],{"class":226,"line":719},[224,2293,682],{"class":681},[224,2295,2296],{"class":226,"line":724},[224,2297,727],{"class":681},[224,2299,2300],{"class":226,"line":730},[224,2301,733],{"class":681},[224,2303,2304],{"class":226,"line":736},[224,2305,682],{"class":681},[224,2307,2308],{"class":226,"line":741},[224,2309,744],{"class":681},[224,2311,2312],{"class":226,"line":747},[224,2313,750],{"class":681},[224,2315,2316],{"class":226,"line":753},[224,2317,756],{"class":681},[224,2319,2320],{"class":226,"line":759},[224,2321,682],{"class":681},[224,2323,2324],{"class":226,"line":764},[224,2325,768],{"emptyLinePlaceholder":767},[224,2327,2328,2330],{"class":226,"line":771},[224,2329,775],{"class":774},[224,2331,778],{"class":234},[224,2333,2334],{"class":226,"line":781},[224,2335,768],{"emptyLinePlaceholder":767},[224,2337,2338],{"class":226,"line":786},[224,2339,789],{"class":681},[224,2341,2342,2344,2346],{"class":226,"line":792},[224,2343,795],{"class":230},[224,2345,799],{"class":798},[224,2347,802],{"class":798},[224,2349,2350,2352,2354,2356,2358,2360,2362,2364],{"class":226,"line":805},[224,2351,808],{"class":774},[224,2353,446],{"class":234},[224,2355,813],{"class":234},[224,2357,817],{"class":816},[224,2359,820],{"class":234},[224,2361,823],{"class":234},[224,2363,826],{"class":241},[224,2365,829],{"class":234},[224,2367,2368,2370,2372,2374,2376],{"class":226,"line":832},[224,2369,835],{"class":490},[224,2371,813],{"class":234},[224,2373,840],{"class":494},[224,2375,843],{"class":234},[224,2377,846],{"class":490},[224,2379,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398,2400,2402],{"class":226,"line":849},[224,2381,852],{"class":798},[224,2383,855],{"class":234},[224,2385,858],{"class":798},[224,2387,861],{"class":798},[224,2389,864],{"class":798},[224,2391,855],{"class":234},[224,2393,869],{"class":798},[224,2395,872],{"class":234},[224,2397,869],{"class":798},[224,2399,877],{"class":234},[224,2401,858],{"class":798},[224,2403,882],{"class":241},[224,2405,2406,2408],{"class":226,"line":885},[224,2407,888],{"class":490},[224,2409,892],{"class":891},[224,2411,2412],{"class":226,"line":895},[224,2413,898],{"class":798},[224,2415,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434],{"class":226,"line":901},[224,2417,852],{"class":798},[224,2419,906],{"class":234},[224,2421,858],{"class":798},[224,2423,861],{"class":798},[224,2425,864],{"class":798},[224,2427,906],{"class":234},[224,2429,869],{"class":798},[224,2431,919],{"class":234},[224,2433,858],{"class":798},[224,2435,882],{"class":241},[224,2437,2438,2440],{"class":226,"line":926},[224,2439,888],{"class":490},[224,2441,931],{"class":891},[224,2443,2444],{"class":226,"line":934},[224,2445,898],{"class":798},[224,2447,2448],{"class":226,"line":939},[224,2449,942],{"class":241},[224,2451,2452,2454],{"class":226,"line":945},[224,2453,948],{"class":774},[224,2455,951],{"class":234},[224,2457,2458,2460,2462,2464],{"class":226,"line":954},[224,2459,957],{"class":230},[224,2461,813],{"class":234},[224,2463,817],{"class":816},[224,2465,964],{"class":234},[224,2467,2468],{"class":226,"line":967},[224,2469,898],{"class":798},[224,2471,2472],{"class":226,"line":972},[224,2473,975],{"class":490},[224,2475,2476],{"class":226,"line":978},[224,2477,981],{"class":798},[224,2479,2480],{"class":226,"line":984},[224,2481,768],{"emptyLinePlaceholder":767},[224,2483,2484],{"class":226,"line":989},[224,2485,992],{"class":681},[224,2487,2488,2490,2492],{"class":226,"line":995},[224,2489,998],{"class":494},[224,2491,1001],{"class":241},[224,2493,1004],{"class":234},[224,2495,2496,2498,2500],{"class":226,"line":1007},[224,2497,1010],{"class":494},[224,2499,1001],{"class":241},[224,2501,1015],{"class":234},[224,2503,2504,2506,2508],{"class":226,"line":1018},[224,2505,1021],{"class":494},[224,2507,1001],{"class":241},[224,2509,1026],{"class":234},[224,2511,2512],{"class":226,"line":1029},[224,2513,768],{"emptyLinePlaceholder":767},[224,2515,2516,2518,2520,2522,2524,2526],{"class":226,"line":1034},[224,2517,1037],{"class":494},[224,2519,1001],{"class":241},[224,2521,1042],{"class":798},[224,2523,1045],{"class":230},[224,2525,1048],{"class":234},[224,2527,882],{"class":798},[224,2529,2530,2532,2534],{"class":226,"line":1053},[224,2531,1056],{"class":774},[224,2533,1059],{"class":234},[224,2535,1062],{"class":234},[224,2537,2538],{"class":226,"line":1065},[224,2539,768],{"emptyLinePlaceholder":767},[224,2541,2542,2544],{"class":226,"line":1070},[224,2543,1073],{"class":774},[224,2545,1076],{"class":234},[224,2547,2548,2550],{"class":226,"line":1079},[224,2549,1073],{"class":774},[224,2551,1084],{"class":234},[224,2553,2554],{"class":226,"line":1087},[224,2555,768],{"emptyLinePlaceholder":767},[224,2557,2558,2560,2562,2564,2566,2568,2570,2572],{"class":226,"line":1092},[224,2559,1095],{"class":490},[224,2561,1098],{"class":241},[224,2563,1101],{"class":230},[224,2565,1104],{"class":234},[224,2567,1107],{"class":494},[224,2569,1110],{"class":234},[224,2571,1113],{"class":798},[224,2573,1116],{"class":490},[224,2575,2576,2578],{"class":226,"line":1119},[224,2577,1122],{"class":774},[224,2579,1125],{"class":234},[224,2581,2582,2584],{"class":226,"line":1128},[224,2583,1131],{"class":774},[224,2585,892],{"class":891},[224,2587,2588],{"class":226,"line":1136},[224,2589,1139],{"class":490},[224,2591,2592],{"class":226,"line":1142},[224,2593,768],{"emptyLinePlaceholder":767},[224,2595,2596,2598],{"class":226,"line":1147},[224,2597,1073],{"class":774},[224,2599,1152],{"class":234},[224,2601,2602],{"class":226,"line":1155},[224,2603,768],{"emptyLinePlaceholder":767},[224,2605,2606,2608,2610],{"class":226,"line":1160},[224,2607,207],{"class":230},[224,2609,274],{"class":234},[224,2611,277],{"class":234},[224,2613,2614,2616,2618,2620,2622],{"class":226,"line":1169},[224,2615,207],{"class":230},[224,2617,274],{"class":234},[224,2619,287],{"class":234},[224,2621,329],{"class":234},[224,2623,1180],{"class":494},[224,2625,2626],{"class":226,"line":1183},[224,2627,768],{"emptyLinePlaceholder":767},[224,2629,2630,2632],{"class":226,"line":1188},[224,2631,1073],{"class":774},[224,2633,1193],{"class":234},[224,2635,2636,2638,2640,2642,2644,2646,2648,2650],{"class":226,"line":1196},[224,2637,231],{"class":230},[224,2639,235],{"class":234},[224,2641,1203],{"class":234},[224,2643,1107],{"class":494},[224,2645,1208],{"class":234},[224,2647,1211],{"class":234},[224,2649,1214],{"class":494},[224,2651,1217],{"class":234},[224,2653,2654,2656,2658,2660,2662],{"class":226,"line":1220},[224,2655,207],{"class":230},[224,2657,363],{"class":234},[224,2659,366],{"class":234},[224,2661,1214],{"class":494},[224,2663,1217],{"class":234},[224,2665,2666],{"class":226,"line":1233},[224,2667,768],{"emptyLinePlaceholder":767},[224,2669,2670,2672,2674,2676,2678],{"class":226,"line":1238},[224,2671,207],{"class":230},[224,2673,400],{"class":234},[224,2675,287],{"class":234},[224,2677,329],{"class":234},[224,2679,407],{"class":234},[224,2681,2682],{"class":226,"line":1251},[224,2683,768],{"emptyLinePlaceholder":767},[224,2685,2686,2688,2690],{"class":226,"line":1256},[224,2687,443],{"class":230},[224,2689,446],{"class":234},[224,2691,449],{"class":234},[224,2693,2694,2696,2698,2700,2702],{"class":226,"line":1265},[224,2695,203],{"class":230},[224,2697,456],{"class":234},[224,2699,459],{"class":234},[224,2701,462],{"class":234},[224,2703,1276],{"class":494},[224,2705,2706,2708,2710,2712],{"class":226,"line":1279},[224,2707,1073],{"class":774},[224,2709,1284],{"class":234},[224,2711,1287],{"class":494},[224,2713,964],{"class":234},[224,2715,2716],{"class":226,"line":1292},[224,2717,768],{"emptyLinePlaceholder":767},[224,2719,2720,2722],{"class":226,"line":1297},[224,2721,1073],{"class":774},[224,2723,1302],{"class":234},[224,2725,2726,2728],{"class":226,"line":1305},[224,2727,1073],{"class":774},[224,2729,1310],{"class":234},[224,2731,2732,2734],{"class":226,"line":1313},[224,2733,412],{"class":230},[224,2735,415],{"class":234},[224,2737,2738],{"class":226,"line":1320},[224,2739,768],{"emptyLinePlaceholder":767},[224,2741,2742,2744],{"class":226,"line":1325},[224,2743,1073],{"class":774},[224,2745,1084],{"class":234},[224,2747,2748],{"class":226,"line":1332},[224,2749,768],{"emptyLinePlaceholder":767},[224,2751,2752,2754,2756,2758,2760],{"class":226,"line":1337},[224,2753,1095],{"class":490},[224,2755,1101],{"class":230},[224,2757,1344],{"class":234},[224,2759,1113],{"class":798},[224,2761,1116],{"class":490},[224,2763,2764,2766],{"class":226,"line":1351},[224,2765,1122],{"class":774},[224,2767,1356],{"class":234},[224,2769,2770,2772,2774,2776,2778,2780],{"class":226,"line":1359},[224,2771,1362],{"class":230},[224,2773,235],{"class":234},[224,2775,527],{"class":234},[224,2777,242],{"class":241},[224,2779,532],{"class":230},[224,2781,369],{"class":234},[224,2783,2784,2786],{"class":226,"line":1375},[224,2785,1122],{"class":774},[224,2787,1380],{"class":234},[224,2789,2790],{"class":226,"line":1383},[224,2791,1139],{"class":490},[224,2793,2794],{"class":226,"line":1388},[224,2795,768],{"emptyLinePlaceholder":767},[224,2797,2798,2800],{"class":226,"line":1393},[224,2799,1073],{"class":774},[224,2801,1084],{"class":234},[224,2803,2804],{"class":226,"line":1400},[224,2805,768],{"emptyLinePlaceholder":767},[224,2807,2808,2810,2812,2814,2816],{"class":226,"line":1405},[224,2809,1095],{"class":490},[224,2811,1101],{"class":230},[224,2813,1412],{"class":234},[224,2815,1113],{"class":798},[224,2817,1116],{"class":490},[224,2819,2820,2822],{"class":226,"line":1419},[224,2821,1122],{"class":774},[224,2823,1424],{"class":234},[224,2825,2826,2828,2830,2832,2834],{"class":226,"line":1427},[224,2827,1430],{"class":230},[224,2829,274],{"class":234},[224,2831,287],{"class":234},[224,2833,329],{"class":234},[224,2835,584],{"class":234},[224,2837,2838,2840,2842,2844,2846],{"class":226,"line":1441},[224,2839,1362],{"class":230},[224,2841,235],{"class":234},[224,2843,593],{"class":234},[224,2845,242],{"class":241},[224,2847,245],{"class":230},[224,2849,2850,2852,2854,2856,2858,2860],{"class":226,"line":1454},[224,2851,1457],{"class":490},[224,2853,1460],{"class":494},[224,2855,1001],{"class":241},[224,2857,843],{"class":234},[224,2859,1467],{"class":494},[224,2861,1470],{"class":234},[224,2863,2864,2866,2868,2870,2872,2874,2876,2878],{"class":226,"line":1473},[224,2865,1457],{"class":490},[224,2867,495],{"class":494},[224,2869,1001],{"class":241},[224,2871,843],{"class":234},[224,2873,1484],{"class":494},[224,2875,1487],{"class":234},[224,2877,1490],{"class":494},[224,2879,964],{"class":234},[224,2881,2882,2884],{"class":226,"line":1495},[224,2883,1122],{"class":774},[224,2885,1500],{"class":234},[224,2887,2888,2890],{"class":226,"line":1503},[224,2889,1506],{"class":230},[224,2891,415],{"class":234},[224,2893,2894],{"class":226,"line":1511},[224,2895,1139],{"class":490},[224,2897,2898],{"class":226,"line":1516},[224,2899,768],{"emptyLinePlaceholder":767},[224,2901,2902,2904],{"class":226,"line":1521},[224,2903,1073],{"class":774},[224,2905,1084],{"class":234},[224,2907,2908,2910],{"class":226,"line":1528},[224,2909,1073],{"class":774},[224,2911,1533],{"class":234},[224,2913,2914,2916],{"class":226,"line":1536},[224,2915,1073],{"class":774},[224,2917,1084],{"class":234},[224,2919,2920,2922],{"class":226,"line":1543},[224,2921,1073],{"class":774},[224,2923,1548],{"class":234},[224,2925,2926,2928],{"class":226,"line":1551},[224,2927,1073],{"class":774},[224,2929,1556],{"class":234},[224,2931,2932,2934],{"class":226,"line":1559},[224,2933,1073],{"class":774},[224,2935,1084],{"class":234},[224,2937,2938,2940],{"class":226,"line":1566},[224,2939,1073],{"class":774},[224,2941,1571],{"class":234},[224,2943,2944,2946],{"class":226,"line":1574},[224,2945,1073],{"class":774},[224,2947,1579],{"class":234},[224,2949,2950,2952],{"class":226,"line":1582},[224,2951,1073],{"class":774},[224,2953,1084],{"class":234},[68,2955,2957],{"id":2956},"keep-everything-up-to-date","Keep everything up to date",[10,2959,2960],{},"Once it's installed, keeping it up to date takes just a couple of commands:",[215,2962,2964],{"className":217,"code":2963,"language":219,"meta":220,"style":220},"# Operating system and Node.js\nsudo apt update && sudo apt upgrade\n\n# Package managers\npnpm self-update\nbun upgrade\nnpm update -g\n",[25,2965,2966,2971,2987,2991,2996,3002,3008],{"__ignoreMap":220},[224,2967,2968],{"class":226,"line":227},[224,2969,2970],{"class":681},"# Operating system and Node.js\n",[224,2972,2973,2975,2977,2979,2981,2983,2985],{"class":226,"line":280},[224,2974,207],{"class":230},[224,2976,274],{"class":234},[224,2978,1612],{"class":234},[224,2980,1615],{"class":798},[224,2982,360],{"class":230},[224,2984,274],{"class":234},[224,2986,1622],{"class":234},[224,2988,2989],{"class":226,"line":685},[224,2990,768],{"emptyLinePlaceholder":767},[224,2992,2993],{"class":226,"line":691},[224,2994,2995],{"class":681},"# Package managers\n",[224,2997,2998,3000],{"class":226,"line":697},[224,2999,176],{"class":230},[224,3001,1638],{"class":234},[224,3003,3004,3006],{"class":226,"line":702},[224,3005,1643],{"class":230},[224,3007,1622],{"class":234},[224,3009,3010,3012,3014],{"class":226,"line":708},[224,3011,203],{"class":230},[224,3013,1612],{"class":234},[224,3015,1654],{"class":234},[10,3017,3018,3019,3021,3022,3024],{},"And don't forget your project dependencies: ",[25,3020,1660],{}," and ",[25,3023,1663],{}," tell you what needs updating.",[10,3026,3027,3028,3031,3032,3036],{},"That's also why I still don't use ",[14,3029,1672],{"href":1670,"rel":3030},[18]," day to day, as I explained in the ",[14,3033,3035],{"href":3034},"\u002Fblog\u002Finstall-node-24-on-ubuntu-24\u002F#what-about-nvm","previous post",". It's great if you really need several Node.js versions side by side, but every version you install with NVM is one more you have to remember to patch.",[10,3038,3039],{},"With AI speeding up how fast vulnerabilities are found and exploited, and security breaches that keep popping up, staying up to date has to be as easy as possible. Because now, more than ever, it's not optional.",[1683,3041,1685],{},{"title":220,"searchDepth":280,"depth":280,"links":3043},[3044,3045,3046,3047,3054,3055,3056],{"id":1762,"depth":280,"text":1763},{"id":1828,"depth":280,"text":1829},{"id":1868,"depth":280,"text":1869},{"id":1940,"depth":280,"text":1941,"children":3048},[3049,3050,3051,3052,3053],{"id":1947,"depth":685,"text":1948},{"id":2019,"depth":685,"text":2020},{"id":2053,"depth":685,"text":2054},{"id":2112,"depth":685,"text":2113},{"id":2156,"depth":685,"text":2157},{"id":2197,"depth":280,"text":2198},{"id":2234,"depth":280,"text":2235},{"id":2956,"depth":280,"text":2957},"On October 21, 2026, Node.js released security patches for ten vulnerabilities affecting its supported versions, four of them rated high, including a remote code execution issue. Unsupported versions, such as Node.js 20 and 25, won't be updated.",{},"\u002Fblog\u002Fapt-install-node-26-on-ubuntu-26","7",{"title":1717,"description":3057},"blog\u002F0004.apt-install-node-26-on-ubuntu-26",[383,1711,1712,219],"NciFtAOAr4eTCL3tSaiO3AWi1ck3E7RkjC0GKaxBIeg",[3066,3077,3087,3089,3099,3107],{"id":3067,"path":3068,"title":3069,"description":3070,"date":3071,"readingTime":3072,"tags":3073},"blog_es\u002Fes\u002Fblog\u002F0006.lint-tailwind-css-v4-with-eslint.md","\u002Fes\u002Fblog\u002Flint-tailwind-css-v4-with-eslint","@angelblanco\u002Feslint-config 3.0 ya disponible, ahora con Tailwind CSS","@angelblanco\u002Feslint-config 3.0 ya está en npm: lint opcional de Tailwind CSS v4, @antfu\u002Feslint-config v10 y ESLint 10.","2026-11-07","2",[3074,3075,3076,203],"eslint","tailwindcss","tooling",{"id":3078,"path":3079,"title":3080,"description":3081,"date":3082,"readingTime":3083,"tags":3084},"blog_es\u002Fes\u002Fblog\u002F0005.apt-install-php-85-on-ubuntu-26.md","\u002Fes\u002Fblog\u002Fapt-install-php-85-on-ubuntu-26","Instalar PHP 8.5 con apt en Ubuntu 26.04","Instala PHP 8.5 y Composer en Ubuntu 26.04 LTS con apt desde el repositorio packages.sury.org de Ondřej Surý y mantenlos al día con apt upgrade.","2026-11-06","12",[3085,1711,3086,219],"php","composer",{"id":4,"path":1706,"title":5,"description":1702,"date":1701,"readingTime":1707,"tags":3088},[383,1711,1712,219],{"id":3090,"path":3091,"title":3092,"description":3093,"date":3094,"readingTime":3095,"tags":3096},"blog_es\u002Fes\u002Fblog\u002F0003.create-your-eslint-config.md","\u002Fes\u002Fblog\u002Fcreate-your-eslint-config","Crea tu propia configuración de ESLint y compártela entre proyectos","Si alguna vez has trabajado en varios proyectos, conoces el aburrimiento de copiar configuraciones de ESLint de un repositorio a otro. Cada vez que empiezas un proyecto nuevo, o partes de cero o copias el archivo eslint.config.js del anterior. Hay una forma mejor: publicar tu propio paquete de configuración de ESLint.","2025-11-02","3",[3074,3097,3098,3076,203],"typescript","vue",{"id":3100,"path":3101,"title":3102,"description":3103,"date":3104,"readingTime":3105,"tags":3106},"blog_es\u002Fes\u002Fblog\u002F0002.install-node-24-on-ubuntu-24.md","\u002Fes\u002Fblog\u002Finstall-node-24-on-ubuntu-24","Instalar Node.js 24 en Ubuntu 24.04","Instalar Node.js 24 en Ubuntu 24 debería ser un proceso sencillo. Aunque Ubuntu incluye una versión de Node.js en sus repositorios por defecto, es posible que quieras utilizar una versión más reciente, como Node.js 24, que es LTS desde el 28 de octubre de 2025 y tiene soporte hasta abril de 2028. Si vas a instalarlo desde cero, mejor instala Node.js 26 en Ubuntu 26.04. En esta guía te enseño dos métodos para que lo tengas listo rápidamente.","2025-10-12","6",[383,1711,1712,219],{"id":3108,"path":3109,"title":3110,"description":3111,"date":3112,"readingTime":3113,"tags":3114},"blog_es\u002Fes\u002Fblog\u002F0001.hello.md","\u002Fes\u002Fblog\u002Fhello","De Svelte a Nuxt: Reconstruyendo mi portfolio en 2025","Estamos en 2025 y acabo de publicar una versión completamente nueva de mi web personal. He migrado de un stack basado en Svelte y Sapper a Nuxt, Tailwind CSS y un monorepo con Turborepo. No ha sido un cambio estético, sino una reescritura completa, fruto de cinco años de evolución en el frontend y de las ganas de usar en casa las mismas herramientas que en el trabajo.","2025-09-27","4",[3115,3098,3116,3117,3075],"nuxt","svelte","turborepo",1794096654401]