Как стать автором
Обновить

Комментарии 143

В среде Deno пакеты импортируются с использованием URL.

Главная причина того, что JS-разработчики НЕ будут использовать Deno. Вот психанёт разработчик условного leftpad и удалит сайт/репозиторий — и всё, нету вашего URL.


Ну или все будут импортировать с какого-нибудь npmjs.com или того же deno.land и в итоге по сути ничего не поменяется.

Вот психанёт разработчик условного leftpad и удалит сайт/репозиторий, а у вас в вашей репе лежит форк этого пакета.

НЛО прилетело и опубликовало эту надпись здесь

Я задолбаюсь форкать все 2073 пакета, которые прописаны в зависимостях одного из моих небольших проектов.

Не надо ничего форкать, любой прокси решает эту проблему. Такой "прокси" могут даже встроить в сам Deno, и тогда он даже не будет иметь ничего общего с перехватом сетевых вызовов.


URL — это точно такая же виртуальная сущность, которая может указывать куда угодно. То, что пока его не отвязали — это просто свидетельство, что проблемы никакой нет. Слишком мало людей ещё пользуются Deno, есть проблемы важней.


Тем более, что Deno не нужно "пользоваться" прямо сейчас, это же фан-проект в самом разгаре разработки

URL в качестве виртуальной сущности окончательно теряет всякий смысл

Потому что в итоге получается тот же самый Node, в котором импорты тоже можно сделать с такими же виртуальными сущностями. Только будет хуже чем в Node, потому что через несколько итераций легаси придётся поддерживать совместимость с длинными неуклюжими URL из Deno v1.0

Дальше строго имхо, Райану свечку не держал.


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


Так-то, в C# и Java инструменты пофичастее будут, чем JS. И программы быстрей, стабильней, держат большую нагрузку. Но кто захочет связываться с жирными сложными чудовищами, если есть чудесный JS, где веб-сервер пишется в одну строчку в пустом файле? Весь поинт в этой невыразимой лёгкости использования, по сравнению с монстрами из Старого Мира


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


У человека есть мгновенная проблема — и он её решает методом копипасты с GitHub. Есть приложения, в которых нет почти ни одной своей строчки, это целиком готовые модули (возможно, свои с других проектов), копипаста с GitHub и StackOverflow и клей.


Поэтому важно, чтобы основной юзкейс использования (быстро навернуть готового кода откуда-то из произвольного места в интернете) был доступен за 0 секунд без включения мозга.


Вот у тебя есть какой-то другой проект, вчера ты его кодил. Ты хочешь, чтобы один из модулей, которые ты там наговнокодил, перекочевал в то, что ты пишешь прямо сейчас. Что для этого нужно сделать? Запушить старый говнокод в произвольное место на гитхабе в любом виде, какой тебе больше нравится, и прописать путь до него в import, всё


А вот все остальные кейсы, вроде поддержки срача из модулей через пять лет разработки — это уже всё дело десятое и инструменты для этого могут использоваться куда сложнее, или даже быть непрятными и уродливыми.


Пример уродливого, но рабочего решения — это файл-роутер, в котором можно сказать: "пакет по этому URL отвалился, будем использовать вместо него пакет по другому URL". Всё, починиль.


Один фиг, в нашем мире throawayware, скорей всего никакой код пять лет не проживёт, зависимости изменятся сто пятьсот раз совершенно не по причине того, что они сломались в репозитории, и беспокойство совершенно преждевременное :)

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

Но кто захочет связываться с жирными сложными чудовищами, если есть чудесный JS, где веб-сервер пишется в одну строчку в пустом файле?

У человека есть мгновенная проблема — и он её решает методом копипасты с GitHub. Есть приложения, в которых нет почти ни одной своей строчки, это целиком готовые модули (возможно, свои с других проектов), копипаста с GitHub и StackOverflow и клей.

Ох уже эти времена старого php… Только код брался, если правильно всё помню, из комментариев к официальной документации.

Вы думаете, что в js таки решил проблему, что код не пишется дважды?

Если уж надо тяп ляп, то заливать на github явно сложно, долго. Проще код копипастнуть у себя же на машине.

Если код продолжает изменяться — нет

НЛО прилетело и опубликовало эту надпись здесь
Ой, а если при этом вспомнить ещё и xmlns… Плавали, знаем…

Меня больше беспокоит, одна библиотека будет импортировать leftpad с npmjs.com, другая с deno.lend, третья со своего сайта, в результате в проекте будет 3 копии одной библиотеки. А писать полный адрес каждый раз при импорте — то ещё развлечение.

У меня есть большое подозрение, что механизм кэширования умеет проверять хэш.

