TypeScript n'est plus vraiment TypeScript...

BBetter Stack
컎퓚터/소프튞웚얎AI/ëŻžëž˜êž°ìˆ 

Transcript

00:00:00TypeScript vient de publier une version candidate pour la version 7 et ce sera la version oĂč
00:00:04TypeScript n'est plus du TypeScript. Si vous n'étiez pas au courant, ils travaillaient sur la réécriture du
00:00:07compilateur TypeScript, passant de TypeScript lui-mĂȘme Ă  Go, et apparemment, les rĂ©sultats sont 10 fois plus rapides.
00:00:12Ils prévoient de sortir TypeScript 7 le mois prochain, alors passons en revue ce qui a réellement changé,
00:00:17Ă  quel point c'est rapide, et s'il y a des changements cassants Ă  connaĂźtre avant de l'installer.
00:00:26Donc, si vous avez manqué la nouvelle sur le portage vers Go, ils ont commencé il y a environ un an,
00:00:29et le TL;DR est qu'ils ont réalisé que JavaScript n'a jamais été conçu pour le travail intensif lié au CPU
00:00:34qu'un vérificateur de types effectue. Ils ont donc commencé à le réécrire en Go avec un grand succÚs initial. Ils ont commencé par
00:00:39porter essentiellement l'implémentation existante de TypeScript, ligne par ligne, donc la logique
00:00:44de vĂ©rification de type Ă©tait structurellement identique et avait le mĂȘme comportement, et vous pouviez mĂȘme voir certaines
00:00:48des fonctions qui étaient presque identiques, à part le langage. Je suis aussi assez sûr que c'était avant
00:00:52qu'on puisse juste demander à Claude de migrer sa base de code vers le langage souhaité.
00:00:56Je te regarde, Bun. Les rĂ©sultats du portage parlent d'eux-mĂȘmes. Ici, j'ai le
00:01:00dépÎt Playwright, et si j'effectue une vérification de type en utilisant l'ancienne version de TypeScript, on peut voir que
00:01:04cela prend environ six secondes pour se terminer, et cela a parcouru 1400 fichiers et un demi-million de lignes de
00:01:08code. Si je passe maintenant Ă  la version candidate sans rien changer Ă  part cette commande,
00:01:12au total, cela a pris 0,87 seconde. C'est une amĂ©lioration sĂ©rieuse. Cela a aussi trouvĂ© exactement le mĂȘme nombre
00:01:18d'erreurs, les mĂȘmes erreurs, et a parcouru les mĂȘmes fichiers et lignes de code, donc ça fonctionne exactement
00:01:23de la mĂȘme maniĂšre que TypeScript 6. Le code natif de Go est simplement fondamentalement plus rapide que JavaScript pour une
00:01:27tĂąche comme celle-ci, mais cela leur permet aussi d'utiliser le parallĂ©lisme Ă  mĂ©moire partagĂ©e. LĂ  oĂč le compilateur JavaScript
00:01:32Ă©tait mono-thread, Go peut rĂ©partir cette vĂ©rification de type sur plusieurs cƓurs Ă  la fois. Dans TypeScript
00:01:377, vous pouvez l'obliger Ă  ĂȘtre mono-thread avec un flag, si jamais vous faites du dĂ©bogage
00:01:41ou si vous tournez sur une machine avec des ressources limitées. Et si je fais cela dans la base de code de Playwright
00:01:46ici avec TypeScript 7, on voit qu'en mono-thread, cela prend environ deux secondes, ce qui est
00:01:50toujours trois fois plus rapide qu'avant. En parlant d'exécution en parallÚle, ils exposent aussi
00:01:54un nouveau flag “checkers” qui vous permet de dĂ©finir combien de travailleurs de vĂ©rification de type peuvent fonctionner en parallĂšle,
00:01:58et cela est réglé par défaut sur quatre. Augmenter cela pourrait accélérer vos builds sur de plus grandes bases de code si vous
00:02:03avez beaucoup de cƓurs CPU, mais cela se fera au prix d'une utilisation mĂ©moire accrue. Si je rĂšgle les “checkers”
00:02:08sur 8 dans ce dépÎt Playwright, ce qui est le double du défaut, cela semble effectivement réduire encore d'un
00:02:12tiers le temps nĂ©cessaire. Il y a aussi un nouveau flag “builders” pour parallĂ©liser les builds de rĂ©fĂ©rences de projets, aka construire
00:02:16plusieurs projets à la fois, et ce flag vous permet de contrîler le nombre de “builders” parallùles qui peuvent
00:02:20s'exĂ©cuter en mĂȘme temps. Il est bon de noter que si vous combinez cela avec les “checkers” que nous venons de voir, disons
00:02:24que vous en avez quatre de chaque, cela signifie que vous pouvez avoir jusqu'Ă  16 vĂ©rificateurs de type s'exĂ©cutant simultanĂ©ment. À part
00:02:29les changements de code natif et le parallĂ©lisme, une autre grosse réécriture dans TypeScript 7 a Ă©tĂ© son mode “watch”.
00:02:34Lorsqu'ils ont porté vers Go, c'était un peu plus délicat car la bibliothÚque standard ne fournit pas
00:02:38d'API de surveillance de fichiers intégrée, et les bibliothÚques tierces qu'ils ont essayées avaient des problÚmes de
00:02:43stabilité, performance et support multiplateforme. L'équipe a donc regardé l'outil de surveillance de fichiers du bundler Parcel,
00:02:47que Microsoft utilise un peu dans VS Code, mais comme c'était en C++, ils ont également
00:02:53dû porter les parties nécessaires en Go également. La bonne nouvelle est qu'ils ont tout fait,
00:02:57et cela semble fonctionner vraiment bien, et mieux qu'avant. Ensuite, puisque c'est
00:03:01un changement de version majeure, vous pourriez vous attendre Ă  beaucoup de changements cassants, surtout que c'est une grosse
00:03:05réécriture, mais je ne pense pas qu'il y en ait vraiment si vous passez de TypeScript 6 à 7. Si
00:03:10vous voulez passer de 5 Ă  7, il y en aura pas mal, donc ils recommandent de
00:03:14passer d'abord Ă  la version 6, de tout faire fonctionner, et ensuite le passage Ă  la version 7 devrait se faire sans problĂšme. Quelques-uns
00:03:19des gros changements dans TypeScript 6 étaient la suppression de la cible ES5, la suppression de baseUrl et la dépréciation des systÚmes
00:03:24de modules AMD, UMD et SystemJS. Ils ont aussi mis “strict” Ă  “true” par dĂ©faut, dĂ©fini “module” sur “esnext” par dĂ©faut,
00:03:31et la cible par dĂ©faut est la version ECMAScript stable actuelle prĂ©cĂ©dant immĂ©diatement “esnext”. C'Ă©tait
00:03:36essentiellement laisser le passé derriÚre soi et moderniser TypeScript, ce que j'apprécie vraiment car
00:03:40parfois, essayer de supporter des projets hérités dans chaque version que vous créez peut vraiment ralentir le
00:03:45progrĂšs d'un outil. En regardant le reste de cet article de blog, il semble que la seule nouvelle
00:03:49fonctionnalitĂ© ou changement qui concerne rĂ©ellement le langage TypeScript lui-mĂȘme, c'est que les types de littĂ©raux de gabarit
00:03:53préservent désormais les points de code Unicode. Essentiellement, avant TypeScript 7, TypeScript séparait en unités de code UTF-16,
00:03:59donc cela finissait par couper une emoji en deux, et vous vous retrouviez avec ces types bizarres pour les tĂȘtes
00:04:04et les queues. Dans TypeScript 7, cependant, cela sépare sur des points de code entiers, donc des caractÚres complets,
00:04:09donc maintenant l'emoji est préservée et la séparation est à peu prÚs comme vous vous y attendriez. Je serais
00:04:13honnĂȘtement incroyablement impressionnĂ© si l'un d'entre vous a dĂ©jĂ  rencontrĂ© cela en utilisant TypeScript.
00:04:18Dans l'ensemble, ces changements devraient rendre tout ce qui utilise TypeScript beaucoup plus rapide, comme TypeScript
00:04:22dans votre éditeur, surtout pour les grands projets. La version stable est prévue dans environ un mois,
00:04:27mais une API programmatique stable, donc ce que les auteurs d'outils utilisent pour construire au-dessus du compilateur,
00:04:32arrive dans la version 7.1. À cause de cela, il y a aussi un paquet de compatibilitĂ©, donc vous pouvez exĂ©cuter
00:04:36TypeScript 6 et 7 cĂŽte Ă  cĂŽte sans rencontrer de conflits. Dites-moi ce que vous pensez de tout
00:04:41cela, et je suis curieux de savoir si vous avez déjà trouvé que TypeScript semblait lent. Dites-le-moi dans
00:04:44les commentaires. Pendant que vous y ĂȘtes, abonnez-vous, et comme toujours, on se voit dans la prochaine.

