TL;DR
Deno больше похож на Node, чем на ts-node, то есть это среда выполнения JS, основанная на V8. В отличие от Node, Deno содержит компилятор TypeScript. Deno не является частью экосистемы Node / npm.
С другой стороны, ts-node - это модуль Node.js, который использует компилятор TypeScript для преобразования кода TypeScript и его запуска в Node. ts-node является частью экосистемы Node / npm.
Дено быстр. См. ниже.
Сходства Deno и ts-node
- Оба они запускают код TypeScript.
- Оба они работают на Linux, Mac и Windows (но ts-node также на SmartOS и AIX).
- Оба они используют движок Google V8 JavaScript (ts-node через node, который он использует под капотом)
Deno и ts-node отличия
ts-узел
- ts-node - это модуль Node.js
- он написан на Node.js
- он установлен с помощью npm
- он использует компилятор TypeScript как одноранговую зависимость
- он устанавливает свои собственные зависимости
- в качестве среды выполнения он использует Node, который написан на C ++ с использованием libuv
Дено
- NEMO - это автономный исполняемый файл
- он не использует Node.js
- он распространяется как единый двоичный файл
- он содержит компилятор TypeScript в виде снимка V8
- у него нет зависимостей
- это среда выполнения, написанная на Rust с использованием Tokio
Зрелость
ts-узел
ts-node полагается на среду выполнения Node.js, поэтому будет справедливо включить ее сюда:
- Node.js был выпущен в 2009 году, последняя LTS-версия - 14.15.0.
- npm был выпущен в 2010 году, версия, включенная в Node LTS, - 6.14.8
- ts-node выпущен в 2015 году, последняя версия - 9.0.0
Дено
Deno сам по себе является средой выполнения, поэтому больше ничего не использует:
Популярность
GitHub:
Переполнение стека:
Библиотеки
ts-узел
Вы можете использовать все библиотеки Node, доступные в npm
(в настоящее время в npm 955263 пакета, не все для Node, но все же много)
Библиотеки узлов, доступные в npm, даже если они изначально были написаны на TypeScript, обычно публикуются в форме, перенесенной в JavaScript, с дополнительными определениями типов в файлах *.d.ts
(включены в пакет npm или установлены отдельно от пространства имен @types
).
Дено
Есть 1256 сторонних модулей на https://deno.land/x/ и 56 библиотек и инструментов на https://github.com/denolib/awesome-deno#modules (я не t проверить, все ли одинаковы)
Библиотеки Deno - это просто файлы TypeScript.
Разница в установке
ts-узел
- you install Node.js
- you install
typescript
and ts-node
with their dependencies with npm
npm install typescript ts-node
- он устанавливает 10 модулей npm и помещает 44 МБ в 212 файлов в
node_modules
Дено
- you download a single binary
Ваш код отличия
ts-узел
- ваш код работает так же, как если бы он был передан с
tsc
и запускался с node
(потому что он находится под капотом)
- вы можете использовать Node API
- вы можете использовать все встроенные модули Node
- вы можете использовать модули из npm
- вы можете
import
файлов, используя относительные пути (обычно без суффикса .ts
)
- вы можете
import
зависимости, установленные с npm
(или yarn
) в node_modules
Дено
- ваш код не работает так же, как в 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
в репо (есть плюсы и минусы)
- создайте
src
каталог, в котором вы будете хранить файлы 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
(вы не должны входить в систему все время - см. Сейчас Распространение вредоносного ПО: логины разработчиков пакета 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-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-узел
Скорость запуска ts-node версии нашего hi.ts
из примеров выше:
$ time npx ts-node hi.ts
Hello, TS!
real 0m0.904s
user 0m1.300s
sys 0m0.083s
Это происходит после того, как зависимости уже установлены и после нескольких запусков, чтобы убедиться, что все кеширование работает. Почти одна секунда.
Дено
Скорость запуска 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-адресов (например, во внешнем интерфейсе) позволит работать по-разному как для кода конечного пользователя, так и для библиотеки. Посмотрим, как все это работает на практике, но это уже выглядит многообещающе.
person
rsp
schedule
10.04.2019