Выглядит как нескучные обои:


  1. ECMAScript modules are the official standard format to package JavaScript code for reuse. Modules are defined using a variety of import and export statements.
  2. Как сказал предыдущий комментатор: внешние зависимости на проде — это нескучно!
  3. ts-node
  4. Experimental top-level await
  5. Давайте вместо Node и Deno сделаем новый проект с встроенным leftpad — Endooo!
При использовании Deno разработчик больше не привязан к NPM.

И где же здесь удобство?! Если у пакета сотни зависимостей — все прописывать в import?!


В Deno можно использовать await где угодно, организуя таким образом ожидание поступления каких-нибудь результатов. Помещать await-конструкции в async-функции необязательно.

А вот это очень полезно!

А вот это очень полезно!
Уже есть в экспериментальном режиме в node.js
Все хорошо, но черно-белый логотип мне напоминает вот это:
image

"Когда в первый раз увидел JS после своего любимого <название языка>"

у меня наоборот, так было когда понадобилось по мелочи подпилить бэкенд питоновский
Может подождать полгода вместо перехода?

За эти полгода в Deno появится ещё куча фичей.


Кажется, сейчас суть в том, что Deno идёт по переднему краю платформы и там есть и всегда будет всё то, что в node добавлять нельзя хотя бы потому, что будут ныть любители легаси. Не в смысле легаси "ой, апи поменялось в новой ноде", а легаси фундаментальных подходов к использованию


А зачем на сервере window?

Чтобы вы могли скопипастить кусок кода, изначально написанного для работы в браузере, и использовать и там и там без изменений. Например, раньше какой-то рендеринг или вычисление делалось на клиенте, и вы решили перетащить его на сервер.

НЛО прилетело и опубликовало эту надпись здесь
Через пару лет, когда у deno будет свой легаси, пыл поубавится.

Тогда будет самое время придумать какой-нибудь edon.

И в спеках описан globalThis для написания кода как раз для разных движков.

в спеках-то он описан, но что делать с тонной программистов и их кода, которое ни про какие такие спеки не знает и продолжает использовать window. Если window есть, то всё это отлично работает


Можно примеры?

Легко. Приходим в Node и говорим, что JS файлы больше не обрабатываются, только TypeScript, кто не согласен — выметайтесь. Крик поднимется до небес.


пыл поубавится.

или не поубавится, потому что Deno — это площадка для экспериментов, и кто не согласен адаптироваться под новшества — идут на выход

Deno — это площадка для экспериментов
В таком случае ни один вменяемый разработчик не будет на нём строить свой production, и удел Deno — быть песочницей.
или не появится за эти пол года, пока еще не понятно
раньше какой-то рендеринг или вычисление делалось на клиенте

дернул сервис с chromeless да и все быстро отрендерилось как надо. Нафига это включать в ядро? Оно далеко не всем надо на беке. Выглядит сомнительно.
НЛО прилетело и опубликовало эту надпись здесь

Ну например (если речь про fetch) вы собираете запрос на другое АПИ, а у него свои правила, и приходится и в get параметры и в multipart/form-data, а тогда наличие URLSearchParams и FormData сильно упрощают работу. Конечно, для многих глобальных методов есть npm-пакеты, но многие не реализованы полностью.

window — для ssr, наверно
для ssr нужен document, а не window :)
Хотя конечно, можно возразить, что в мире js обьектов — одно часть другого
Заголовок:
5 главных причин того, что JS-разработчики будут использовать Deno вместо Node
статья:
Станет ли Deno, в итоге, заменой Node? Возможно.
Вывод: заголовок кликбейтный.
А механизм import загружает модули в асинхронном режиме...

А как обеспечивается в редакторах автодополнение свойств, методов и пр., если модуль еще не загружен и неизвестно что там?

По старому доброму принципу, название увы не знаю. Один раз вбил какое-то слово ручками — дальше подставляй сколько хочешь.
НЛО прилетело и опубликовало эту надпись здесь
Один раз в сто лет появляется статья

Хабр: " теперь каждый день будут нам доказывать!!!"
НЛО прилетело и опубликовало эту надпись здесь

Скорее как пропаганда Svelte. Что в общем, недалеко от религии.

Причём здесь Svelt и почему именно он, a не те же React/Vue/Angular, у которых пропаганда в разы мощнее?

Не знаю, меня никто не склоняет (в виде статей) срочно переходить на React/Vue/Angular, но очень яростно это делают в статьях о Svelte без особых на то причин/киллер-фич. По крайней мере на Хабре.
Да, о тройке больше статей, но не агитационных.

Сколько статей про Svelte не читал, ни разу не видел, что "нужно срочно переходить на Svelte". И вообще я не очень понимаю, как можно склонить перейти на Svelt в статье? Рука с пистолетом из монитора вылезает что ли? =)


