Vous n'avez pas encore de notification

Page d'accueil

Options d'affichage

Abonné

Actualités

Abonné

Des thèmes sont disponibles :

Thème de baseThème de baseThème sombreThème sombreThème yinyang clairThème yinyang clairThème yinyang sombreThème yinyang sombreThème orange mécanique clairThème orange mécanique clairThème orange mécanique sombreThème orange mécanique sombreThème rose clairThème rose clairThème rose sombreThème rose sombre

Vous n'êtes pas encore INpactien ?

Inscrivez-vous !

Développons une application multiplateforme, basée sur JavaScript, Node.js et pkg

Parce que pourquoi pas
Logiciel 7 min
Développons une application multiplateforme, basée sur JavaScript, Node.js et pkg
Crédits : badmanproduction/iStock/Thinkstock

Après vous avoir appris à développer vos premières applications de manière assez classique, nous nous portons vers une solution plus inhabituelle. Nous utiliserons pour cela JavaScript et Node.js pour un résultat multiplateforme.

Lorsqu’on cherche à présenter Node.js à des utilisateurs n'ayant jamais mis le nez dans cette plateforme, il est de bon ton de commencer par un tutoriel vous expliquant comment créer un serveur web en quelques lignes de code.

N'ayant jamais vraiment compris l’intérêt de commencer par cette étape, nous allons procéder autrement pour vous faire comprendre (un bout de) ce que permet cette solution, qui a révolutionné le petit monde de JavaScript il y a presque 10 ans.

Pour tout dire, l’exemple choisi sera sans doute considéré comme le pire croisement de choix possible pour un développeur en 2018. Mais après tout, la beauté du développement logiciel et la liberté donnée par un langage tel que JavaScript, c’est aussi ça.

Node.js, c’est quoi ?

Commençons par quelques bases. JavaScript est un langage qui s’exécute côté client. Il est interprété par votre machine, le plus souvent via votre navigateur, et non côté serveur comme c’est le cas pour PHP.

Créé en 1995 par Brendan Eich, il a fortement évolué depuis et a même été standardisé dès 1997 sous la forme d’ECMAScript. Il est simple à prendre en main, dispose de grandes possibilités, mais surtout d’une très large communauté tant il est au centre du web actuel.

Il a été pensé pour s’exécuter au sein d’une page web pour la rendre dynamique, et pas comme un langage de script à part entière tel que Python, Ruby ou PowerShell. Pour cela, il lui manquait un environnement d’exécution (ou runtime). C’est ce que lui a apporté Node.js.

Cette plateforme open source se base sur le moteur V8 de Chrome/Chromium. Mais plutôt que de le mettre à disposition d’un navigateur côté client, il permet une exécution au sein de n’importe quelle machine et donc côté serveur. Le tout, avec une architecture orientée évènements, capable de gérer un grand nombre d’accès asynchrones en simultané.

Vous pouvez donc faire fonctionner un programme JavaScript comme n’importe quelle autre application. Comme nous allons le voir, il est même possible de le compiler désormais, pour l’utiliser de manière indépendante dans différents systèmes d’exploitation. Mais pas sans quelques sacrifices.

Un IDE et c’est parti !

La première chose à faire pour commencer à exploiter Node.js est de l’installer sur votre machine. Deux branches sont disponibles : Current (10.x actuellement), avec toutes les dernières fonctionnalités, et LTS (8.x actuellement) qui se veut stable et suivie à long terme. Nous opterons pour cette dernière.

Des binaires sont disponibles pour Linux (ARM et x86), macOS ou Windows, ainsi que des plateformes moins courantes comme SunOS. Une image Docker est également fournie.

Une fois l’installation terminée, il nous faut un éditeur pour créer notre première application. Nous utiliserons Visual Studio Code, mais vous pouvez choisir ce que bon vous semble. Nous vous conseillons tout de même un IDE qui dispose d’outils pensés pour les développeurs et d’un terminal. Atom peut être une bonne alternative.

Une fois dans l’interface, créons un fichier hello.js pour y taper la ligne suivante :

console.log("Hello, world !");

Une fois le fichier enregistré, il suffit de l’exécuter. Rendez-vous dans le terminal (CTRL+ù), dans le dossier où se situe le fichier, et lancez la commande suivante :

node hello.js

Le résultat devrait simplement afficher le texte « Hello, world ! » et revenir à la console :

Visual Studio Code Node.js Hello world

C’est quand les vacances ?

Procédons maintenant à un essai un peu plus complexe : afficher le temps restant avant les vacances, en partant du principe qu'elles débutent le 15 juillet 2018.

Commençons par créer trois constantes : une contenant la date de nos vacances, une autre la date du jour et une dernière le délai entre les deux. Une fois leur valeur récupérée, elle sera affichée :

const dateVacances = new Date('2018-07-15');
const dateAjd = new Date();
const timeZone = dateAjd.getTimezoneOffset();
const delai = dateVacances - dateAjd + (timeZone * 60 * 1000);

