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

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

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

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

0 ответов

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 (я не проверял, все ли одинаковые)

Библиотеки 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 в репо (есть плюсы и минусы)
  6. создать src dir, где вы будете хранить файлы TypeScript
  7. добавлять hello.ts в src
  8. добавлять tsconfig.json файл и убедитесь, что:
    • добавлять "src/**/*" в "include"
    • добавить зависимости и ваши собственные типы в "paths"
    • добавлять "outDir": "dist" поместить файлы JS в известное место
    • добавить dist каталог для .gitignore чтобы скомпилированные файлы не были в git
    • добавить так же, как в .gitignore но без dist в .npmignore
      (или иначе вы не будете публиковать наиболее важные файлы, см. ниже)
    • добавлять "declaration": true так что у тебя есть *.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 (Вы не должны входить в систему все время - см.: Сейчас выкладываете вредоносное ПО: логины dev для пакета NPM подделаны взломанным инструментом, популярным у программистов)
  13. скомпилировать проект с npm run build
  14. опубликовать пакет с npm publish
    • когда вы получаете npm ERR! publish Failed PUT 401 вам нужно войти через npm login
    • когда вы получаете npm ERR! publish Failed PUT 403 ваш пакет может быть "слишком похож на существующие пакеты" - попробуйте переименовать его в package.json, переименовать репозиторий и обновить все библиотеки в readme, выпустить itp. в package.json
  15. выйти из нпм с npm logout
  16. увидеть ваш ~/.npmrc и убедитесь, что у вас ничего подобного не осталось
    • //registry.npmjs.org/:_authToken=...

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

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

Скорость запуска версии нашего 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-кратное улучшение скорости.

Резюме

Дено следует сравнивать больше с Нодом, чем с ts-node потому что Deno это совершенно новое время выполнения в то время как ts-node это модуль для Node, поэтому ваша программа работает с ts-node действительно использовать среду выполнения Node.

Это очень молодой проект, но он уже завоевал популярность. У него не так много документации или библиотек, как у Node, но это означает, что это может быть наилучшее время для участия, потому что когда оно станет более популярным, и я думаю, что по многим причинам, которые выходят за рамки этого ответа, люди кто уже имеет опыт работы с ним, будет нужен на рынке, как это было с Node.

Скорость запуска программы уже впечатляет, и я ожидаю дальнейших улучшений.

Скорость разработки с использованием отдельных файлов без необходимости настройки, как package.json или же node_modules вместе с возможностью импортировать зависимости напрямую из URL (как во внешнем интерфейсе) позволит работать по-другому как для кода конечного пользователя, так и для библиотек. Посмотрим, как все это работает на практике, но уже выглядит многообещающе.

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

Я думаю, что @rsp уже опубликовал подробную информацию о Deno.

Я хочу отметить здесь несколько ключевых моментов, чтобы другие могли легко заметить ключевое отличие:

  • Язык- Deno основан на языке RUST. Rust - это язык программирования с несколькими парадигмами, ориентированный на производительность и безопасность, особенно на безопасный параллелизм. Rust синтаксически похож на C++, но обеспечивает безопасность памяти без использования сборки мусора.

  • Время выполнения- Deno также полагается на двигатель V8.

  • Безопасность - Распространенная критика Node.js заключается в том, что после запуска приложения узла оно может легко получить доступ к файловой системе или сети и т. Д. В то время как Deno запрашивает разрешение пользователя, чтобы разрешить использование ресурсов, таких как сеть, файловая система и т. Д.
  • НПМ?- Deno вообще не полагается на NPM, вместо этого мы импортируем наши библиотеки через URL.

    Пример:

    импортировать { serve } из "https://deno.land/std/http/server.ts";

    Вся библиотека, которую мы хотим использовать, сначала загружается, а затем кешируется.

  • Объект Windows. Хорошая новость заключается в том, что теперь мы можем использовать объект Windows в Deno, которого нет в Node.js. Объект Wisnows имеет много богатых API, которые могут очень помочь в Deno при разработке.
  • Импорт- запретить использование импорта ES6 для вставки модуля в файлы.
  • Машинопись- Deno полностью поддерживает машинопись.
Другие вопросы по тегам