Да, о тройке больше статей, но не агитационных.

Серьёзно? Стоит написать в поисковике: "{ framework1 } vs { framework2 }" или "why { framework1 } is better than { framework2 }" (framework1 и framework2 — любой из "тройки"), так сразу море статей найдётся. А что же творилось на релизах первых версий… И ладно статьи, так ещё и куча конференций, на которых хотя бы кто-то один из "тройки", но будет обязательно.

Надо совместить deno со svetle

С той поделкой, которую автор пихает в любую жопу без спроса, $mol. Как раз будут два сапога пара — ненужный рантайм и никудышний фреймворк.

Да-да! $mol и deno, лучший фронтенд стек 3030 года
Ага. Можно ещё deno и node в твоём предложении местами поменять и будет ровно так же справедливо. И продолжаться это будет минимум до тех пор, пока люди так же однобоко будут мыслить.

Был я на докладе автора проекта. С его уст — это не замена node, пока еще все под вопросом. Он хочет решить ряд проблем которые лежат в основе node, но не стоит халиварить на тему node vs deno. Это по пока еще разные вещи.

Да, действительно давно пора добавить все эти вещи (ну разве что кроме импорта с линка, совсем не вижу плюсов) в ноду, но только ради этих фич, я не буду переходить, с проверенной в кровавых боях технологии, на темную лошадку. И я надеюсь, что польза для меня от этого проекта будет именно в том, что эти и другие интересные фичи в ноде появятся еще при нашей жизни, потому что конкуренция это хорошо.
Ts-node супер-мега-тормозной по сравнению node, натравленного на скомпилированные js-файлы. Время перезапуска даже для небольшого 100-тысячнт-строчного проекта просаживается раз этак в 3-5, что во время разработки очень актуально. А как в deno с этим?

ts-node нужен для разработки, а не для реальной эксплуатации.

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

Вы обратили внимание на момент, который почти все разработчики чувствуют, но мало кто рефлексирует: чем меньше по времени итерация «написал — запустил — посмотрел как работает или не работает», тем быстрее, легче и удобнее идет процесс разработки. REPL должен работать быстро. И у nodejs для этого есть сначала nodemon, а когда его начинает не хватать, есть более продвинутые механизмы (сброс кэшей модулей). И это настолько ускоряет и улучшает процесс разработки (по сравнению с многоминутными деплоями war-контейнеров, или многочасовыми компиляциями проектов на C++), что это можно сравнить только с той радостью, когда разработчики 15 лет назад начали пользоваться svn (git был написан уже после) и радовались, что «создание ветки — теперь очень дешевая и быстрая операция».

Никто в Java не деплоит уже многоминутные war-контейнеры. JavaEE официально сдохла, вместо неё JakartaEE, которая только набирает силу, и в Jakarta относятся к "многоминутным war" крайне отрицательно.


JVM умеет подсасывать изменения на лету, приложение не нужно перезапускать. Если писать в определённом стиле и с использованием Spring, процесс ещё более приятный, чем на Ноде, потому что после подгрузки нового кода у тебя не теряется shared mutable global state.


В смысле, я не спорю с идеей fast loop, а исключительно с тем, что вы тут обосрали Java и C++. Или мне только показалось, что это был наезд? Если так, сорри. (Хотя у C++ всё ещё плохо, но начиная со стандарта 2020 года там появились модули, и всё стало сильно лучше)

Извините, пожалуйста, если это выглядит как «обосрал». Я ничего такого не имел в виду, и пытался быть максимально корректным.

Если же по существу, то я в курсе, что в Java есть механизм hot swap (тот, который в Идее навешен на Ctrl-F10), и очень рад этому факту. А особенно круто, что можно в отладчике дропнуть фрейм, и придти уже в обновленный код. И таким образом значительной части «многоминутных деплоев» можно избежать. Но, насколько я понимаю, существуют ограничения JVM для этого подхода: нельзя менять сигнатуру методов или удалять их. Если вы, как эксперт по Java, подсветите этот момент (или, может быть, даже подскажете, как их можно обойти), буду признателен.

Абстрактно говоря, в API JVM есть интерфейсы и для изменения сигнатур методов.
Просто в самой распространённой JVM (HotSpot) по этим интерфейсам находится
throw new UnsupportedOperationException();


Есть другие реализации JVM (как правило, платные), где есть полноценная поддержка смены сигнатур методов (так как метод полностью определяется через сигнатуру, поддержка смены сигнатур это синоним поддержки добавления/удаления). Потому для ускорения цикла ставят на машины разработчиков эти альтернативные JVM, а в бой всё идёт на HotSpot.

