deno vs ts-node: какая разница

Я работаю над проектом с крупными типографиками, я использую ts-node для запуска тестирования узлов и примеров. Насколько я понимаю, ts-node будет компилировать ts файлы в js файлы и выполнять.

В последнее время я слышал о deno, который является временем выполнения скриптов. Я попробовал несколько примеров в машинописном тексте, который работает с использованием ts-node. Я запустил пример с помощью deno, в консоли было напечатано много компилируемых сообщений, затем выполните код. И позже я нашел там файлы кеша в /username/.deno. Я не чувствую, что выполнение deno выполняется быстрее, чем ts-node

Кажется, что и deno и ts-node будут компилироваться и выполняться с использованием кеша. Какая разница между ними?

Ответ 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:

Переполнение стека:

Библиотеки

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
  • вы устанавливаете typescript и ts-node с их зависимостями с помощью npm
    • npm install typescript ts-node
    • он устанавливает 10 модулей npm и помещает 44MB в 212 файлах в node_modules

Deno

  • Вы загружаете один двоичный файл

Ваши различия в коде

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

Создание библиотеки:

  1. найти имя, которое свободно на npm (больше не достаточно, см. ниже)
  2. создать репо на GitHub
  3. создать package.json с помощью npm init
  4. установить компилятор TypeScript с помощью npm install typescript
  5. решите, будете ли вы хранить package-lock.json в package-lock.json (есть плюсы и минусы)
  6. создайте src котором вы будете хранить файлы TypeScript
  7. добавить hello.ts в src
  8. добавьте файл tsconfig.json и убедитесь, что:
    • добавить "src/**/*" в "include"
    • добавить зависимости и ваши собственные типы в "paths"
    • добавьте "outDir": "dist" чтобы поместить файлы JS в известное место
    • добавьте каталог dist в .gitignore чтобы скомпилированные файлы не были в git
    • добавить так же, как в .gitignore но без dist в .npmignore
      (или иначе вы не будете публиковать наиболее важные файлы, см. ниже)
    • добавить "declaration": true чтобы у вас были *.d.ts файлы *.d.ts
  9. добавьте "main": "dist/hello.js" в package.json (обратите внимание на суффикс "js")
  10. добавьте "types": "dist/hello.d.ts" в package.json (обратите внимание на суффикс "ts")
  11. добавьте "build": "tsc" в package.json (следите за избыточными файлами, см. ниже)
  12. Войдите в систему с npm login (вам не нужно входить в систему все время - см.: Сейчас высаживаете вредоносное ПО: логины для разработки пакетов NPM взломаны взломанным инструментом, популярным у программистов)
  13. скомпилируйте проект с помощью npm run build
  14. опубликовать пакет с помощью 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
  15. выход из npm с npm logout
  16. посмотрите ваш ~/.npmrc и убедитесь, что у вас ничего подобного не осталось:
    • //registry.npmjs.org/:_authToken=...

Использование библиотеки в другом проекте с использованием ts-node

  1. создать новый каталог
  2. создайте файл package.json с помощью npm init
    • (чтобы вы могли устанавливать зависимости локально для вашей новой программы)
  3. установить нашу библиотеку с помощью npm install node-ts-hello
  4. опционально установите ts-node с помощью npm install typescript ts-node
    • (если он не установлен глобально)
  5. добавьте файл hi.ts который импортирует нашу библиотеку:
    • import { hello } from 'node-ts-hello';
    • hello('TS');
  6. запустите его с помощью npx ts-node hi.ts (если ts-node был установлен локально) или ts-node hi.ts (если ts-node был установлен глобально)
    • если вы получаете ошибки, см. ниже

Потенциальные проблемы: я немного упростил вышесказанное, мой фактический процесс создания этой библиотеки описан здесь.

Создание и использование библиотеки TypeScript с Deno

Это то, что я делаю сейчас с примером проекта:

https://github.com/rsp/deno-hello

Создание библиотеки:

  1. создать репо на GitHub
  2. положить hello.ts в репо

Использование библиотеки:

  1. Создайте файл hi.ts с содержимым:
    • import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
    • hello('TS');
  2. Запустите вашу программу с помощью 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-адресов (как в веб-интерфейсе) позволит по-разному работать как для кода конечного пользователя и для библиотек. Посмотрим, как все это работает на практике, но уже выглядит многообещающе.

Ответ 2

ts-node основан на узле, в то время как Deno - это совершенно другая и новая среда выполнения на стороне сервера, с изменениями в дизайне API, модульных систем, модели безопасности и т.д. (что лучше отражает сообщения о событиях ES6). Кроме того, компилятор TypeScript живет непосредственно внутри одного исполняемого файла Deno (через моментальные снимки V8) и, следовательно, должен иметь более короткое время запуска.