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?
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.
ts-node s'appuie sur le runtime Node.js, il est donc juste de l'inclure ici:
Deno est lui-même un runtime donc il n'utilise rien d'autre:
GitHub:
Débordement de pile:
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
_).
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.
TypeScript
et _ts-node
_ avec leurs dépendances avec npm
npm install TypeScript ts-node
_node_modules
_tsc
et exécuté avec node
(car il est sous le capot)import
fichiers en utilisant des chemins relatifs (généralement sans suffixe _.ts
_)import
les dépendances installées avec npm
(ou yarn
) dans _node_modules
_import
fichiers en utilisant des chemins relatifs (toujours avec le suffixe _.ts
_!)import
URL directement depuis le Web (pas besoin de _npm install
_)Voici un exemple de publication d'une bibliothèque minimale écrite en TypeScript et de son utilisation.
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:
package.json
_ avec _npm init
_npm install TypeScript
_package-lock.json
_ dans le repo (il y a des avantages et des inconvénients)src
où vous conserverez les fichiers TypeScripthello.ts
_ à src
tsconfig.json
_ et assurez-vous de: "src/**/*"
_ à _"include"
_"paths"
_"outDir": "dist"
_ pour placer les fichiers JS à un endroit connudist
à _.gitignore
_ afin que les fichiers compilés ne soient pas dans git.gitignore
_ mais sans dist
dans _.npmignore
_"declaration": true
_ pour que vous ayez _*.d.ts
_ fichiers générés"main": "dist/hello.js"
_ dans _package.json
_ (notez le suffixe "js")"types": "dist/hello.d.ts"
_ dans _package.json
_ (notez le suffixe "ts")"build": "tsc"
_ à _package.json
_ (attention aux fichiers redondants, voir ci-dessous)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 )npm run build
_npm publish
_ npm ERR! publish Failed PUT 401
_ vous devez vous connecter avec _npm login
_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.jsonnpm logout
_~/.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
_
package.json
_ avec _npm init
_ npm install node-ts-hello
_npm install TypeScript ts-node
_ hi.ts
_ fichier qui importe notre bibliothèque avec: import { hello } from 'node-ts-hello';
_hello('TS');
npx ts-node hi.ts
_ (si ts-node a été installé localement) ou _ts-node hi.ts
_ (si ts-node a été installé globalement) 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 .
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:
hello.ts
_ dans le repoUtilisation de la bibliothèque:
hi.ts
_ avec le contenu: import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
_hello('TS');
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 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.
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.
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.
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.