Спасибо! Уже после того, как ответил на коммент, я нагуглил dcevm.github.io — как раз одна из таких JVM, которая умеет добавление / удаление методов. ИМХО это просто очень сильно упрощает разработку (хотя некоторые разработчики говорят, что им и дефолтного hot swap хватает). Последний релиз там под Java 11, и как-будто бы совсем свежий (май этого года), что радует, потому что проект не заброшен.

Ну вот я из таких, которым вполне хватает обычного hotswap. Приблизительно 95% моих потребностей закрываются именно им.
А вот поддержка только Java 11 у dcevm это непросто. Дело в том, что Java 11 — это сентябрь 2018-го, а актуальная версия нынче 14.

package-lock.json и прокси npm c кэшированием и проверками — это залог успешных билдов и ребилдов в ci/cd у ноды, а в дено это червь подсунутый в очередной зависимости только для продакшенфлоу билдера или рандомные ошибки сборки, потому что часть интернета опять полегла?
Спасибо, дайте два :)

кликбейт, спам и обман
import { moment } from "https://deno.land/x/moment/moment.ts"

Я не уверен что это хорошая идея. Ссылаться на последнюю версию библиотеки вот так, без страха и упрека — чревато ломающими апдейтами.

А хардкодить все версии зависимостей во всех файлах проекта, ну такое. Если у меня этот moment используется в 10 файлах в большом проекте, то в какой-то момент у меня неминуемо будет 10 разных версий moment.

У npm есть недостатки, конечно, но это знакомые, понятные недостатки.

Синтаксис URL:


https://deno.land/x/MODULE_NAME@BRANCH/SCRIPT.ts


Можно сделать бранчи по версиям, можно сделать бранч "stable", всё что угодно.
Строка импорта — это обычная строка, можно подсунуть туда имя нужного бранча интерполяцией, а само название бранча вписать в сеттинги.


И конечно, можно импортировать не с deno.land, а со своего собственного GitHub или CDN, на котором лежит истинно верный форк библиотеки. Возможно с вашими истинно верными патчами:


import { helloDeno } from "https://raw.githubusercontent.com/AbmSourav/deno-std/master/index.ts";
helloDeno()

А как потом во всем проекте обновить версию зависимости?

Как-нибудь так?


const moment = await import(`https://deno.land/x/moment@${Settings.Depenencies.MOMENT_VERSION}/moment.ts`)

Или например, можно сделать свою репу на гитхабе, запушить туда Moment и ссылаться на этут репу. При необходимости изменить версию во всём проекте — идёшь на Гитхаб и заливаешь по этому адресу другую версию. Всё.


Вообще, Deno же развивается полным ходом. Туда можно припилить всё, что угодно.

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

Ну, по моему это легко решится. Как только придёт необходимость появятся утилиты аля "deno-outdated" которые будут смотреть по всем файлам и выдадут список устаревших зависимостей для каждого модуля.

НЛО прилетело и опубликовало эту надпись здесь

Скорее будет использоваться файл deps.ts с реэкспортом:


export { moment } from `<URL>`;

И тут мы возвращаемся к файлам, где объявлены все зависимости.


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

А ничего, что вот этим Settings.Depenencies.MOMENT_VERSION вы фактически заново переизобрели package.json?

В принципе, можно создать файл dependency.ts и писать в нём:


export * as http from "https://deno.land/std@0.54.0/http/mod.ts";

В таком случае версию пакета придётся писать только в одном файле и обновить можно будет в нём же

Можно еще сделать статический файл, в котором указать эти версии, а загрузчик с учетом версионирования встроить в рантайм. Назвать это как-то типа dependency.json, или я не знаю, package.json.

НЛО прилетело и опубликовало эту надпись здесь

Напомнило фэнтези "Идущие в Ночь". Там у главной героини был боевой костюм типа скафандра, который расстегивался только у плечей, и снимать его было очень неудобно. Когда этот костюм выдавали, она поинтересовалась: "как же в нём срать" и получила ответ: "всё зависит от того, что ты чаще делаешь — дерешься или срёшь".


Вот и тут так. Всё зависит от того, что ты чаще делаешь — копипастишь какие-то URL с гитхаба на самую свежую версию либы, или с умом выбираешь стабильные версии.

С умом выбираешь стабильные версии раз и навсегда, и дублируешь их 100500 раз в каждом файлике?


DRY это не про deno?


Развитие продукта это не про deno?


Детерминированные билды это не про deno?

Я-то откуда знаю, что там про Deno, у меня имя не Райан Дал ;)


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


Я раньше программировал на Java и наелся всего этого дрожания над легаси, которое 20 лет работает без единого изменения. Лично мне гораздо удобней, чтобы у мнея было средство быстрого прототипирования, в котором о проблемах долгосрочной поддержки кода задумываться просто не нужно. Развалится — починим. Таков Путь.