Key Takeaway

La réécriture du compilateur TypeScript en Go permet une amélioration spectaculaire des performances, atteignant une exécution jusqu'à 10 fois plus rapide grùce au parallélisme natif.

Highlights

  • TypeScript 7 est réécrit en Go, ce qui permet d'atteindre une vitesse de vĂ©rification de type jusqu'Ă  10 fois supĂ©rieure.

  • La vĂ©rification de type sur le dĂ©pĂŽt Playwright passe de 6 secondes avec l'ancienne version Ă  0,87 seconde avec TypeScript 7.

  • Le nouveau compilateur utilise le parallĂ©lisme Ă  mĂ©moire partagĂ©e pour rĂ©partir la charge de travail sur plusieurs cƓurs CPU au lieu d'ĂȘtre limitĂ© Ă  un seul thread.

  • Le flag “checkers” permet de dĂ©finir le nombre de travailleurs parallĂšles, avec une valeur par dĂ©faut de 4.

  • Le mode “watch” a Ă©tĂ© entiĂšrement réécrit en Go, en utilisant une implĂ©mentation basĂ©e sur le systĂšme de surveillance de fichiers de Parcel.

  • Les types de littĂ©raux de gabarit prĂ©servent dĂ©sormais les points de code Unicode entiers, Ă©vitant ainsi de diviser les Ă©mojis en unitĂ©s UTF-16.

