TL; DR
Deno больше похож на Node, чем на ts-node, т.е. это среда выполнения JS, основанная на V8.В отличие от Node, Deno содержит компилятор TypeScript.Deno не является частью экосистемы Node / npm.
С другой стороны, ts-узел - это модуль Node.js, который использует компилятор TypeScript для переноса кода TypeScript и запуска его в Node.ts-node является частью экосистемы Node / npm.
Deno работает быстро.См. Ниже.
Сходства Deno и ts-узла
- Они оба выполняют код TypeScript
- Они оба работают в Linux, Mac и Windows (но также и ts-nodeв SmartOS и AIX)
- Они оба используют движок Google V8 JavaScript (ts-узел через узел, который он использует под капотом)
Различия между Deno и ts-узлом
ts-node
- ts-node - это модуль Node.js
- , написан на Node.js
- , устанавливается с npm
- он использует компилятор TypeScript в качестве одноранговой зависимости
- он устанавливает свои собственные зависимости
- в качестве среды выполнения, он использует Node, который написан на C ++ с использованием libuv
Deno
- deno - автономный исполняемый файл
- он не использует Node.js
- он распространяется как один двоичный файл
- itсодержит компилятор TypeScript в виде снимка V8
- он не имеет зависимостей
- это среда выполнения, написанная на Rust с использованием Tokio
Maturity
ts-node
ts-node использует среду выполнения Node.js, поэтому было бы справедливо включить ее здесь:
- Node.js былвыпущенная в 2009 году, последняя версия LTS 10.15.3
- npm была выпущена в 2010 году, версия, включенная в Node LTS: 6.4.1
- ts-node была выпущена в 2015 году, последняя версия8.0.3
Deno
Deno сам по себе является средой выполнения, поэтому он не использует ничего другого:
- Deno был выпущен в 2018 году,последняя версия - 0.3.6
Популярность
GitHub:
Переполнение стека:
Libraries
ts-node
Вы можете использовать все библиотеки Node, доступные на npm
(в настоящее время на npm есть 955 263 пакета, не все для Node, но все еще много)
Библиотеки Node, доступные на npm, даже если они изначально были написаны на TypeScript, обычно публикуются в форме, переносимой в JavaScript, с дополнительными определениями типов в *.d.ts
файлах (включаются в пакет npm или устанавливаются отдельно).из пространства имен @types
).
Deno
На https://deno.land/x/ имеется 55 сторонних модулей и на https://github.com/denolib/awesome-deno#modules 56 библиотек и инструментов (я не делалне проверяйте, все ли они одинаковы)
Библиотеки Deno - это просто файлы TypeScript.
Разница в установке
ts-node
- youустановить Node.js
- вы устанавливаете
typescript
и ts-node
с их зависимостями с npm
npm install typescript ts-node
- устанавливает модули по 10 npm и помещает 44MB в 212 файлах в
node_modules
Deno
- , которые вы загружаетеодин двоичный файл
Ваши различия в коде
ts-node
- ваш код работает так же, как если бы он был передан с
tsc
и запущен с node
(потому что он находится под капотом) - вы можете использовать Node API
- вы можете использовать все встроенные модули Node
- вы можете использовать модули из npm
- вы можете
import
файлы, используя относительные пути (обычно без суффикса .ts
) - вы можете
import
зависимости, установленные с npm
(или yarn
) в node_modules
Deno
- ваш код не работаеттак же, как в Node (потому что он не запускается с Node)
- вы используете Deno API
- вы можете использовать встроенные модули Deno
- вы можете использоватьдругие доступные модули Deno
- вы можете
import
файлы, используя относительные пути (всегда с .ts
суффиксом!) - вы можете
import
URL-адреса напрямую из Интернета (не нужноnpm install
)
Примеры
Вот пример публикации минимальной библиотеки, написанной на TypeScript, и ее использования.
Создание и использование библиотеки TypeScript с Nodeи ts-node
Это то, что я делаю сейчас с примером проекта:
https://github.com/rsp/node-ts-hello
Создание библиотекиary:
- найти свободное имя на npm (этого недостаточно, см. ниже)
- создать репо на GitHub
- создать
package.json
с помощью npm init
- установить компилятор TypeScript с
npm install typescript
- решить, сохраняете ли вы
package-lock.json
в репо (есть плюсы и минусы) - создать
src
dir, где вы будете хранить файлы TypeScript - добавьте
hello.ts
в src
- добавьте
tsconfig.json
файл и убедитесь, что: - добавьте
"src/**/*"
к "include"
- добавить зависимости и ваши собственные типы в
"paths"
- добавить
"outDir": "dist"
, чтобы поместить файлы JS в известное место - добавить каталог
dist
в .gitignore
, чтобы скомпилированные файлы не были в git - , добавьте то же, что и в
.gitignore
, но без dist
в .npmignore
(иначе вы не будете публиковатьнаиболее важные файлы, см. ниже) - добавить
"declaration": true
, чтобы вы получили *.d.ts
файлов, сгенерированных
- добавить
"main": "dist/hello.js"
в package.json
(обратите внимание на "js"«суффикс» - добавить
"types": "dist/hello.d.ts"
в package.json
(примечаниесуффикс "ts") - добавьте
"build": "tsc"
к package.json
(обратите внимание на избыточные файлы, см. ниже) - войдите с
npm login
(вы не должны входить во всевремя - см .: Now Pushing Malware: логины dev для пакета NPM подделаны взломанным инструментом, популярным среди кодеров ) - скомпилируйте проект с помощью
npm run build
- опубликуйте пакет с
npm publish
- когда вы получаете
npm ERR! publish Failed PUT 401
, вам необходимо войти в систему с npm login
- , когда вы получите
npm ERR! publish Failed PUT 403
ваш пакет может быть "слишком похож на существующие пакеты" - попробуйте переименовать егов package.json, переименуйте репозиторий и обновите все как readme, выдает itp.в package.json
- выйдите из npm с помощью
npm logout
- посмотрите ваш
~/.npmrc
и убедитесь, что у вас ничего подобного не осталось: //registry.npmjs.org/:_authToken=...
Использование библиотеки в другом проекте с использованием ts-node
- создать новый каталог
- создать
package.json
файл с npm init
- (так что вы можете установить зависимости локально для вашей новой программы)
- установить нашу библиотеку с
npm install node-ts-hello
- при желании установить ts-узел с
npm install typescript ts-node
- (если он не установлен глобально)
- добавить
hi.ts
файл, который импортирует нашу библиотеку с: import { hello } from 'node-ts-hello';
hello('TS');
- запустить его с
npx ts-node hi.ts
(если ts-узел был установлен локально) или ts-node hi.ts
(если ts-узел былустановлен глобально) - если вы получаете ошибки, см. ниже
Потенциальные проблемы: я немного упростил вышеприведенное, мой фактический процесс создания этой библиотекиописано здесь .
Создание и использование библиотеки TypeScript с помощью Deno
Вот что я сейчас делаю с примером проекта:
https://github.com/rsp/deno-hello
Создание библиотеки:
- создание репо на GitHub
- размещение
hello.ts
в репо
Использование библиотеки:
- Создать файл
hi.ts
с содержанием: - Запустите вашу программу с помощью
deno run hi.ts
При первом запуске будет напечатано:
$ 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!
Второй запуск:
$ deno run hi.ts
Hello, TS!
Если вы измените hi.ts
, он будет перекомпилирован, но зависимости не будут загружены снова:
$ deno run hi.ts
Compiling file:///Users/rsp/talks/deno/hello-deno-test/hi.ts
Hello, TS!
(Обратите внимание, что touch hi.ts
будет недостаточно, вам нужно внести реальные изменения, потому что Дено проверяет контрольную сумму файла, а не метку времени.)
Скорость
ts-node
Скорость запуска версии ts-узла нашего hi.ts
из приведенных выше примеров:
$ time npx ts-node hi.ts
Hello, TS!
real 0m0.904s
user 0m1.300s
sys 0m0.083s
Это после того, как зависимости уже установлены и после запуска несколько раз, чтобы убедиться, что все кэшированиеработает.Почти одну секунду.
Deno
Скорость запуска версии Deno нашей hi.ts
из приведенных выше примеров:
$ time deno run hi.ts
Hello, TS!
real 0m0.028s
user 0m0.010s
sys 0m0.015s
Это также после того, как зависимостиуже установлен и после запуска несколько раз, чтобы убедиться, что все кэширование работает.
Более 32-кратное улучшение скорости.
Резюме
Deno следует сравнивать больше с Node, чемс ts-node
, потому что Deno - совершенно новая среда выполнения, а ts-node
- модуль для Node, поэтому ваша программа, запущенная с ts-node
, действительно использует среду выполнения Node.
Это очень молодой проект, но он уже получилмного тяги.У него не так много документации или библиотек, как у Node, но это означает, что это может быть наилучшее время для участия, потому что когда оно станет более популярным, и я думаю, что по многим причинам, которые выходят за рамки этого ответа, людикто уже имеет опыт работы с ним, будет нужен на рынке, как это было с Node.
Скорость запуска программы уже очень впечатляет, и я ожидаю, что там будет больше улучшений.
Скорость разработкииспользование отдельных файлов без необходимости конфигурирования, таких как package.json
или node_modules
, а также возможность импорта зависимостей непосредственно из URL-адресов (например, во внешнем интерфейсе) позволит работать по-разному как для кода конечного пользователя, так и длябиблиотеки.Посмотрим, как все это работает на практике, но уже выглядит многообещающе.