То что я заметил в мире JS — разваливается обычно совершенно не от мифических ужасов с летфпадом, от которых тут все в шоке. А от того, что ты обновился на свежую не-LTS версию Ноды, которая вышла на прошлой неделе, а твои библиотеки ещё не обновились. Вот тут да, проблема.

Именно так) однако у вас всё ещё остаётся возможность использовать разные источники для пакетов ибо "децентрализованное хранилище пакетов". Конечно же в придачу и все вытекающие проблемы, вроде одного и того же пакета, что тянется разными зависимостями с разных урлов и т.д.

Вы правда считаете, что npm может ставить пакеты только из какого-то одного места, а не откуда угодно, включая кастомные npm-репозитории, git, локальную файловую систему, ssh, локальные tar.gz-архивы и удаленные tar.gz-архивы + бесконечное количество мест, добавляемых плагинами? Для многих путей, откуда npm может пакет поставить, даже URL нет, только URI от силы.


О какой централизации npm идет речь?

НЛО прилетело и опубликовало эту надпись здесь
Можно сделать бранчи по версиям, можно сделать бранч «stable», всё что угодно. Строка импорта — это обычная строка, можно подсунуть туда имя нужного бранча интерполяцией, а само название бранча вписать в сеттинги.

Принципиально ли это отличается от Git URLs as Dependencies в npm?

Вы, конечно правы. Но как мне видится идея в том, что у вас не весь ваш проект зависит от moment, а каждый отдельный модуль/файл зависит от moment конкретной версии. Я вижу в этом возможность очень легко переводить обновление зависимостей в проекте по частям.

И еще легче ловить крайне стремные баги, вызванные несовместимостью внутренних структур того же moment, которые не являются частью публичного API surface, при передаче их между разными файлами проекта. Ведь это так забавно — иметь в половине проекта объекты одной версии, а в другой половине объекты другой версии, с неопределенным поведением при их взаимодействии.


Или ограничим API каждого модуля строго JSONами?

Сильно типизированными DTO. Не уверен, что это шутка.

"ну да, ну да, пошел я нахер".

Как мне кажется, это уже вопрос архитектуры. Если есть два независимых модуля, то один не должен ломаться при изменении реализации второго. Главное чтобы возвращаемые структуры были идентичными. А если два "модуля" сильно связаны между собой, тогда здравый смысл подсказывает, что они должны использовать общую версию зависимостей.

Главное чтобы возвращаемые структуры были идентичными.

Вот это как раз никто и никому не обязан. В версии 1 будут одни приватные поля, в версии 2 другие. Так как приватные поля не являются частью публичного АПИ, авторы их могут менять даже в минорных версиях по своему усмотрению. Будет ли работать новый код со старыми полями? Будет ли работать старый код с новыми полями? Ответ очевиден всем, кроме апологетов deno.

С es-приватными полями будет работать, тк нельзя через один инстанс читать приватные поля другого инстанса того же класса.
«В Deno можно использовать await где угодно, организуя таким образом ожидание поступления каких-нибудь результатов» – top level await это немного не это. Вы совсем не разобрались что это за функция, и пользы от не много, просто маленький сахар в новом ES.

Ничего себе маленький сахарок.


Сейчас вот такое невозможно:


await Promise.resolve(console.log(''));
// → SyntaxError: await is only valid in async function

И приходится писать так:


(async function() {
  await Promise.resolve(console.log(''));
  // → 
}());

При этом, например, если ты пишешь какой-то скрипт для командной строки на JS, то у тебя половина кода состоит из async-await-ов, потому что весь код скрипта исключительно синхронный, выполняется в один поток, и с таким подходом 30% кода — это слова "async" и "await".

так top-level-await – позволяет не оборачивать await только в корне модуля (вне каких либо функций), в любой функции это уже не прокатит, ни о каких 30% кода даже близко речи нет. Ознакомьтесь пожалуйста внимательнее v8.dev/features/top-level-await
прям киллер фича, без iife- как без такой жить :) Сейчас как бы все логично, await вне асинхронной функции не имеет смысла.

Ещё как имеет, потому что все библиотеки имеют эвэйтовое API. Они не знают, что ты собираешься их использовать в одном треде.

Ну они имеют промисифицированное апи. И с ним await в синхронной функции работать в принципе никак не может, тогда ее нужно будет подменить неявно на асинхронную и эта неявность может поломать код, который писался как синхронный, но вдруг при дописывании await его куски внезапно стали работать в разных итерациях цикла событий, поломав логику с process.nextTick и т.д. Еще и потенциальные потери в производительности на анализе кода и модификации внутренних структур. И все ради того чтобы не явно не обернуть асинхронный участок кода в iife. Какое то хипстерское решение, в надежде перетянуть одеяло, не более.
Они не знают, что ты собираешься их использовать в одном треде.

