Node.js
Notons que Node.js est un environnement d'exécution JavaScript basé sur le moteur JavaScript V8 de Google qui exécute le code JavaScript en dehors du navigateur. Il aide les développeurs à créer des unités de code non bloquantes afin de tirer le meilleur parti des ressources système pour créer des applications plus réactives.
Le système de modules de Node permet aux développeurs d'étendre la plateforme à l'aide de modules tiers pour obtenir un maximum de fonctionnalités. Node.js permet simplement aux développeurs d'utiliser chaque projet JavaScript open source sur le serveur de la même manière que sur le navigateur client, ce qui permet une intégration plus étroite et plus efficace entre le serveur Web et les scripts de l'application Web prise en charge.
Les versions majeures de Node.js entrent dans le statut Current release pendant six mois, ce qui donne aux auteurs de bibliothèques le temps d'ajouter la prise en charge de ces versions. Après six mois, les versions impaires (9, 11, etc.) ne sont plus prises en charge et les versions paires (10, 12, etc.) passent au statut Active LTS et sont prêtes pour une utilisation générale. Le statut de la version LTS est un long-term support, qui garantit généralement que les bogues critiques seront corrigés pendant un total de 30 mois. Les applications de production ne doivent utiliser que les versions Active LTS ou Maintenance LTS. Ceci établi que, la version 17 de Node.js n'est pas principalement destiné à la production mais aux tests et à l'expérimentation.
« Nous avons mis en place le processus de publication LTS il y a presque cinq ans, il fonctionne assez bien dans la mesure où nous trouvons un équilibre entre le fait que certaines personnes veulent les dernières nouveautés et que d'autres préfèrent que les choses soient stables... lorsque nous passons à LTS », a déclaré Michael Dawson Responsable Node.js pour Red Hat et IBM chez Red Hat. « Nous avons, nous l'espérons, résolu tous les problèmes. En fait, chez Red Hat, nous ne publions que des binaires pour les versions LTS, et c'est ce que je recommande aux gens d'utiliser en production », a-t-il ajouté. Voici, ci-dessous, les changements apportes par la version 17 de Node.js :
- Support d'OpenSSL 3.0 ;
- APIs supplémentaires promises ;
- Stack traces avec la version de Node.js
- Le moteur JavaScript V8 a été mis à jour vers la version 9.5.
OpenSSL 3.0
OpenSSL est une boîte à outils robuste et complète pour les protocoles TLS (Transport Layer Security) et SSL (Secure Sockets Layer). Il s'agit également d'une bibliothèque de chiffrement à usage général. Elle bénéficie d'une licence de type Apache, ce qui signifie essentiellement qu’elle est libre d’utilisation à des fins commerciales et non commerciales, sous réserve de quelques conditions de licence simples. Développée en C, OpenSSL est disponible sur les principaux systèmes d'exploitation et dispose de nombreux wrappers ce qui la rend utilisable dans une grande variété de langages informatiques.
Parmi les nouvelles fonctionnalités d'OpenSSL 3.0, il y a l'introduction des Providers, dont l'un est un provider FIPS qui peut être activé dans Node.js. Si un développeur rencontre une erreur ERR_OSSL_EVP_UNSUPPORTED dans son application avec Node.js 17, il est probable que l’application ou un module utilisé tente d'utiliser un algorithme ou une taille de clé qui n'est plus autorisé par défaut avec OpenSSL 3.0. Une nouvelle option de ligne de commande, --openssl-legacy-provider, a été ajoutée pour revenir à l'ancien fournisseur comme solution de contournement temporaire pour ces restrictions plus strictes.
« Conformément à notre politique de publication, les nouvelles fonctionnalités apportées au moteur d'exécution sont publiées environ toutes les deux semaines dans notre ligne de publication. Cela signifie que la majorité des nouveaux engagements inclus dans la première version majeure (v17.0.0) sont ceux qui impliquent des changements de rupture. Nous tenons à minimiser le nombre et la perturbation de ces changements de rupture pour la stabilité de la plateforme et pour faciliter les migrations de version pour nos utilisateurs », a souligné l’équipe de développement de Node Js.
Code : | Sélectionner tout |
1 2 3 4 5 6 | $ ./node — openssl-legacy-provider -p 'crypto.createHash("md4")' Hash { _options: undefined, [Symbol(kHandle)]: Hash {}, [Symbol(kState)]: { [Symbol(kFinalized)]: false } } |
Empiler les traces avec la version Node.js
Les traces de pile sont un élément essentiel du diagnostic des erreurs d'application, aidant à fournir une visibilité sur ce qui ne va pas. Dans Node.js 17, la version Node.js sera incluse à la fin de la trace de la pile lorsqu'il existe une exception fatale qui entraîne la fermeture du processus.
Il est utile de fournir ces informations par défaut car souvent, lors du diagnostic des erreurs signalées, l'une des premières questions posées sera : quelle version de Node.js utilisez-vous ? Node.js 17 est également livré avec une option de ligne de commande, --no-extra-info-on-fatal-exception, pour omettre ces informations supplémentaires.
Version 9.5 du moteur JavaScript V8
Dans Node.js 17.0.0, le moteur JavaScript V8 a été mis à jour vers V8 9.5. (V8 9.4 est la dernière version disponible dans Node.js 16). Outre des ajustements et des améliorations des performances, cette mise à jour apporte des types supplémentaires pris en charge pour l'API Intl.DisplayNames et des options étendues de timeZoneName dans l'API Intl.DateTimeFormat. Dans Node.js 16, le moteur JavaScript V8 est V8 9.4. C'est grâce aux mises à jour du moteur JavaScript V8 que Node.js obtient les nouvelles fonctionnalités du langage JavaScript.
Node.js 16 promu au support à long terme
La semaine prochaine, Node.js 16 sera promu au support à long terme. Il s'agit d'une étape importante, car de nombreux utilisateurs, en particulier ceux qui exploitent des déploiements de production, choisiront d'utiliser uniquement les versions de Node.js prises en charge à long terme. Cela signifie que, pour la première fois, certaines fonctionnalités seront disponibles dans une version prise en charge à long terme. Les versions 16 et ultérieures de Node.js incluent Corepack, un script qui agit comme un pont entre les projets Node.js et les gestionnaires de paquets avec lesquels ils sont destinés à être utilisés pendant le développement. En termes pratiques, Corepack permettra d'utiliser Yarn et pnpm sans avoir à les installer.
Deno
Tout comme Node.js, Deno est un moteur d'exécution, moderne et sécurisé pour JavaScript et TypeScript , il utilise V8 et est construit en Rust. Deno assume explicitement le rôle de runtime et de gestionnaire de paquets au sein d'un seul et même exécutable, plutôt que de nécessiter un programme de gestion de paquets distinct.
Outre le runtime Deno, l’outil fournit également une liste de modules standard qui sont examinés par les responsables de Deno et dont le fonctionnement est garanti avec une version spécifique de Deno. Ils cohabitent avec le code source de Deno dans le référentiel denoland/deno. Ces modules standard sont hébergés sur deno.land/std et sont distribués via des URL comme tous les autres modules ES compatibles avec Deno.
Pour justifier le projet Deno, les responsables déclarent : « Notre vecteur d'origine dans ce domaine, Node.js, s'est avéré être une plateforme logicielle très réussie. Les gens l'ont trouvé utile pour créer des outils de développement Web, créer des serveurs Web autonomes et pour une myriade d'autres cas d'utilisation. Node, cependant, a été conçu en 2009 lorsque JavaScript était un langage très différent. Par nécessité, Node a dû inventer des concepts qui ont ensuite été repris par les organismes de normalisation et ajoutés au langage différemment.
« Avec l'évolution du langage JavaScript et de nouveaux ajouts comme TypeScript, la création de projets Node.js peut devenir une tâche ardue, impliquant la gestion de systèmes de génération et d'autres outils lourds qui enlèvent le plaisir des scripts de langage dynamique. De plus, le mécanisme de liaison à des bibliothèques externes est fondamentalement centralisé via le référentiel NPM, qui n'est pas conforme aux idéaux du Web. « Nous pensons que le paysage de JavaScript et de l'infrastructure logicielle environnante a suffisamment changé pour qu'il soit utile de le simplifier. Nous recherchons un environnement de script amusant et productif qui peut être utilisé pour un large éventail de tâches ». Voici, ci-dessous, les nouveautés apportées à la version 1.15 de Deno.
Nouvelles API de chiffrement
Conformément à l’un des objectifs de l’équipe de développement de Deno, de disposer d'une API Crypto Web complète d'ici la fin de l'année, Deno a bien progressé dans cette version :
- crypto.subtle.encrypt() : le cryptage AES-CBC est maintenant supporté ;
- crypto.subtle.decrypt() : le décryptage AES-CBC est maintenant supporté ;
- crypto.subtile.exportKey() : les clés RSA peuvent maintenant être exportées au format spki ;
- crypto.subtle.importKey() : les clés ECDSA peuvent maintenant être importées au format raw ;
- crypto.subtle.deriveBits() : la dérivation ECDH est maintenant supportée (seulement pour les clés P256) ;
- crypto.subtle.wrapKey() : l'enveloppement des clés est maintenant supporté pour toutes les combinaisons de clés et de formats supportées par crypto.subtle.exportKey().
Améliorations de FFI
L'API FFI a été ajoutée à Deno 1.13. Cette API permet aux utilisateurs d'appeler des bibliothèques écrites dans des langages supportant l'ABI C tels que C, C++, C#, Kotlin, Nim, Rust ou Zig. La version 1.15 de Deno ajoute la prise en charge de deux fonctionnalités très utiles à l'API FFI : les appels non bloquants et les arguments de tampon.
Appels non bloquants
Il existe de nombreux cas d'utilisation où les utilisateurs peuvent vouloir exécuter des fonctions FFI liées au CPU en arrière-plan sans bloquer d'autres tâches sur le thread principal. Avec cette version, les symboles peuvent être marqués non bloquants dans Deno.dlopen. Ces appels de fonction s'exécuteront sur un thread bloquant dédié et renverront une promesse correspondant au résultat souhaité.
Exemple d'exécution d'appels FFI coûteux avec Deno :
Code C : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // sleep.c #ifdef _WIN32 #include <Windows.h> #else #include <time.h> #endif int sleep(unsigned int ms) { #ifdef _WIN32 Sleep(ms); #else struct timespec ts; ts.tv_sec = ms / 1000; ts.tv_nsec = (ms % 1000) * 1000000; nanosleep(&ts, NULL); #endif } |
Appel de Deno
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | // nonblocking_ffi.ts const library = Deno.dlopen("./sleep.so", { sleep: { parameters: ["usize"], result: "void", nonblocking: true, }, }); library.symbols.sleep(500).then(() => console.log("After")); console.log("Before"); |
Resultat
Code : | Sélectionner tout |
1 2 3 | $ deno run --allow-ffi --unstable nonblocking_ffi.ts Before After |
Arguments de type tampon
Avant la version 1.15, les arguments des symboles FFI étaient limités aux types primitifs, mais cette version ajoute la possibilité d'utiliser des tampons comme arguments pour les appels FFI.
Lors de l'appel de symboles FFI avec un tampon, l'argument suivant doit être la longueur du tampon.
Exemple
Code Rust : | Sélectionner tout |
1 2 3 4 5 6 | // print_buffer.rs #[no_mangle] pub extern "C" fn print_buffer(ptr: *const u8, len: usize) { let buf = unsafe { std::slice::from_raw_parts(ptr, len) }; println!("{:?}", buf); } |
Appel de Deno
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | // print_buffer.ts const library = Deno.dlopen("./print_buffer.so", { print_buffer: { parameters: ["buffer", "usize"], result: "void", }, }); const buffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); dylib.symbols.print_buffer(buffer, buffer.length); |
Résultat
Code : | Sélectionner tout |
1 2 | $ deno run --allow-ffi --unstable print_buffer.ts [1, 2, 3, 4, 5, 6, 7, 8] |
Outre le passage de tampons en tant qu'arguments, Deno reconnaît l'importance de pouvoir utiliser des tampons en tant que valeurs de retour et prévoit de prendre en charge cette fonctionnalité dans les prochaines versions.
deno lint --watch
deno lint prend désormais en charge l'indicateur --watch qui maintient le processus en vie après l’affichage des diagnostics et surveille les modifications de fichiers pour mettre à jour les diagnostics à partir des fichiers modifiés. Comme dans les autres sous-commandes qui prennent en charge l'option --watch, les fichiers qui doivent être surveillés sont automatiquement découverts par Deno.
Version 9.5 du moteur JavaScript V8
Tout comme Node.js, Deno 1.15 inclut la Version 9.5 du moteur JavaScript V8. Cette version introduit la nouvelle API JavaScript Intl.DisplayNames v2, une option timeZoneName étendue pour Intl.DateTimeFormat, et la prise en charge de la proposition WebAssembly Exception Handling (Wasm EH).
Sources : Nodejs, Deno
Et vous ?
Lequel de ses deux moteurs d'exécution JavaScript préférez-vous ? Deno ou Node.js ?
Quelle amélioration de Deno ou de Node.js préférez-vous le plus ?
Selon Deno, « ...la création des projets Node.js peut devenir une tâche ardue, impliquant la gestion des outils lourds qui enlèvent le plaisir des scripts de langage dynamique », Partagez-vous cet avis ?
Voir aussi :
OpenSSL annonce la disponibilité de la version 3.0 et le renouvellement de la Licence Apache-2.0, avec l'utilisation du nouveau module FIPS dans les projets de développement d'applications
Node.js 16 est maintenant disponible, et vient avec une mise à niveau du moteur JavaScript V8, des binaires préconstruits pour les puces Apple et des API stables supplémentaires
La Version 1.9 de Deno, le runtime pour exécuter JavaScript et TypeScript, est disponible, elle améliore les appels de commande dans Rust et apporte de nouvelles fonctionnalités
La Fondation Node.js annonce la mise en place d'un programme de certification pour les développeurs Node.js, qui débutera au second trimestre