Accueil / Articles

Fonctionnalités de Node.js 26 qui remplacent discrètement des années de solutions de contournement

Les fonctionnalités de Node.js 26 qui remplacent anciennes solutions de contournement : l’API Temporal pour les dates, l’exécution native de TypeScript, des outils d’aide au cache intégrés, ainsi que quelques ajouts mineurs.

Éditeur : REACTAPP.TOP8 min de lecture1739 mots

Sources: You’re Still Writing Node.js Like It’s 2020

1. Nous pouvons enfin cesser de faire semblant que Date est une véritable API de dates

Voici un exemple de JavaScript tout à fait ordinaire :

const date = new Date("2026-09-08");
console.log(date);

Essayez maintenant de répondre à une question un peu plus difficile :

Quelle est la date locale d’une réunion qui a lieu à New York ?

Ou bien :

Ajoutez trois mois à cette date de facturation.

Ou encore :

Quelle est réellement la différence entre une date du calendrier et un moment précis dans le temps ?

C’est là que Date commence à poser des problèmes.

C’est précisément pour cette raison que Temporal est si important.

Node.js 26 active par défaut l’API Temporal, offrant enfin à JavaScript des concepts distincts pour les instants, les dates du calendrier, les durées et les fuseaux horaires.

Au lieu d’écrire :

const date = new Date();

vous pouvez maintenant écrire :

const today = Temporal.Now.plainDateISO();

const invoiceDate =
  Temporal.PlainDate.from("2026-09-08");
const dueDate =
  invoiceDate.add({ days: 30 });

Et lorsque vous avez vraiment besoin d’un point précis dans le temps plutôt que d’une date du calendrier :

const now = Temporal.Now.instant();

Cette distinction est plus importante qu’il n’y paraît.

Un système de facturation n’a pas vraiment besoin d’« un objet Date JavaScript ».

Il a besoin d’une date calendaire.

Un journal d’événements distribué n’a pas besoin d’« une date calendaire ».

Il a besoin d’un instant.

Temporal vous oblige à être explicite quant au type de valeur temporelle que vous souhaitez utiliser.

Pour tout ce qui concerne les paiements, les abonnements, les réservations, les marchés ou les utilisateurs répartis dans différentes zones horaires, il ne s’agit pas simplement d’une syntaxe plus agréable.

Cela élimine toute une catégorie de bugs dus à l’utilisation d’un mauvais type de valeur temporelle.

2. Votre fichier .ts n’a pas nécessairement besoin d’une étape de compilation

Pendant des années, exécuter TypeScript sous Node signifiait suivre ce flux de travail :

app.ts
   ↓
TypeScript
   ↓
app.js
   ↓
Node

Ce flux de travail reste tout à fait valable.

Mais Node peut désormais exécuter directement les fichiers TypeScript, à condition qu’ils utilisent uniquement une syntaxe érasable.

Prenons ce fichier :

interface User {
  id: number;
  name: string;
}

function greet(user: User) {
  return `Hello ${user.name}`;
}
console.log(
  greet({
    id: 1,
    name: "Priyanshu"
  })
);

Vous pouvez l’exécuter directement avec :

node app.ts

Node supprime simplement les annotations de type et exécute le JavaScript pur qui reste.

Il y a un point important à retenir : Node ne vérifie pas les types pour vous.

Ainsi, pour une grande base de code en production, vous aurez toujours besoin de tsc ou d’une étape équivalente de vérification des types dans votre workflow.

Mais pensez aux cas plus petits : un script interne, une petite outil CLI, une utilité en un seul fichier.

La méthode ancienne ressemblait à ceci :

script.ts
   ↓
configure compiler
   ↓
compile
   ↓
run

Désormais, elle peut ressembler à ceci :

script.ts
   ↓
node

C’est un petit changement.

Mais c’est encore un exemple de Node en train d’éliminer discrètement une couche que de nombreux projets n’avaient jamais vraiment besoin au départ.

3. Votre code de cache risque de paraître inutilement compliqué

Vous avez presque certainement écrit ce schéma plus souvent que vous ne pouvez le compter :

let user = cache.get(userId);

if (user === undefined) {
  user = await fetchUser(userId);
  cache.set(userId, user);
}

Il n’y a rien de mal dans ce code.

Mais l’intention réelle est noyée sous les mécanismes de vérification, de récupération et de stockage.

Ce que vous essayez vraiment de dire, c’est :

Donnez-moi cette valeur. Si elle n’existe pas encore, créez-la.

Le JavaScript moderne commence à vous permettre d’exprimer exactement cela.

V8 14.6, inclus dans Node.js 26, ajoute :

Map.prototype.getOrInsert()
Map.prototype.getOrInsertComputed()

Avec ces fonctionnalités, une recherche dans le cache synchrone peut être simplifiée en quelque chose comme ceci :

const value = cache.getOrInsert(
  key,
  createValue()
);

Et lorsque la valeur ne doit être calculée que de manière différée, sur demande :

const value = cache.getOrInsertComputed(
  key,
  () => createValue()
);

Aucune de ces fonctionnalités n’est en soi révolutionnaire.

Mais la conception des langages progresse rarement grâce à des fonctionnalités révolutionnaires.

Elle progresse lorsque suffisamment de développeurs écrivent les mêmes cinq lignes encore et encore, jusqu’à ce que le langage finisse par réagir en disant :

« Très bien. Vous n’avez plus besoin d’écrire ces cinq lignes. »

C’est précisément ce type d’amélioration qui s’intègre discrètement dans le code quotidien.

Dans un an, presque personne n’en parlera plus.

Ils l’utiliseront simplement sans y réfléchir à deux fois.

4. Node.js peut désormais aller au-delà de JavaScript

Cette nouvelle capacité a bien plus d’importance.

Node.js 26 intègre une Interface de Fonction Étrangère expérimentale :

node:ffi

FFI permet à JavaScript d’appeler des fonctions mises à disposition directement par des bibliothèques natives.

Voici une idée générale de son fonctionnement :

JavaScript
     ↓
node:ffi
     ↓
Native library
     ↓
C / C++ / system APIs

Imaginez une bibliothèque native qui expose quelque chose comme ceci :

double calculate(double value);

JavaScript peut désormais, du moins en théorie, charger cette bibliothèque et appeler directement la fonction.

Cela ouvre la voie à des choses telles que :

  • des calculs numériques spécialisés
  • la réutilisation de bibliothèques natives existantes
  • une intégration plus profonde avec le système
  • une cryptographie au niveau natif
  • le traitement d’images et de vidéos

Mais cela comporte une grave précaution.

Vous passez la frontière qui sépare le JavaScript géré de la mémoire native brute.

Si vous vous trompez dans la signature d’une fonction, vous n’obtiendrez pas une exception polie de JavaScript en retour.

Cela peut entraîner la chute de tout le processus.

C’est précisément pourquoi cette API reste expérimentale et est protégée par un paramètre de configuration.

Ne l’interprétez donc pas comme :

« Il est temps de réécrire tous les packages npm en C. »

Lisez plutôt ceci :

« Node offre désormais un moyen bien plus direct d’accéder au domaine natif. »

Ces deux affirmations sont très différentes.

5. Votre CLI Node n’a pas forcément besoin que Node soit installé

Voici une autre hypothèse qui mérite d’être remise en question :

Si vous créez un outil avec Node, vos utilisateurs doivent également avoir Node installé.

Les applications à exécutable unique remettent en cause cette hypothèse.

Les outils SEA de Node vous permettent de packager une application en binaire autonome.

Ainsi, au lieu d’envoyer :

npm install
node index.js

vous pouvez envoyer quelque chose de plus proche de :

./my-cli

Considérez un outil interne sur lequel votre équipe compte quotidiennement.

Cela pourrait être une CLI de déploiement :

deploy production

ou un outil d’aide à la base de données :