Не знаю при чем тут треды… там тред один, не считая внутренних.

, тогда ее нужно будет подменить неявно на асинхронную

под "скриптом" я имею в виду то, для чего раньше использовали bash — всякая работа с файлами и запуском программ из командной строки. Или например, какие-то роботы, которые скрейпят чужие сайты в headless браузере. Или анализ данных и построение графиков в экселевском файле.


там у тебя нет асинхронности вообще. Каждую следующую строчку можно делать только если все предыдущие уже завершились. Как в баше и питоне, которые всё это и призвано заменить


ну и сейчас ты просто руками делаешь (async function() { }()), и дальше там скобочках происходит вообще весь текст скрипта. Туда же можно впилить верхнеуровневый try-catch. Получается прям аналог функции main из C++.


и дальше у тебя примерно каждая строчка в твоей программе начинается с await. Каждая. Ибо "промисифицированное апи" имеет каждая собака. Даже твой собственный код имеет такое апи, потому что ты писал его в предыдущем проекте для сервера, и там всё насквозь асинхронное.

Одно не понимаю. И что мешает сделать одну большую async функцию и вызывать её в таком скрипте? Зачем top level-то?

Очень утомляет каждый раз писать


(async () => {
  await fs.readFile();
})().catch(error => {
  console.error(error);
  process.exit(1);
});

В этой ситуации очень часто забывают про catch, а это важно.


С top-level await эти обертки становятся не нужны и работать намного проще.

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

В том и загвоздка, что это придется делать в каждом файле.


В случае приложения, сделать это в одном app.js не проблема, а вот делать это в каждом build-скрипте утомляет и легко ошибиться.

Поэтому и нужен не только top-level async, а everyting async. Это можно навертеть самостоятельно, конечно, есть же бабель и другие JS трансформаторы. Но это уже некий недостижимый уровнь для ситуации, когда тебе нужно наебашить тридцать скриптов за вечер — нет времени думать, делать надо.

НЛО прилетело и опубликовало эту надпись здесь
deno собирает весь проект в один большой бинарник, упаковывая все зависимости, поэтому если у вас есть бинарник — все будет работать. Это кмк главный его плюс а автор упустил этот момент.
Если deno будет на 20-30% быстрее то еще можно подумать о переходе, а так он ненужен и его место на свалке.
Придумали бы ECMAPromisesScript уже́, все эти асинки и авайты только глаза режут.
Чё бы не писáть
const {users} = fetch(URL).json();

Потому, что иногда имеет смысл ожидать результат позже


// Start downloading data in advance
const promise = fetch('/user')

// Do something very difficult and time consuming
heavy()

// Waiting for the data download to finish
const {user} = await promise

Или не ожидать результат вовсе


fetch('/signal') // No await
heavy()
Ну и зачем здесь await? И зачем вообще вводить переменную под fetch()? Я указываю, что хочу users, после heavy() здесь или в другом месте через глобальную переменную (прости господи).

Дальше холиварненько по теме промисов, но всё же.

Вызов функции fetch интерпретатор расценивает как явное применение асинхронности. А последующее await для передачи значения в переменную выглядит подобно разыменованию указателя.
В случаях, когда важен именно статус исполнения, пусть будет стоять promise.
const {users} = fetch('/users');

// просто некая конструкция для получения именно промиса по какой-то переменной
let {status} = promise users;
//или то же самое но в форме привычной объективации переменной в конкретный тип
let {status} = Promise(users);

Какая глупость написана.


Современные возможности JavaScript: ES-модули

используются дольше, чем существует deno.


Децентрализованное хранилище пакетов

будто npm не скачивает пакеты и не кэширует их в node_modules? или будто npm не дает ставить пакеты откуда угодно, включая приватные гит-репозитории, локальные файлы и записную книжку вашей бабушки.


наверное, скачивание пакета и запись его в кэш у deno как-то особенно быстрее, чем скачивание пакета и запись его в кэш у npm.


В Deno встроена поддержка TypeScript

в Node встроена поддержка любой версии Typescript, Flow, Hegel или еще неизобретенного тайпчекера с произвольными настройками.


Поддержка await за пределами асинхронных функций

Welcome to Node.js v12.16.2.
Type ".help" for more information.
> async function foo() { return "hello" }
undefined
> await foo()
'hello'
> 

Не говоря уже о том, что этой фиче сто лет в обед.


Доступ к браузерным API (Window, Fetch)

