Node vs ts-node: в чем разница

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

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

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


person jerry    schedule 22.11.2018    source источник
comment
Оптимизация ожидается в Deno в далеком будущем.   -  person Estus Flask    schedule 22.11.2018


Ответы (3)


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

Дено

Ваш код отличия

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

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

  1. найти бесплатное имя в npm (уже недостаточно, см. ниже)
  2. создать репо на GitHub
  3. создать package.json с npm init
  4. установить компилятор TypeScript с npm install typescript
  5. решите, храните ли вы 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 файлов
  1. добавить "main": "dist/hello.js" в package.json (обратите внимание на суффикс js)
  2. добавить "types": "dist/hello.d.ts" в package.json (обратите внимание на суффикс ts)
  3. добавить "build": "tsc" в package.json (обратите внимание на избыточные файлы, см. ниже)
  4. войдите в систему с npm login (вы не должны входить в систему все время - см. Сейчас Распространение вредоносного ПО: логины разработчиков пакета NPM, полученные с помощью взломанного инструмента, популярного среди программистов)
  5. скомпилировать проект с npm run build
  6. опубликуйте пакет с npm publish
  • когда вы получите npm ERR! publish Failed PUT 401, вам нужно будет войти в систему с npm login
  • когда вы получаете npm ERR! publish Failed PUT 403, ваш пакет может быть слишком похож на существующие пакеты - попробуйте переименовать его в package.json, переименовать репо и обновить все лайки до readme, выдает itp. в package.json
  1. выйти из npm с npm logout
  2. посмотрите свой ~/.npmrc и убедитесь, что у вас ничего подобного не осталось:
  • //registry.npmjs.org/:_authToken=...

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

  1. создать новый каталог
  2. создать package.json файл с npm init
  • (чтобы вы могли локально устанавливать зависимости для вашей новой программы)
  1. установите нашу библиотеку с npm install node-ts-hello
  2. при желании установить ts-node с npm install typescript ts-node
  • (если он не установлен глобально)
  1. добавьте hi.ts файл, который импортирует нашу библиотеку с помощью:
  • import { hello } from 'node-ts-hello';
  • hello('TS');
  1. запустите его с 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');
  1. Запустите вашу программу с 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
comment
Deno - это то, что узел не знал. - person Rainning; 20.05.2019
comment
Что вы думаете о NEM в 2020 году? Будет ли это следующий Node / Go? - person NIKHIL C M; 07.01.2020
comment
так что вы импортируете это import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts'; через HTTP-запрос ?? сумасшедший. как насчет управления версиями? Я имею в виду, что они могут добавить /v.1.1.1 в ссылку, но не думаете ли вы, что это неэффективно? - person aRtoo; 25.01.2020
comment
ох, здесь говорится identify.land/std/manual.md#comparison-to- nodejs, что вы можете использовать путь к файлу. - person aRtoo; 25.01.2020
comment
Скорость запуска программы уже впечатляет, и я ожидаю, что там будет больше улучшений. Почему вы так думаете? Добавление функций и исправление ошибок обычно увеличивает сложность кода и затрудняет его быстрое выполнение. Кроме того, время запуска менее 100 мс - это уже неплохо, и я сомневаюсь, что они потратят много времени на то, чтобы сделать его еще быстрее. Вероятно, он по-прежнему будет быстрее, чем ts-node, из-за меньшего количества слоев, но я не ожидаю, что он станет быстрее, чем сейчас. - person sanderd17; 08.02.2020
comment
Определенно может иметь проблемы с версией @aRtoo! Напоминает Go ... в прошлый раз, когда я использовал его, сообщество изобрело свои собственные менеджеры пакетов! - person U Avalos; 13.05.2020

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

person Kevin Qian    schedule 05.12.2018

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

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

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

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

  • Безопасность. Распространенная критика Node.js заключается в том, что после запуска приложения узла оно может легко получить доступ к файловой системе или сети и т. д. Хотя Deno запрашивает у пользователя разрешение на использование ресурсов, таких как net, файловая система и т. д.

  • NPM? - Deno вообще не полагается на NPM, вместо этого мы импортируем наши библиотеки через URL-адрес.

Пример:

> import { serve } from "https://deno.land/std/http/server.ts";

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

  • Window Object. Хорошая новость в том, что теперь мы можем использовать Window Object в Deno, которого нет в Node.js. Window Object имеет много богатых API-интерфейсов, которые могут очень помочь в разработке Deno.
  • Импорт - запретить использование импорта ES6 для вставки модуля в файлы.
  • Машинопись - Deno полностью поддерживает машинопись.
person abdulbarik    schedule 04.06.2020