{{tag>programmation serveur }}
====== Node.js ======
**[[wpfr>Node.js]]** est un logiciel permettant d'exécuter du [[wpfr>JavaScript]] côté serveur, contrairement à ce qu'on a l'habitude de voir avec le JavaScript côté client (interprété par le [[:navigateur|navigateur Web]]).
L'avantage d'utiliser **Node.js** est que JavaScript permet l'exécution de tâches asynchrones, ce qui peut être pratique dans certaines situations (en particulier pour les [[:web#applications Web]]).\\
**Node.js** permet de créer des applications //[[:serveur]]// facilement grâce à des bibliothèques qu'il prend en charge via **[[https://www.npmjs.com|npm]]**, son [[:gestionnaire de paquets|gestionnaire de dépendances]] et son dépôt éponyme.
L'écosystème JavaScript est un milieu en constante et rapide évolution. Attention à l'actualité des informations que vous trouvez à ce sujet. À la rédaction de ce message, **[[https://pkg.com/|Yarn]]** se propose de remplacer **npm**, et **[[https://bun.sh|Bun]]** propose de remplacer à la fois **Node.js**, **npm** et **Yarn**.
===== Installation =====
Il existe de nombreuses manières d'installer **Node.js**. Ubuntu le propose dans ses [[:dépôts]] officiels et recommande évidemment cette méthode. Mais certaines applications JavaScript requièrent des versions spécifiques de **Node.js** et/ou de **npm**, et [[:APT]] (qu'il s'agisse de [[:PPA]] ou des [[:dépôts]] officiels d'Ubuntu) ne convient pas à l'utilisation de diverses versions spécifiques.
Il existe donc plusieurs autres méthodes d'installation, et en particulier des gestionnaires de versions qui permettent l'installation voire même l'usage de plusieurs versions de **Node.js** simultanément :
* **[[#au_moyen_du_gestionnaire_de_versions_nvm|nvm]]** (//Node Version Manager//)
* **[[#au_moyen_du_gestionnaire_de_versions_n|n]]**
* **[[https://docs.brew.sh/Homebrew-on-Linux|Homebrew]]**
Il est aussi possible de profiter de l'environnement [[:Docker]] pour installer les versions de **Node.js**, **npm** ou **Yarn** de son choix, en les isolant du système. Dans ce cadre on préfère généralement déployer plus directement et simplement les images des applications qui reposent sur **Node.js** elles-mêmes.
==== Depuis les dépôts officiels ====
Cette méthode n'est recommandée que si vous utilisez **Node.js** pour une application en particulier, compatible avec une version de **Node.js** parfois ancienne. Les versions d'Ubuntu étant maintenues plus longtemps que certaines versions de **Node.js**, il arrive régulièrement que la version proposée dans les dépôts officielles soit déjà abandonnée.
Si vous avez couramment besoin de **Node.js** ou souhaitez utiliser une version récente, utilisez de préférence un gestionnaire de version, tel que **[[#au_moyen_du_gestionnaire_de_versions_n|n]]** ou **[[#au_moyen_du_gestionnaire_de_versions_nvm|nvm]]**.
Installer **Node.js** sous Ubuntu est simple, il suffit d'[[:deb#installer_un_paquet_deb|installer les paquets]] ''[[apt>nodejs,npm|nodejs npm]]''. En revanche la version installée de cette manière peut être ancienne et même déjà abandonnée (voir ci-dessus).\\
Soit, dans un [[:terminal]] avec la [[:commande_shell|commande]] ''[[:apt-cli|apt]]'' :
sudo apt update
sudo apt install nodejs npm
Si vous souhaitez [[:compilation|compiler]] des projets avec **Node.js** il vous faudra [[:deb#installer_un_paquet_deb|installer]] ''[[apt>nodejs-dev]]''. Notez que vous n'avez pas besoin de ce paquet pour développer des projets en [[wpfr>JavaScript]], il est utile en revanche si vous comptez développer des modules pour **Node.js**.
==== Depuis un PPA (dépôts "nodesource") ====
Cette méthode n'offre pas la souplesse ni la facilité d'utilisation d'un gestionnaire de version dédié, tel que **[[#au_moyen_du_gestionnaire_de_versions_n|n]]** ou **[[#au_moyen_du_gestionnaire_de_versions_nvm|nvm]]**. En outre elle peut complexifier et rendre imprévisibles les [[:upgrade|mises à jour majeures]] du système.
[[https://chrislea.com/2014/07/09/joining-forces-nodesource/|Chris Lea]] et [[https://nodesource.com/blog/chris-lea-joins-forces-with-nodesource|NodeSource]] se sont associés pour maintenir un [[:PPA]] avec des versions stables de **Node.js**, souvent plus récentes que celles des dépôts officiels.
Chaque version de **Node.js** possède un script d'installation qui ajoute le dépôt correspondant au gestionnaire de paquet.\\
On les trouve ici : [[https://github.com/nodesource/distributions]]
=== Pour installer Node.js 24.x (LTS active) ===
C'est la dernière version stable recommandée pour vos applications en production.
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - && sudo apt-get install -y nodejs
Pour installer des paquets supplémentaires avec **npm**, vous aurez peut-être besoin d'installer ''[[apt>build-essential]]''.
==== Au moyen du gestionnaire de versions nvm ====
**[[https://github.com/nvm-sh/nvm|nvm]]** (//Node Version Manager//), permet de gérer et utiliser très facilement différentes versions de //npm// et //node//.
**nvm** rend disponible les paquets installés globalement sous des versions spécifiques de **Node.js** et **npm** exclusivement sous ces versions, séparées des autres versions de **Node.js** et **npm**. On est sûr d'avoir chaque outil compatible avec sa version de **Node.js**, mais il faut réinstaller les outils dont on a besoin pour chaque nouvelle version.\\
À ce titre le gestionnaire **[[#au_moyen_du_gestionnaire_de_versions_n|n]]** est plus souple et moins contraignant, mais éventuellement aussi moins fiable (tout est disponible partout).
Si besoin, [[:deb#installer_un_paquet_deb|installer]] tout d'abord **[[wpfr>cURL]]** :
sudo apt install curl
puis **nvm**:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Ce numéro de version est amené à changer, vérifier la commande exacte sur [[https://github.com/nvm-sh/nvm?tab=readme-ov-file#install--update-script|le dépôt nvm]] ou [[https://nodejs.org/fr/download|la page download de la doc officielle de node]].
Pour pouvoir utiliser immédiatement la commande ''nvm'' :
source ~/.bashrc
**nvm** est installé !
Pour lister les versions disponibles :
nvm ls
Pour utiliser la version ''v16.20.2'' en particulier de **Node.js** :
nvm use 16
==== Au moyen du gestionnaire de versions n ====
**[[https://github.com/tj/n|n]]**, une fois installé, permet l'installation simplifié des différentes versions de **Node.js**.
Si besoin, [[:deb#installer_un_paquet_deb|installer]] tout d'abord **[[wpfr>cURL]]** :
sudo apt install curl
puis **n** :
sudo curl -o /usr/local/bin/n https://raw.githubusercontent.com/visionmedia/n/master/bin/n
Puis affecter les [[:permissions]] en écriture à **n** :
sudo chmod +x /usr/local/bin/n
et enfin, installer **Node.js** :
sudo n stable
===== Utilisation basique =====
Voici un exemple d'application JavaScript que pourrait exécuter **Node.js** :
setTimeout(function() {
console.log('Coucou'); // écrit un message dans la console au bout de deux secondes
}, 2000);
console.log('toi'); // écrit un message dans la console
Pour exécuter cette application, il vous suffit de saisir dans un [[:terminal]] la [[:commande_shell|commande]] suivante :
node app.js
Bien entendu une telle application n'a aucun intérêt, il s'agit juste montrer rapidement comment cela fonctionne.\\
L'idée serait plutôt de monter un [[:web#serveurs|serveur Web]] dont voici un exemple :
var http = require('http');
var port = 8080;
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('Salut tout le monde !');
res.end();
}).listen(port);
console.log("Serveur tourne sur http://localhost:"+port);
Pour comprendre ce code vous devriez jeter un coup d'œil à la [[https://nodejs.org/docs/latest/api/index.html|documentation officielle]].
Bien entendu **Node.js** n'a pas uniquement vocation à créer de petits serveurs comme celui-ci. Mais pour aller plus loin il va falloir utiliser des [[#Ajout de modules|modules]].
===== Ajout de modules =====
Ajouter un module à **Node.js** est extrêmement simple. Depuis un [[:terminal]] entrez la commande suivante :
npm install express
**Express.js** est un module qui vous évitera de réécrire le code pour un [[wpfr>serveur HTTP]] à chaque application.\\ N'hésitez pas à consulter sa documentation.
De la même façon vous pourrez installer beaucoup d'autres modules, distribués sur [[https://www.npmjs.com|npmjs.com]].
===== Désinstallation =====
Pour supprimer cette application, il suffit de [[:deb#desinstaller_un_paquet_deb|supprimer son paquet]].
===== Voir aussi =====
* [[https://nodejs.org/fr|site officiel]] de **Node.js**
* [[https://github.com/nodejs/node|GitHub]]
* **(//en//)** //[[https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager|Installer Node.js sous linux]]//
* **(//en//)** [[https://nodejs.org/docs/latest/api/index.html|Documentation officielle]] de **Node.js**
* **(//en//)** [[https://github.com/nodejs/LTS#lts-schedule|la feuille de route (roadmap) des versions stables]]
* [[https://www.hostinger.fr/tutoriels/comment-installer-node-js-sur-ubuntu|Tutoriel]] pour l'installation de **npm** et **Node.js** par **nvm**
----
//[[:Contributeurs]] : [[:utilisateurs:nekdev]], [[:utilisateurs:krodelabestiole]].//