console.log(dateVacances);
console.log(dateAjd);
console.log(delai);

Il suffit là encore de tester le résultat dans la console de notre IDE via la commande node hello.js. Par défaut, le délai entre deux dates est renvoyé sous forme d'une valeur en millisecondes. On y ajoute le décalage horaire issu de la zone géographique qui est, elle, renvoyée sous forme d'une valeur en minutes.

Pour obtenir un résultat plus présentable, il nous faut calculer le nombre de jours, de semaines et de mois qui nous séparent de la date fatidique. Pour cela, nous allons ajouter la portion de code suivante :

const jours = Math.round(delai / 1000 / 3600 / 24);
const semaines = Math.round(delai / 1000 / 3600 / 24 / 7 * 10) / 10;
const mois = Math.round(delai / 1000 / 3600 / 24 / 365 * 12 * 10) / 10;

console.log(jours);
console.log(semaines);
console.log(mois);

Via la méthode Math.round(), nous obtenons des arrondis sous forme d’un entier. Pour obtenir un résultat à une décimale près, nous multiplions la valeur par dix avant de la diviser par dix une fois l’arrondi calculé.

Nous pouvons désormais afficher notre résultat sous forme d’une phrase avec la ligne suivante :

console.log(`J-${jours} avant les vacances, soit ${semaines} semaines ou ${mois} mois`);

Cette méthode un peu simpliste a néanmoins quelques effets négatifs : si la date est passée, une valeur négative sera affichée, le pluriel n’est pas pris en compte, ainsi que les cas de dates proches de celle de nos vacances.

Nous allons donc définir trois cas spécifiques via des phrases prêtes à utiliser :

const stringTropTard = "Le début des vacances, c'était avant !";
const stringAjd = "Le début des vacances, c'est maintenant !";
const stringDemain = "Le début des vacances, c'est demain !";

Nous établissons également une série de règles pour définir la phrase finale, affichée une fois la situation analysée :

let stringFinale;

if (jours < -1) stringFinale = stringTropTard;
else if (delai < 0) stringFinale = stringAjd;
else if (jours < 2) stringFinale = stringDemain;
else
{
stringFinale = `J-${jours} avant les vacances`;
if (semaines >= 2 || mois >= 2) stringFinale += ", soit ";
if (semaines >= 2) stringFinale += `${semaines} semaines`;
if (semaines >= 2 && mois >= 2) stringFinale += " ou ";
if (mois >= 2) stringFinale += `${mois} mois`;
stringFinale += " !";
}

console.log(stringFinale);

Ici, notez l’utilisation du mot-clé let plutôt que const pour la variable stringFinale. La raison est simple : sa valeur va être modifiée. On évite également la question du pluriel en ne prenant en compte le nombre de jours ou de semaines que si leur valeur est supérieure à 2.

On peut désormais nettoyer notre code en supprimant toutes les lignes contenant la méthode console.log(), excepté la dernière qui affiche le résultat final. On peut aussi commenter ces lignes afin de pouvoir les réutiliser plus tard si nécessaire.

Et si on rendait le tout indépendant ? Merci npm et pkg

Notre petite application fonctionne bien dans un terminal, sur n’importe quelle plateforme. Mais pour l’exploiter il faut que Node.js soit installé, ce qui n’est pas simple pour la distribution et l'utilisation par un tiers.

Il nous faut alors créer un package intégrant l'environnement d'exécution. Il n’existe pas d’outil livré avec Node.js pour cette action, mais d'autres permettent de le faire. C’est notamment le cas de pkg, diffusé sous licence MIT et encore développé aujourd’hui. Son installation est simple grâce au gestionnaire de paquets de Node.js : npm.

Il suffit de taper la commande suivante dans le terminal de l’IDE :

npm install -g pkg

Les fichiers nécessaires seront téléchargés et installés, vous n’aurez ainsi plus qu’une ligne de commande à taper pour créer une version Linux, macOS et Windows :

pkg hellos.js

Trois fichiers sont créés : hello-linux, hello-macos et hello-win.exe. Les deux premiers pèsent à peu près 35 Mo, 22 Mo pour le dernier… contre 1 ko pour le fichier de départ. L’environnement d’exécution intégré occupe en effet un minimum de place et ne permet pas d'obtenir un fichier plus compact.

On notera également que le résultat n’est pas affiché de manière instantanée, ce qui montre une certaine « lourdeur » par rapport à une application compilée, exploitant C++/C# par exemple.

49 commentaires
Avatar de Zergy Abonné
Avatar de ZergyZergy- 26/06/18 à 09:03:51

35 Mo pour un simple "Hello World", et après on s'étonne des pages webs lourdes et certains osent dire que javascript c'est l'avenir.

Sans moi.

Avatar de David_L Équipe
Avatar de David_LDavid_L- 26/06/18 à 09:09:19

