Dans notre projet, l'IDE pour travailler avec l'API TestMace , TypeScript est utilisé comme langage principal, nous sommes donc activement intéressés par les projets liés à ce langage. Aujourd'hui, votre attention est sur la traduction d'un article sur l'outil d'exécution Deno pour TypeScript (mais ce n'est pas sa seule fonctionnalité). Bonne lecture.

Il y a environ trois mois, Ryan Dahl (créateur de Node.js) a fait une présentation lors de la conférence « 10 choses dont je suis désolé pour Node.js », où il a parlé de certaines de ses décisions de conception infructueuses pour Node.js. Il a consacré près de la moitié de son discours au prototype expérimental Deno, dont la tâche était d'éliminer les lacunes de Node.js.
Deno a déjà atteint la version v0.1 ( note du traducteur - déjà v0.3.8 ) et est sur la bonne voie pour remplacer Node.js à l'avenir.
Quel est le problème avec Node.js?
Tout programme peut écrire des données dans un système de fichiers ou un réseau
Cela peut entraîner un risque de sécurité, en particulier lors de l'installation de packages npm non vérifiés. Par exemple, comme dans l' incident crossenv . Si crossenv n'avait pas d'autorisation d'écriture, cela ne serait pas arrivé.
API asynchrones à départ rapide
Des promesses sont apparues dans Node.js en 2009, et en février 2010, elles ont disparu. Cependant, la plupart des bibliothèques utilisent toujours des rappels pour travailler avec du code asynchrone.
Build System (GYP)
Assembler un module pour connecter des bibliothèques à C via GYP est un tourment. Pour obtenir une expérience de développeur adéquate, vous devez utiliser node-gyp (une couche au-dessus de GYP) et, éventuellement, d'autres couches (comme nan ). J'ai personnellement essayé tout ce qui précède dans mon petit projet et, prêt à accepter, cela m'a fait transpirer.
Système de modules et npm
Le principal problème est que le système de modules n'est pas compatible avec les navigateurs, ce qui signifie que le code n'est pas complètement isomorphe. Il y a principalement deux raisons à cela: le stockage des dépendances dans node_modules et la présence de package.json.
Qu'est-ce que Deno?
"Deno est un runtime TypeScript basé sur le moteur V8,"
- Ryan Dahl
Étant donné que Typescript est une version étendue de Javascript, Deno est également un runtime pour Javascript.
Deno est un nouveau projet de Ryan Dahl (créateur de Node.js) conçu pour corriger les erreurs de conception de Node.js décrites ci-dessus.
Caractéristiques principales de Deno
La sécurité
Par défaut, Deno interdit les actions sensibles telles que la lecture de variables d'environnement ou l'écriture dans le système de fichiers.
Le processus Deno démarre en mode non privilégié et pour accéder aux données comme les variables d'environnement, des indicateurs spéciaux doivent être passés.
L'autorisation d'écrire dans le système de fichiers, ainsi que les autorisations liées à l'environnement et au réseau, sont désactivées. Pour activer ces actions, vous devez appeler Deno avec les arguments --allow-write
et --allow-net
.
Toute interaction entre le processus Deno privilégié et la v8 se résume à la messagerie (précédemment écrite en Go, maintenant portée sur Rust). Cela vous permet de créer un point unique pour vérifier tous les messages.
Système de modules
Oubliez package.json et node_modules. Lors de l'importation de fichiers source, vous pouvez spécifier un chemin d'accès relatif ou absolu, ou leur URL complète:
import { test } from "https://unpkg.com/deno_testing@0.0.5/testing.ts" import { log } from "./util.ts"
Par défaut, tous les fichiers source sont mis en cache. Vous pouvez utiliser l'argument --reload pour mettre à jour les dépendances. Cela fonctionne comme une touche F5 dans un navigateur.
Prise en charge de TypeScript prête à l'emploi
TypeScript est pris en charge par Deno par défaut. Ça y est. Sans aucun mais. Aucune configuration.
Deno v0.1.4 en action
Pour commencer, téléchargez le fichier binaire Deno:
$ mkdir deno-test && cd deno-test $ wget https://github.com/denoland/deno/releases/download/v0.1.4/deno_linux_x64.gz $ gunzip -c deno_linux_x64.gz > deno $ chmod u+x deno $ ./deno --version deno: 0.1.4 v8: 7.0.247-deno
Créez maintenant un fichier dactylographié et exécutez-le:
function hello(place: string): string { return `Hello ${place}` } console.log(hello('world'))
$ ./deno myscript.ts Hello world
Vous pouvez également essayer d'importer via URL. La seule exigence est que le fichier à la fin de l'URL doit avoir une extension .ts.
import { factorial } from "https://gist.githubusercontent.com/DanielRamosAcosta/ad514503b1c7cf8290dadb96a5fddee9/raw/4733e267f05d20110ba962c4418bab5e98abfe93/factorial.ts" console.log(factorial(10))
$ ./deno myimport.ts Downloading https://gist.githubusercontent.com/DanielRamosAcosta/ad514503b1c7cf8290dadb96a5fddee9/raw/4733e267f05d20110ba962c4418bab5e98abfe93/factorial.ts 3628800
Pendant l'exécution du script, le module se charge et s'ajoute au cache. Pour mettre à jour le cache, vous pouvez appeler Deno en utilisant l'argument --reload, qui équivaut à l'action des touches F5 ou Ctrl + R.
Voici un exemple plus complexe utilisant la bibliothèque axios:
import axios from "https://gist.githubusercontent.com/DanielRamosAcosta/2f773d815f5434f185c59aec1bab418c/raw/a442cdd8699e39ab9855cbaa571a79049a7b67d4/axios.ts"
Le seul hic est que VSCode ne peut pas charger les saisies à distance, donc l'erreur suivante apparaîtra dans l'éditeur:
An import path cannot end with a '.ts' extension.
Mais le code fonctionne toujours et produit le résultat correct:
./deno --allow-net axios-test.ts User name: Leanne Graham
Conclusion
Deno aura besoin de beaucoup de temps pour devenir un outil de travail à part entière, mais je pense qu'il évolue dans la bonne direction et qu'il a toutes les chances de devenir un runtime Javascript plus élaboré que Node.js.
Merci de votre attention!