web-dev-qa-db-fra.com

deno vs ts-node: quelle est la différence

Je travaille sur un projet TypeScript relativement important, j'utilise ts-node pour exécuter des tests de nœuds et des exemples. Pour autant que je comprends, ts-node compilera les fichiers ts dans les fichiers js et les exécutera.

Récemment, j'ai entendu parler de deno, qui est un runtime TypeScript. J'ai essayé quelques exemples en TypeScript, qui fonctionne en utilisant ts-node. J'ai exécuté l'exemple avec deno, de nombreux messages de compilation ont été imprimés dans la console, puis j'ai exécuté le code. Et plus tard, j'ai trouvé qu'il y avait des fichiers de cache dans /username/.deno. Je ne pense pas que l'exécution de deno soit plus rapide que ts-node

Il semble que deno et ts-node se compilera et s'exécutera en utilisant le cache. Quelle est la différence entre eux?

16
jerry

TL; DR

Deno ressemble plus à Node qu'à ts-node, c'est-à-dire qu'il s'agit d'un runtime JS basé sur V8. Contrairement à Node, Deno contient le compilateur TypeScript. Deno ne fait pas partie de l'écosystème Node/npm.

ts-node, d'autre part, est un module Node.js qui utilise le compilateur TypeScript pour transpiler le code TypeScript et l'exécuter dans Node. ts-node fait partie de l'écosystème Node/npm.

Deno est rapide. Voir ci-dessous.