C'était un peu le principe de montrer la limite. Après ça reste une solution assez simple pour packager une app facile à développer en multiplateforme ;)

Avatar de th3squal Abonné
Avatar de th3squalth3squal- 26/06/18 à 09:10:03

On ne parles pas forcément de "pages web" mais "d'applications natives", ce qui "excuse en partie" le fait que le framework ET l'environnement d'exécution soit embarqué.

Pour les pages web, pas besoin d'embarquer node.js, le navigateur intégré fait l'affaire, et le fichier .js suffit :) soit 1ko! Après libre au dev de connaitres les limites des technos :)

Personnellement j'ai énormément de mal avec Node.js, d'autres technologies tels que xamarin permettent la même chose, en étant beaucoup plus léger (bien que relativement lourds vis à vis d'une vrai app native).

Avatar de Zergy Abonné
Avatar de ZergyZergy- 26/06/18 à 09:17:09

C'est justement le petit problème que j'ai avec Javascript, à la base c'était un langage pour faire des trucs rigolo sur des pages web, puis c'est devenu plus sérieux, mais encore limité aux web, à présent, on veut tout lui faire faire, mais je n'ai pas l'impression que c'est vraiment prévu pour à la base.

Pour les applications tout intégrées, c'est plus simple à déployer, mais si la parti "outils intégrés" permettant à l'application représente 99% du la taille du programme, ça pose quand même question.

Intéressant pour le style, pas plus.

Avatar de EMegamanu Abonné
Avatar de EMegamanuEMegamanu- 26/06/18 à 09:21:08

Zergy a écrit :

35 Mo pour un simple "Hello World", et après on s'étonne des pages webs lourdes et certains osent dire que javascript c'est l'avenir.

Sans moi.

Joli troll...

Ici tout l'environnement d'exécution est fourni avec. C'est comme si avec ta "page Web" , tu fournissais aussi le navigateur.

Rien de choquant. On voit bien des applis Java ou .Net qui au lieu d'etre distribuées uniquement aveceur byte code, t'amenent aussi l'environnement d'exécution avec elles.

C'est une autre façon de faire. C'est comme en C/C++ quand tu choisis de lier statiquement tes libs plutôt que de le faire dynamiquement.

Une réponse différente pour un besoin différent.

Aussi, rien n'empêche de distribuer une app JS directement sous forme de bundle de scripts.

Avatar de zogG INpactien
Avatar de zogGzogG- 26/06/18 à 09:28:09

Pour les 99% du programme c'est un faux débat. Cette partie est fixe donc évidemment pour un hello world ça pique un peu mais c'est pas vraiment l'objectif de ce genre de framework.

Pour l'utilisation du JS je suis plus emmerdé par la manque de cohérence dans la plupart des cas avec le reste du système.

Avatar de th3squal Abonné
Avatar de th3squalth3squal- 26/06/18 à 09:28:15

Javascript à su énormément évoluer (comparativement à VBScript ayant un temps eu la même fonction, mais qui est mort et enterré au profit de powershell qui s'est cantonné au scripting shell)

Ce n'est plus le petit langage de scripting pour apprendre sur une page web, c'est un langage qui actuellement possède beaucoup d'atouts vis à vis d'autres langages plus évolués (Class, Prototyping, Closures, etc)

En revanche, ce qui me "gène" dans node.js c'est la lourdeur de l'environnement d'exécution en effet... Mais comme le dit à juste titre EMegamanu, Réponse différente pour un besoin différent.

Avatar de Zergy Abonné
Avatar de ZergyZergy- 26/06/18 à 09:57:05

Oui, c'est ce que je voulais dire, ça la parti "outils" de ton programme tout compris prendre peu de place ça a plus d'intérêt.

Avatar de Jarodd Abonné
Avatar de JaroddJarodd- 26/06/18 à 10:23:01

Zergy a écrit :

C'est justement le petit problème que j'ai avec Javascript, à la base c'était un langage pour faire des trucs rigolo sur des pages web

Ce n'est pas parce qu'on fait des trucs "rigolos" avec qu'il a été conçu pour ça...

Pour la critique du 35 Mo, évidemment c'est lourd pour un Hello world, mais est-ce vraiment important ?  Je doute que David la lance en prod :transpi: Ce poids ne va pas doubler si on affiche une seconde ligne... Si on fait une application plus complexe,ça va prendre quelques centaines de ko de plus.

Le but est de faire ses premières lignes de code, comprendre comment ça fonctionne. Fais ça avec n'importe langage, tu aura aussi un truc bien lourd pour un maigre résultat, mais il faut bien commencer quelque part.

Édité par Jarodd le 26/06/2018 à 10:25
Avatar de jojofoufou INpactien
Avatar de jojofoufoujojofoufou- 26/06/18 à 10:23:36

Prochaine étape: ReasonML ? 😇

Édité par jojofoufou le 26/06/2018 à 10:23
Il n'est plus possible de commenter cette actualité.
Page 1 / 5