Ну конечно, ведь в ноде совершенно нет fetch, и никак не решен этот чудовищный недостаток. А вот зачем в ноде был бы нужен целиком DOM? Подозреваю, что авторы deno не осилили убрать из хромиума всю DOM-обвязку, поэтому сделали вид, что это фича.


Например, Deno, в своём стандартном виде, безопаснее.

Нет, конечно же.


В среде Deno можно выполнять Wasm-код,

Правда? https://nodejs.org/api/wasi.html


тут имеется множество встроенных библиотек.

Ну а у ноды стандартная библиотека пустая совершенно.




Пять с плюсом отличных причин не использовать deno. Очередная поделка, призванная собрать все костыли и грабли заново. Надеюсь на скорое удаление репозитория deno как очевидно неудачного эксперимента.

Разбор по пунктам хороший, но вот последнее предложение резковато. Очень хорошо, что есть конкурирующий проект, который подстегивает инновации и в node.js тоже, потому что им теперь есть куда терять пользователей.

Ах да, интереса ради проверил. В node 10.0.0, выпущенной 2 года назад, 1 мая 2018, поддержка top level await уже есть. Deno появился 13 мая 2018, и так за два года и не стал нужен хоть кому-то.

Судя по тексту, вы похоже не в курсе, что автор у node и deno один и тот же.

А каким образом это влияет на написанное? Глупость написал не автор deno, а автор этого поста. И то, что у автора ноды получилось в первый раз сделать что-то хорошее, не дает гарантий того, что у него это получится во второй раз. Вот, deno тому ярким примером — хуже только php.

Я сделал комментарий исходя из вот этого:
Подозреваю, что авторы deno не осилили убрать из хромиума всю DOM-обвязку, поэтому сделали вид, что это фича.
(кстати, при чем тут хромиум вообще?)

Заголовок у статьи конечно кликбейтный, но все-равно ваш комментарий звучит так, будто deno сейчас кто-то сильно пиарит как «убийцу» nodе.
По сути это эксперимент, посмотреть на реакцию js сообщества.
К ноде многие уже просто сильно привыкли, на начальных этапах тоже очень много вопросов возникало.
к примеру мне необходимо перенести проект (локальный сервис) на сервер без интернета. как он будет подтягивать библиотеки из репозитория?

Точно так же как и в случае с node: скачать все зависимости локально и закинуть на сервер папку с кэшем.

Только вот явно это не сделать, не так ли? Потому что импорт может произойти где угодно, включая вызов await import(generateSomeUrl()). А это значит, что нужно запустить где-то deno-поделку, дать поработать, собрать кэш, перебросить на сервер без интернета. Что исключает сборку артефактов на том же CI.


Мой нынешний проект работает как раз на airgapped серверах, где деплой выглядит следующим образом — специальный человек с флешкой проходит через сканирование сетчатки, после чего в пустой комнате с ноутбуком, подключенным к внутренней сети, сливает rpm-пакет на нужный сервер, забирает логи и уходит. Как собирать этот rpm, если "дать поделке поработать локально" не выйдет из-за того, что часть систем, к которым нужно подключаться, доступны только изнутри банка?


Правильно, никак.

Отдельная утилита, которая будет собирать запросы импорта от Дено-поделки и складывать в журнал для флешки. Затем человек-сетчатка сходит во внешнюю сеть, где другая утилита исполнит запросы импорта и сформирует кеш, для флешки. Повторять до полного удовлетворения Дено-поделки.

Так, как бы, и встроенными инструкциями такое возможно
https://deno.land/manual/linking_to_external_code/integrity_checking


Создаст список всех зависимостей:


deno cache --lock=lock.json --lock-write src/entry.ts

Скачает все зависимости и проверит каждую по хэшу


deno cache -r --lock=lock.json src/entry.ts

Но проблема с динамическими импортами действительно есть.

Поправьте если я заблуждаюсь, но в 14 версии ноды есть поддержка es модулей (без загрузки по url)

1. Современные возможности JavaScript: ES-модули

Указываем в package.json
{
  "type": "module"
}


И спокойно пишем
import fs from 'fs'
import myModule from './myModule.js'


В среде Deno пакеты импортируются с использованием URL.

Это что получается, надо во всех модулчх проекта импортировать на URL, а при переходе на новую версию искать все включения и каждый раз в куче файлов обновлять URL зависимости? А что делать, если у проекта несколько зависимостей, которые зависят от разных версий одной и той же библиотеке?

Мне видится в этом больше преимущество. Как я понимаю в этом и весь прикол, что у вас нет списка зависимостей на весь проект. А каждый ваш модуль/файл имеет собственный набор зависимостей. И вы можете спокойно изменять зависимости в одном модуле не боясь сломать все остальные.


