Ответ 1
TL; DR
Deno больше похож на Node, чем на ts-node, т.е. это среда выполнения JS, основанная на V8. В отличие от Node, Deno содержит компилятор TypeScript. Deno не является частью экосистемы Node/npm.
ts-node - это модуль Node.js, который использует компилятор TypeScript для переноса кода TypeScript и запуска его в Node. TS-узел является частью экосистемы Node/npm.
Дено быстр. Увидеть ниже.
Сходство Deno и ts-узла
- Они оба запускают код TypeScript
- Они оба работают на Linux, Mac и Windows (но ts-node также на SmartOS и AIX)
- Они оба используют движок Google V8 JavaScript (ts-узел через узел, который он использует под капотом)
Различия между Deno и ts-node
TS-узел
- ts-node - это модуль Node.js
- написано в Node.js
- это установлено с npm
- он использует компилятор TypeScript как одноранговую зависимость
- он устанавливает свои собственные зависимости
- в качестве среды выполнения он использует Node, который написан на C++ с использованием libuv
Deno
- deno - автономный исполняемый файл
- он не использует Node.js
- он распространяется как один двоичный файл
- он содержит компилятор TypeScript как снимок V8
- у него нет зависимостей
- это среда выполнения, написанная на Rust с использованием Tokio
зрелость
TS-узел
ts-node использует среду выполнения Node.js, поэтому было бы справедливо включить ее здесь:
- Node.js был выпущен в 2009 году, последняя версия LTS - 10.15.3
- npm был выпущен в 2010 году, в Node LTS включена версия 6.4.1
- TS-узел был выпущен в 2015 году, последняя версия 8.0.3
Deno
Deno сам по себе является средой выполнения, поэтому больше ничего не использует:
- Deno был выпущен в 2018 году, последняя версия 0.3.6
популярность
GitHub:
Переполнение стека:
- Вопросы с тэгом 'node.js': 270 111
- Вопросы с тегом "машинопись": 78 592
- Вопросы с тэгом 'ts-node': 94
- Вопросы с тэгом 'deno': 9
Библиотеки
TS-узел
Вы можете использовать все библиотеки Node, доступные на npm
(в настоящее время на npm есть 955 263 пакета, но не все для Node, но все еще много)
Библиотеки Node, доступные в npm, даже если они изначально были написаны на TypeScript, обычно публикуются в форме, переносимой в JavaScript, с дополнительными определениями типов в файлах *.d.ts
(включены в пакет npm или устанавливаются отдельно от пространства имен @types
).
Deno
Есть 55 сторонних модулей в https://deno.land/x/ и 56 библиотек и инструментов в https://github.com/denolib/awesome-deno#modules (я не проверял, все ли одинаковые )
Библиотеки Deno - это просто файлы TypeScript.
Разница в установке
TS-узел
- вы устанавливаете Node.js
- https://nodejs.org/en/download/
- v10 (текущий LTS) на Mac и Linux составляет около 65 МБ в 4500 файлах
- вы устанавливаете
typescript
иts-node
с их зависимостями с помощьюnpm
-
npm install typescript ts-node
- он устанавливает 10 модулей npm и помещает 44MB в 212 файлах в
node_modules
-
Deno
- Вы загружаете один двоичный файл
- https://github.com/denoland/deno/releases
- несжатый двоичный файл v0.3.6 на Mac и Linux составляет около 47 МБ и 41 МБ в Windows
Ваши различия в коде
TS-узел
- ваш код работает так же, как если бы он был перенесен с
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
Создание библиотеки:
- найти имя, которое свободно на npm (больше не достаточно, см. ниже)
- создать репо на GitHub
- создать
package.json
с помощьюnpm init
- установить компилятор TypeScript с помощью
npm install typescript
- решите, будете ли вы хранить
package-lock.json
вpackage-lock.json
(есть плюсы и минусы) - создайте
src
котором вы будете хранить файлы TypeScript - добавить
hello.ts
вsrc
- добавьте файл
tsconfig.json
и убедитесь, что:- добавить
"src/**/*"
в"include"
- добавить зависимости и ваши собственные типы в
"paths"
- добавьте
"outDir": "dist"
чтобы поместить файлы JS в известное место - добавьте каталог
dist
в.gitignore
чтобы скомпилированные файлы не были в git - добавить так же, как в
.gitignore
но безdist
в.npmignore
(или иначе вы не будете публиковать наиболее важные файлы, см. ниже) - добавить
"declaration": true
чтобы у вас были*.d.ts
файлы*.d.ts
- добавить
- добавьте
"main": "dist/hello.js"
вpackage.json
(обратите внимание на суффикс "js") - добавьте
"types": "dist/hello.d.ts"
вpackage.json
(обратите внимание на суффикс "ts") - добавьте
"build": "tsc"
вpackage.json
(следите за избыточными файлами, см. ниже) - Войдите в систему с
npm login
(вам не нужно входить в систему все время - см.: Сейчас высаживаете вредоносное ПО: логины для разработки пакетов NPM взломаны взломанным инструментом, популярным у программистов) - скомпилируйте проект с помощью
npm run build
- опубликовать пакет с помощью
npm publish
- когда вы получите
npm ERR! publish Failed PUT 401
npm ERR! publish Failed PUT 401
необходимо авторизоваться черезnpm login
- когда вы получите
npm ERR! publish Failed PUT 403
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-node с помощью
npm install typescript ts-node
- (если он не установлен глобально)
- добавьте файл
hi.ts
который импортирует нашу библиотеку:-
import { hello } from 'node-ts-hello';
-
hello('TS');
-
- запустите его с помощью
npx ts-node hi.ts
(если ts-node был установлен локально) илиts-node hi.ts
(если ts-node был установлен глобально)- если вы получаете ошибки, см. ниже
Потенциальные проблемы: я немного упростил вышесказанное, мой фактический процесс создания этой библиотеки описан здесь.
Создание и использование библиотеки TypeScript с Deno
Это то, что я делаю сейчас с примером проекта:
https://github.com/rsp/deno-hello
Создание библиотеки:
- создать репо на GitHub
- положить
hello.ts
в репо
Использование библиотеки:
- Создайте файл
hi.ts
с содержимым:-
import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
-
hello('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
будет недостаточно, вам нужно внести реальные изменения, потому что Deno проверяет контрольную сумму файла, а не метку времени.)
скорость
TS-узел
Скорость запуска версии нашего hi.ts
ts-node из приведенных выше примеров:
$ 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-адресов (как в веб-интерфейсе) позволит по-разному работать как для кода конечного пользователя и для библиотек. Посмотрим, как все это работает на практике, но уже выглядит многообещающе.