Timeline

Réécriture du compilateur en Go

  • TypeScript 7 adopte le langage Go pour amĂ©liorer ses performances intensives en CPU.
  • Le portage permet d'atteindre une vitesse de compilation 10 fois supĂ©rieure tout en conservant une logique de vĂ©rification identique Ă  la version prĂ©cĂ©dente.

JavaScript n'était pas conçu pour la charge intensive requise par un vérificateur de types moderne. L'équipe a initialement porté le code ligne par ligne pour garantir une cohérence comportementale totale. Les résultats sur des projets d'envergure, comme Playwright, montrent une réduction drastique du temps de traitement.

Parallélisme et nouvelles configurations

  • TypeScript 7 exploite le parallĂ©lisme pour rĂ©partir la vĂ©rification de type sur plusieurs cƓurs.
  • Le flag “checkers” permet de contrĂŽler le nombre de travailleurs parallĂšles, avec une valeur par dĂ©faut de quatre.
  • Le nouveau flag “builders” permet la construction simultanĂ©e de plusieurs projets liĂ©s.

Le compilateur passe d'une exécution mono-thread à une exécution multi-thread native. Il reste possible de forcer le mode mono-thread avec un flag pour le débogage ou sur des systÚmes à ressources limitées. L'augmentation des travailleurs parallÚles améliore les temps de build sur de larges bases de code, au prix d'une utilisation mémoire plus élevée.

Mode watch et migration

  • Le mode watch a Ă©tĂ© entiĂšrement réécrit en Go en s'inspirant de l'outil de surveillance de fichiers de Parcel.
  • Une migration directe vers la version 7 est recommandĂ©e depuis la version 6, tandis qu'un passage depuis la 5 nĂ©cessite une Ă©tape intermĂ©diaire.
  • Les versions 6 et 7 peuvent coexister via un paquet de compatibilitĂ©.

L'absence d'API de surveillance de fichiers robuste dans la bibliothÚque standard de Go a nécessité l'adaptation de solutions tierces, initialement en C++. La modernisation inclut la suppression de cibles obsolÚtes comme ES5 et des systÚmes de modules anciens, permettant ainsi de se concentrer sur les standards actuels.

Fonctionnalités et disponibilité

  • Les types de littĂ©raux de gabarit traitent dĂ©sormais les Ă©mojis comme des points de code complets au lieu d'unitĂ©s UTF-16.
  • La version stable est prĂ©vue pour le mois prochain, avec une API programmatique stable attendue pour la version 7.1.

Le changement au niveau des littĂ©raux de gabarit corrige un problĂšme de manipulation Unicode oĂč les caractĂšres Ă©taient segmentĂ©s incorrectement. L'introduction d'un paquet de compatibilitĂ© facilite la transition entre les versions 6 et 7 pour les auteurs d'outils.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video