Node.js prend en charge l’exécution des fichiers TypeScript sans configuration supplémentaire
(nodejs.org)- Node.js a été amélioré pour pouvoir exécuter directement des fichiers TypeScript
- Il est désormais possible d’exécuter des fichiers
.tsdirectement, sans configuration supplémentaire ni transpilation - Les développeurs peuvent ainsi gagner en efficacité sans
tsconfig.jsonni installation d’un bundler séparé - Cette fonctionnalité est officiellement intégrée à partir de Node.js v22.18.0 (LTS)
- On peut s’attendre à un estompage de la frontière entre le développement JavaScript et TypeScript
Prise en charge de l’exécution directe de TypeScript dans Node.js
- Dans sa récente version v22.18.0 (LTS), Node.js a introduit une fonction permettant d’exécuter directement des fichiers TypeScript (.ts) sans configuration ni outil supplémentaire
- Jusqu’à présent, l’exécution de code TypeScript nécessitait des transpileurs externes ou des bundlers comme ts-node, esbuild ou Babel, mais Node.js reconnaît et exécute désormais lui-même le code TypeScript sans ces outils
- Grâce à cette fonctionnalité, les développeurs peuvent exécuter directement des fichiers
.tsdans Node.js sans fichier de configurationtsconfig.jsonni bibliothèque additionnelle - La productivité et le confort de développement augmentent nettement pour le prototypage, le développement expérimental ou l’exécution de scripts
- On attend aussi un renforcement de l’interopérabilité entre les projets JavaScript et TypeScript, ainsi qu’une baisse de la barrière d’entrée pour les nouveaux développeurs
Autres changements notables
- esm : implémentation de
import.meta.main - fs : amélioration de la gestion des événements fs basée sur AsyncIterator
- permission : prise en charge de la transmission des flags du modèle d’autorisations lors de l’exécution de sous-processus
- sqlite : ajout de l’option
readBigInts - src/permission : prise en charge de
permission.has(addon) - url : ajout de l’API
fileURLToPathBuffer - watch : ajout du flag
--watch-kill-signal - worker : amélioration de l’objet
Workeren tant qu’async disposable
Mises à jour liées aux commits et à la documentation
- Suppression de code inutile, nettoyage de l’environnement de build et de la toolchain, avec mise à niveau vers npm 10.9.3
- Correction d’indicateurs de stabilité détaillés et de numéros RFC dans la documentation, notamment
globals.md,child_process.mdethttp2 - Ajout de nombreux tests et intégration de corrections de bugs
Fichiers de distribution
- Fichiers d’installation et binaires fournis pour Windows, macOS (Intel/Apple Silicon) et Linux (x64, ARM, PPC, s390x, AIX)
- Le code source et l’ensemble des fichiers de release peuvent être téléchargés depuis la page officielle de distribution de Node.js
- La documentation API a été mise à jour sur la base de la v22.18.0
7 commentaires
Ah, ça fait vraiment du bien... J’espère que ça s’imposera vite.
Ça peut convenir pour exécuter de petits scripts, mais pour un projet en production il y a tellement de limitations que ça ne semble pas très utile.
Il faut aussi ajuster correctement les extensions et les chemins à cause des erreurs
ERR_MODULE_NOT_FOUND/ERR_UNSUPPORTED_DIR_IMPORT,et on ne peut pas utiliser des fonctionnalités comme NestJS qui nécessitent la prise en charge de la compilation TypeScript avec le paramètre
emitDecoratorMetadata, donc...Est-ce que
--experimental-strip-typesest appliqué par défaut ?De toute façon, je n’utilise pas les
enum, donc de mon point de vue, le simple fait de supprimer les types suffit déjà pour que ça fonctionne très bien.Ça va devenir super pratique !
Impossible de retenir mon gros pouce levé.
Je trouvais déjà ça très bien avec le flag
--no-experimental-strip-types.Ça a l’air encore mieux, d’ailleurs.
Avis Hacker News
node:testdans Node.js, j’ai l’impression que Node.js est désormais un choix par défaut convaincant dans la plupart des cas. L’exécution viatsxavait déjà apporté un gros gain de confort, mais ce n’était pas encore complètement abouti. Les assertions de types à l’exécution en périphérie sont désormais largement couvertes par des outils comme zod, ts-rest et trpc, et aujourd’hui le développement full-stack en Typescript est vraiment devenu simple.ts, et il intègre un runner de tests de bon niveau (avec prise en charge de--watch). Les packages intégrés s’améliorent aussi. Avecnode:fs/promises, par exemple, les boucles de travail asynchrones sont bien plus simples grâce au top-level await. Il a fallu du temps pour amener tout le monde à une approche réaliste, mais c’est enfin devenu très agréable.ts. Je pense que trpc et ts-rest répondent à des problèmes complètement différents. On peut utiliser les deux, mais en production j’évite trpc, parce que je ne peux pas vraiment maîtriser moi-même les URL d’API ni gérer et déprécier proprement les anciennes URL. Pour ts-rest aussi, je préfère généralement partager directement zod et les types pour gérer moi-même les paires requête/réponse d’API. Et à chaque fois, ça m’agace que trpc soit clairement un outil RPC alors qu’il a-restdans son nomimport/export(je ne sais même pas s’il faut encore le hack.mjs). J’étais un peu sorti de l’écosystème, donc j’aimerais savoir ce qui a changé depuisnode_modules(voir : documentation officielle node.js). Du coup, je me demande ce qu’il en est des dépendances de projet. J’ai écrit une bibliothèque de modèles de données en Typescript, et j’aimerais l’importer telle quelle dans mon app. Je me demande si cette règle ne s’applique qu’aux packages npm, ou à toutes les dépendances. Il y a une opportunité ici. J’ai créé un runtime basé sur golang pour exécuter typescript (plus précisément JS en général), et sobek utilisé par l’équipe Grafana pourrait probablement faire la même chose avec une simple fonction de type stripping. J’ai vraiment le sentiment que si un seul runtime adoptait complètement Typescript comme choix par défaut, ce serait une vraie révolution pour Node.js. Pas besoin de transpileur, ni de typescript-go, ni de rust (même si rust reste sympa😉), juste un bon parseur avec un système capable de suivre les source maps et les types en mode debug. Quoi qu’il en soit, reconnaissance et merci à l’équipe Node et à tous les contributeurs. On a l’impression que tout le monde suit derrière Node, qui fait office de standard. L’API d’embarquement est aussi simple et propre à utiliser, ce qui est pratique pour produire des exécutables autonomesprivatenode_modulesrecursiveétait ignoré dans les options deopendir. J’attends que Bun rattrape son retard, mais je n’ai pas encore l’impression qu’il soit prêt pour une adoption sérieuse sur de gros projets. Les fonctionnalités spécifiques à bun font bonne impression au départ, mais en pratique je les trouve encore insuffisantes. La documentation non plus n’atteint pas le niveau de qualité de celle de Node.jslocalAddressest ignoré dans les connexions TCPEventEmitter(partiellement résolus avec eventemitter2)node_modulespuis tout réinstallerJ’ai essayé les fonctionnalités TS et le runner de tests intégrés à Node lui-même, et ce n’est pas encore au niveau de Bun. Pour ce genre de besoins, j’utilise encore Bun pour l’instant. Dans l’écosystème Node, j’ai appris qu’il valait mieux combiner des outils spécialisés que tout miser sur un seul.
Bun.js : utilisé comme runtime Node, pour l’exécution TS et les tests. J’ai essayé plusieurs solutions comme TSX, TS-Node et Node lui-même
NPM : utilisé pour exécuter les scripts d’outillage
PNPM : utilisé pour installer les dépendances. (À mon avis, c’est le meilleur face à npm, yarn et bun)
Biome.js : pour le linting. Meilleur que tous les outils de linting que j’ai utilisés jusqu’ici
import { stripTypeScriptTypes } from 'node:module') est aussi exposée. Pour développer une application web simple sans dépendances frontend, on peut tout écrire en typescript et servir aussi les scripts frontend en ne retirant que les types (projet d’exemple)tsc, puis les informations de type sont supprimées. Python aussi ignore les annotations de type à l’exécution, et Java supprime également certaines informations de type, notamment sur les génériques, dans le bytecodetscme convient très bientsxqui permet exactement ça, c’est-à-dire exécuter sans build ni transpilation. En développement, c’est extrêmement utile. Grâce au--watchdetsx, je lance directement le serveur à partir du code source TS et il redémarre automatiquement au moindre changement. À l’avenir, on devrait pouvoir obtenir un environnement similaire avecnodemonet les fonctionnalités intégrées de Node. Pour faire aussi la vérification des types au runtime, il faudrait probablement un support au niveau de v8, ce qui reviendrait presque à une réécriture complèteenum, quels cas d’usage réels existent ?