Similitudes Deno et ts-node

  • Ils exécutent tous les deux du code TypeScript
  • Ils fonctionnent tous les deux sur Linux, Mac et Windows (mais ts-node également sur SmartOS et AIX)
  • Ils utilisent tous les deux le moteur JavaScript de Google V8 (ts-node via node qu'il utilise sous le capot)

Différences entre Deno et ts-node

noeud ts

  • ts-node est un module Node.js
  • il est écrit dans Node.js
  • il est installé avec npm
  • il utilise le compilateur TypeScript comme dépendance de pair
  • il installe ses propres dépendances
  • en tant que runtime, il utilise Node qui est écrit en C++ en utilisant libuv

Deno

  • deno est un exécutable autonome
  • il n'utilise pas Node.js
  • il est distribué comme un seul binaire
  • il contient le compilateur TypeScript comme un instantané V8
  • il n'a pas de dépendances
  • c'est un runtime écrit en Rust en utilisant Tokio

Maturité

noeud ts

ts-node s'appuie sur le runtime Node.js, il est donc juste de l'inclure ici:

  • Node.js est sorti en 2009, la dernière version LTS est la 10.15.3
  • npm est sorti en 2010, version incluse dans Node LTS est 6.4.1
  • ts-node est sorti en 2015, la dernière version est 8.0.3

Deno

Deno est lui-même un runtime donc il n'utilise rien d'autre:

  • Deno est sorti en 2018, la dernière version est la 0.3.6

Popularité

GitHub:

Débordement de pile:

Bibliothèques

noeud ts

Vous pouvez utiliser toutes les bibliothèques Node disponibles sur npm

(il existe actuellement 955 263 packages sur npm, pas tous pour Node mais toujours beaucoup)

Les bibliothèques Node qui sont disponibles sur npm même si elles ont été initialement écrites en TypeScript sont généralement publiées sous une forme transposée en JavaScript avec des définitions de type supplémentaires dans les fichiers _*.d.ts_ (inclus dans le package npm ou installés séparément de l'espace de noms _@types_).

Deno

Il y a 55 modules tiers sur https://deno.land/x/ et 56 bibliothèques et outils sur https://github.com/denolib/awesome-deno#modules (Je n'ai pas vérifié si tous sont identiques)

Les bibliothèques Deno ne sont que des fichiers TypeScript.

Différence d'installation

noeud ts

  • vous installez Node.js
  • vous installez TypeScript et _ts-node_ avec leurs dépendances avec npm
    • _npm install TypeScript ts-node_
    • il installe 10 modules npm et place 44 Mo dans 212 fichiers dans _node_modules_

Deno

Vos différences de code

noeud ts

  • votre code fonctionne de la même manière que s'il était transposé avec tsc et exécuté avec node (car il est sous le capot)
  • vous pouvez utiliser l'API Node
  • vous pouvez utiliser tous les modules Node intégrés
  • vous pouvez utiliser des modules de npm
  • vous pouvez import fichiers en utilisant des chemins relatifs (généralement sans suffixe _.ts_)
  • vous pouvez import les dépendances installées avec npm (ou yarn) dans _node_modules_

Deno

  • votre code ne fonctionne pas de la même manière que dans Node (car il n'est pas exécuté avec Node)
  • vous utilisez l'API Deno
  • vous pouvez utiliser les modules intégrés Deno
  • vous pouvez utiliser d'autres modules Deno disponibles
  • vous pouvez import fichiers en utilisant des chemins relatifs (toujours avec le suffixe _.ts_!)
  • vous pouvez import URL directement depuis le Web (pas besoin de _npm install_)

Exemples

Voici un exemple de publication d'une bibliothèque minimale écrite en TypeScript et de son utilisation.

Création et utilisation d'une bibliothèque TypeScript avec Node et ts-node

C'est ce que je fais en ce moment avec un exemple de projet sur:

https://github.com/rsp/node-ts-hello

Création d'une bibliothèque:

  1. trouver un nom qui est gratuit sur npm (ne suffit plus, voir ci-dessous)
  2. créer un dépôt sur GitHub
  3. créer _package.json_ avec _npm init_
  4. installez le compilateur TypeScript avec _npm install TypeScript_
  5. décider si vous gardez _package-lock.json_ dans le repo (il y a des avantages et des inconvénients)
  6. créer un répertoire src où vous conserverez les fichiers TypeScript
  7. ajouter _hello.ts_ à src
  8. ajoutez le fichier _tsconfig.json_ et assurez-vous de:
    • ajouter _"src/**/*"_ à _"include"_
    • ajouter des dépendances et vos propres types à _"paths"_
    • ajouter _"outDir": "dist"_ pour placer les fichiers JS à un endroit connu
    • ajoutez le répertoire dist à _.gitignore_ afin que les fichiers compilés ne soient pas dans git
    • ajouter la même chose que dans _.gitignore_ mais sans dist dans _.npmignore_
      (sinon vous ne publierez pas les fichiers les plus importants, voir ci-dessous)
    • ajoutez _"declaration": true_ pour que vous ayez _*.d.ts_ fichiers générés
  9. ajouter _"main": "dist/hello.js"_ dans _package.json_ (notez le suffixe "js")
  10. ajouter _"types": "dist/hello.d.ts"_ dans _package.json_ (notez le suffixe "ts")
  11. ajouter _"build": "tsc"_ à _package.json_ (attention aux fichiers redondants, voir ci-dessous)
  12. connectez-vous avec _npm login_ (vous ne devriez pas être connecté tout le temps - voir: Maintenant, en poussant les logiciels malveillants: les connexions de développement de packages NPM ont été sifflées par un outil piraté populaire auprès des codeurs )
  13. compiler le projet avec _npm run build_
  14. publier le package avec _npm publish_
    • lorsque vous obtenez _npm ERR! publish Failed PUT 401_ vous devez vous connecter avec _npm login_
    • lorsque vous obtenez _npm ERR! publish Failed PUT 403_ votre package peut être "trop ​​similaire aux packages existants" - essayez de le renommer dans package.json, renommez le référentiel et mettez à jour tous les liks pour me lire, lance itp. dans package.json
  15. déconnexion de npm avec _npm logout_
  16. voyez votre _~/.npmrc_ et assurez-vous que vous n'avez plus rien de tel:
    • _//registry.npmjs.org/:_authToken=..._

Utilisation de la bibliothèque dans un autre projet à l'aide de _ts-node_

  1. créer un nouveau répertoire
  2. créer un fichier _package.json_ avec _npm init_
    • (afin que vous puissiez installer les dépendances localement pour votre nouveau programme)
  3. installez notre bibliothèque avec _npm install node-ts-hello_
  4. installez éventuellement ts-node avec _npm install TypeScript ts-node_
    • (sauf s'il est installé à l'échelle mondiale)
  5. ajouter _hi.ts_ fichier qui importe notre bibliothèque avec:
    • _import { hello } from 'node-ts-hello';_
    • hello('TS');
  6. exécutez-le avec _npx ts-node hi.ts_ (si ts-node a été installé localement) ou _ts-node hi.ts_ (si ts-node a été installé globalement)
    • si vous obtenez des erreurs, voir ci-dessous

Problèmes potentiels: j'ai un peu simplifié ce qui précède, mon processus réel de création de cette bibliothèque est décrit ici .

Création et utilisation d'une bibliothèque TypeScript avec Deno

C'est ce que je fais en ce moment avec un exemple de projet sur:

https://github.com/rsp/deno-hello

Création d'une bibliothèque:

  1. créer un dépôt sur GitHub
  2. mettre _hello.ts_ dans le repo

Utilisation de la bibliothèque:

  1. Créez un fichier _hi.ts_ avec le contenu:
    • _import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';_
    • hello('TS');
  2. Exécutez votre programme avec _deno run hi.ts_

La première exécution imprimera:

_$ deno run hi.ts 
Compiling file:///Users/rsp/talks/deno/hello-deno-test/hi.ts
Downloading https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts
Compiling https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts
Hello, TS!
_

La deuxième manche:

_$ deno run hi.ts 
Hello, TS!
_

Si vous modifiez _hi.ts_ il sera recompilé mais les dépendances ne seront pas téléchargées à nouveau:

_$ deno run hi.ts 
Compiling file:///Users/rsp/talks/deno/hello-deno-test/hi.ts
Hello, TS!
_

(Notez que _touch hi.ts_ ne sera pas suffisant, vous devez apporter les modifications réelles car Deno vérifie la somme de contrôle du fichier, pas l'horodatage.)

La vitesse

noeud ts

La vitesse de démarrage de la version ts-node de notre _hi.ts_ à partir des exemples ci-dessus:

_$ time npx ts-node hi.ts 
Hello, TS!

real    0m0.904s
user    0m1.300s
sys     0m0.083s
_

C'est après que les dépendances sont déjà installées et après avoir exécuté plusieurs fois pour vous assurer que toute la mise en cache fonctionne. Presque une seconde.

Deno

La vitesse de démarrage de la version Deno de notre _hi.ts_ à partir des exemples ci-dessus:

_$ time deno run hi.ts 
Hello, TS!

real    0m0.028s
user    0m0.010s
sys     0m0.015s
_

Cela se produit également après que les dépendances sont déjà installées et après plusieurs exécutions pour s'assurer que toute la mise en cache fonctionne.

Amélioration de la vitesse de plus de 32x.

Sommaire

Deno doit être comparé davantage avec Node qu'avec _ts-node_ parce que Deno est un runtime entièrement nouveau tandis que _ts-node_ est un module pour Node donc votre programme s'exécute avec _ts-node_ utilise vraiment le runtime Node.

C'est un projet très jeune mais qui a déjà beaucoup de succès. Il n'a pas autant de documentation ou de bibliothèques que Node mais cela signifie que c'est peut-être le meilleur moment pour s'impliquer parce que quand il deviendra plus populaire, et je pense que ce sera pour de nombreuses raisons qui dépassent portée de cette réponse, les personnes qui ont déjà une expérience avec elle seront nécessaires sur le marché, comme ce fut le cas avec Node.

La vitesse de démarrage du programme est déjà très impressionnante et j'attends plus d'améliorations là-bas.

La vitesse de développement de l'utilisation de fichiers uniques sans besoin de configuration comme _package.json_ ou _node_modules_ ainsi que la possibilité d'importer des dépendances directement à partir d'URL (comme sur le frontend) permettra de travailler de manière différente à la fois pour le code de l'utilisateur final et pour les bibliothèques. Nous verrons comment tout cela fonctionne dans la pratique, mais cela semble déjà prometteur.

21
rsp

ts-node est basé sur Node, tandis que Deno est un runtime côté serveur complètement différent et nouveau, avec des changements de conception sur l'API, les systèmes de modules, le modèle de sécurité, etc. (ce qui reflète mieux les développements post ES6). En outre, le compilateur TypeScript vit directement à l'intérieur de l'exécutable Deno unique (via des instantanés V8) et devrait donc avoir un temps de démarrage plus court.

8
Kevin Qian