db-migrate

ou un outil de squelette de projet :

project init

Si ce que vous distribuez est un seul exécutable, les utilisateurs n’ont pas besoin de savoir ni de se soucier du fait que JavaScript s’exécute en arrière-plan.

Cela modifie subtilement l’image que se fait Node de lui-même.

Node a commencé sa carrière en tant que :

JavaScript exécuté en dehors du navigateur.

Il commence à ressembler davantage à :

Un environnement d’exécution polyvalent qui se trouve simplement à exécuter JavaScript.

C’est une affirmation bien plus large.

6. Que se passe-t-il si votre application n’a plus besoin de toutes ses autorisations ?

Les modèles de sécurité suivent généralement ce schéma :

Application
     ↓
Gets permissions
     ↓
Keeps permissions
     ↓
Runs

Mais que se passe-t-il si une autorisation n’est requise que temporairement, pendant le démarrage ?

Prenons un service qui lit un fichier de configuration ainsi que quelques certificats lors de son initialisation.

Lorsqu’il est en cours d’exécution, il peut ne plus avoir absolument aucun besoin d’accéder au système de fichiers.

Le modèle de permissions de Node vise à permettre aux applications de réduire activement leurs propres capacités pendant leur exécution, grâce à des API telles que permission.drop().

Le flux commence à ressembler à ceci :

Start
  ↓
Read configuration
  ↓
Initialize
  ↓
Drop unnecessary permissions
  ↓
Run

Cela reflète un principe de sécurité utile :

Ne vous demandez pas seulement ce que votre application est autorisée à faire. Demandez-lui quelles permissions elle a réellement encore besoin à l’avenir.

La modification de l’interface API est mineure.

Le changement dans la façon dont on envisage la sécurité des applications, lui, ne l’est pas.

7. Node.js est enfin prêt à supprimer des éléments

Ajouter des API est le moyen facile de donner une impression d’excellence au temps de exécution.

Les supprimer, c’est la partie difficile.

Node.js 26 continue de supprimer des API anciennes et des composants internes obsolètes qui persistent depuis des années.

Cela est plus important qu’il n’y paraît.

Toute API ancienne devient tôt ou tard une dépendance inévitable pour quelqu’un.

Si on ne fait rien, un environnement de exécution finit par transporter des décennies de bagages historiques accumulés :

old API
   +
new API
   +
replacement API
   +
deprecated API
   +
"don't use this anymore" API

Une plateforme mature doit avoir la volonté de se débarrasser de cette accumulation.

Node.js montre de plus en plus précisément cette volonté.

C’est une bonne nouvelle si vous préférez ne pas mémoriser chaque méthode héritée pour effectuer la même tâche.

La partie intéressante n’est pas une fonctionnalité en particulier

Temporal n’est pas spectaculaire à lui seul.

getOrInsert() non plus.

Exécuter un fichier .ts sans étape de compilation non plus.

Emballer une CLI en exécutable non plus.

Mais mettez-les côte à côte.

Node progresse simultanément vers le haut en termes d’abstraction :

Temporal
Better collections
TypeScript
Modern JavaScript

tout en descendant également vers le bas :

FFI
Native libraries
Permissions
Executable packaging

C’est là l’histoire réelle.

Node.js ne s’améliore pas seulement dans l’exécution du JavaScript.

Il devient un environnement de exécution plus performant pour tout ce qui entoure votre application.

Cela redéfinit la question à se poser au début d’un nouveau projet.

Au lieu de passer directement à :

"Quel package npm ai-je besoin pour cela ?"

il devient de plus en plus utile de se demander d’abord :

"Node.js peut-il déjà faire cela ?"

Parfois, la réponse honnête reste non.

Mais de plus en plus souvent, la réponse est :

"En fait... oui."

C’est sans doute l’aspect le plus frappant de Node.js 26.

L’environnement de exécution a déjà évolué.

Nos modèles mentaux n’ont tout simplement pas encore suivi.

Lectures complémentaires