Вот представьте ситуацию:
Вам пришла задача, сделать какую-то фичу. Для вас это не проблема, вы нашли библиотеку "А" и хотите её использовать. Но вот проблема — в проекте уже применяется библиотека "А" причем версии "0.0.1" в старом многолетнем legacy. Имея такую систему как у Deno, вы об этом вообще можете не думать. Старый модуль будет использовать свою версию, а вы можете использовать свою.

Решения для монореп есть и еще одно встроят в нпм в новых мажорных версиях

Разве они позволяют разным модулям (не разным приложениям/пакетам) иметь разные версии одной зависимости? Только если выносить модули в пакеты отдельные. А в JS/TS сейчас модулем является практически любой файл с кодом.

>Разве они позволяют разным модулям (не разным приложениям/пакетам) иметь разные версии одной зависимости
нет, а зачем оно надо? на уровне пакетов должно быть достаточно

Ну вот надо мне создать новый модуль для системы, вижу что есть в мире библиотека, которая мне поможет, причём особенно помогут новые фичи последней стабмльной версии. В идеальном мире я просто беру её для своего модуля и не парюсь. В реальном она уже может использоваться в проекте и версия будет, скорее всего, не последняя. У меня дилемма — использовать имеющуюся версию, дублируя в своём модуле код, который есть в последней (копипаст или велосипед — не суть), или обновить зависимость во всём проекте с большим риском вызвать кучу ошибок. Ну ещё вариант — оформить мой модуль как пакет, получив все "прелести" разработки в нескольких местах. Все варианты приводят к дополнительной работе и в фазах разработки и тестирования, и, главное в фазе поддержки и, даже, вывода из эксплуатации.

Принимать решение, потому что его быстрее делать как-то неправильно, это же не хотфикс в проде. Ну, мб мне конечно везет с работой, так как обычно такое не требовали.
Импорт модулей по ссылке — прямая дорога в ад, такое в продакш пускать нельзя
Deno: import { moment } from «deno.land/x/moment/moment.ts»
Проекты работающие на js без интернета: УУУУУуууу кайф, спасибо Node что живой!

А как бы вы поступилии в случае с Node?

Обычно заранее колеса выкачивают, но не в момент исполнения

Какая то фигня, не увидел сколько то значимых причин переходить на это…
но куча потенциальных проблем на лицо!

Для нативных аддонов Deno ещё хуже чем NodeJS. В ноде можно обращения от нативного модуля к обёртке над v8 сократить, а в Deno все данные через обёртку обязаны проходить.
Для серверных задач из-за этого минуса просто бесполезен за пределами тестовых поделок. Не думаю что этот пункт "ради безопасности" изменится в Deno.


Оба проекта губят производительность движка v8. Первый хотя бы меньше.


Синтаксический сахар меня мало интересует. Может быть кому-то он и нужен.

Deno это попытка автора node перепрыгнуть самого себя. У него талант выбирать и совмещать казалось бы несовместимые между собой технологии для получения бомбического результата. Во всяком случае, один раз это ему сделать удалось.

Deno не является решением для продакшена и в этом смысле он не конкурент для node. Это proof of concept. По сути, маркетинг проекта больше направлен на то, чтобы найти энтузиастов и единомышленников для исследования возможностей предложенной архитектуры.
Очевидно, что автору просто TS нравится больше, чем js. Он написал себе «node.js с ts» и пытается придумать какие-нибудь ещё отличительные черты, которые кто-нибудь может посчитать преимуществом.
Слишком много внимания и громких заявлений ни о чём

Он сначала написал себе node.js, а потом уже node.js с ts

Потом напишет node.js с 1С. И вроде понятно, что это — история на любителя, но «5 причин того, что JS-разработчики будут использовать node1C вместо node» будут появляться и вызывать такие же бурные обсуждения :)

Так и сама node.js — история на любителя. "5 причин того, что бєкенд-разработчики будут использовать node,js вместо их любимых PHP/Python/Ruby/Java/C#/C++/..." куда более бурные обсуждения вызывали :)


А автор уже показал свою способность делать то, что востребовано очень многими. Вот недавно при смене проекта, узнал, что большинство вакансий "Фуллстэк разработчик" (без указания чегото-то типа PHP или Java) теперь подразумевают JS/TS на фронте и бэке — это буквально за год картина на рынке изменилась.

НЛО прилетело и опубликовало эту надпись здесь
Сильно зависит от кода. Deno это отдельный рантайм со специфичным API. Разница того же порядка как между node и браузером. Народ пытается запилить адаптеры для совместимости с разными частями инфраструктуры node, но это все пока на очень ранней стадии.
НЛО прилетело и опубликовало эту надпись здесь
Когда вижу статью про какую-то новую технологию, первым делом захожу в коменты посмотреть мнение экспертов, а потом уже читаю статью
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий