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:
Переполнение стека:
- Вопросы с тэгом '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 (я не проверял, все ли одинаковые)
Библиотеки 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
в репо (есть плюсы и минусы) - создать
src
dir, где вы будете хранить файлы 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
(Вы не должны входить в систему все время - см.: Сейчас выкладываете вредоносное ПО: логины dev для пакета 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 logout
- увидеть ваш
~/.npmrc
и убедитесь, что у вас ничего подобного не осталось//registry.npmjs.org/:_authToken=...
Использование библиотеки в другом проекте с использованием ts-node
- создать новый каталог
- создать
package.json
файл сnpm init
- (чтобы вы могли устанавливать зависимости локально для вашей новой программы)
- установить нашу библиотеку с
npm install node-ts-hello
- опционально установите TS-узел с
npm install typescript ts-node
- (если он не установлен глобально)
- добавлять
hi.ts
файл, который импортирует нашу библиотеку с:import { hello } from 'node-ts-hello';
hello('TS');
- запустить его с
npx ts-node hi.ts
(если TS-узел был установлен локально) или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-узла 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 полностью поддерживает машинопись.