Comments 41
Благодарю! Очень полезно! А ссылки на грядущие вебинары будут здесь выложены?
Простите, но мне кажется что вы преувеличиваете. Node.js не считается платформой для малограмотных, и не могу понять откуда вывод о том что в него слабо проникают фундаментальные знания.
Особенно удивили временные рамки — 2012-2015 год это начало развития node.js.
Сложно представить что найдётся серьёзный продукт код которого не адаптировался.
Многие пишут не понимая даже что такое процесс, треды и общая память, и чем это светит например в тестах. Ну да ладно… Но у меня есть одна маленькая победа — все таки я смог донести до большинства в компании зачем нужен Dependency Injection =))
И хоть сам копаюсь в ноде довольно глубоко, даже с libuv играюсь в XCode, можно подробнее о «await блокирует event-loop»? Это же вроде просто сахар к промисам. И если операция асинхронная, то await отработает так же как и промис. Или вы о том когда разработчик делает async/await на синхронную функцию и ожидает что функция волшебным образом станет асинхронной?
Вот переедем на десятую ноду, сколько новых способов будет выстрелить себе в ногу… ну или голову =)
Просмотрел бегло лекцию. В принципе, проблема в том что люди думают что промисы волшебным образом делают код асинхронным. А то что это итератор или любой другой сахар или фича — не важно. Под капотом тот же промис. И тут я думаю было бы очень полезно показать как работает современная версия евент лупа. Когда понимаешь на каком этапе работает тот или иной код, все встает на свои места.
Не хочу обидеть, но лекция больше похожа на объяснение методом научного тыка. Что не есть плохо, я тоже люблю как говорится «почувствовать». Но мне кажется что лекция не доносит почему так происходит. Мне вот этот чувак очень помог — blog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810
И тогда все очень логично получается, и понятно почему промисы а блокируют. Потому что так libuv написан. Никакой магии.
З.Ы.
По моему то что вы там реализовали можно сделать при помощи setImmediate
Посмотрел видео: очень сложно и навороченено. Почему не сделают как в C#:
- функция возвращает Task
- при вызове её через await она автоматом запускается в отдельном потоке.
Почему в JS нельзя так сделать?!
Потому что C# так, как вы написали, не работает.
при вызове её через await она автоматом запускается в отдельном потоке
Это неправда, запуск функции вообще никак не зависит от того, делался ли await задаче.
Вообще, в C# асинхронность работает почти так же, как и в Javascript. Единственная разница — в том, что очереди событий другие, и "разбирать" их могут несколько потоков одновременно. А, ну ещё некоторые продолжения выполняются синхронно.
Имею дело с легаси каждый день, и как-то так выходит, что исправлять баги в проектах, написанных не "фанатами" SOLID значительно проще.
Мы отказались от него в пользу модулей, которые сами по себе являются контейнерами, и для тестов используем jest моки.
Из-за этого из конструкторов и логики классов удалилось множество лишних вещей и сильно упростился код и типизация в TypeScript.
Мое мнение такое, что жест и други кастыли в виде rewire или proxyquire появились именно потому что код писали криво, а тестировать то хоть как-то хотелось. Мы в большом проекте говна нахавались, когда тесты падали тупо после изменений имени файла, порядка выполнения или количества кейсов. Потому что люди волшебными тулзами то мокали, то где то забывали, а память то общая… потом сиди 2 дня дебаж что бы понять где забыли вернуть состояние.
Нет, ну можно конечно запускать по процессу на файл, но тогда тесты у нас вместо 10 минут будут час бежать.
А также это помогает избежать очень неприятных багов в виде cycle dependency. Да и с синглтонами тоже жизнь та еще…
Да, согласен, DI без статики то еще удовольствие. Зато в тестах никакой магии. Часто даже к sinon обращаться не надо. Дактайпинг во всей красе.
Опять же, без фанатизма. Инжектить не значит что щас мы lodash будем пробрасывать. Но вот DAO, Repository, http, queue, db и т.д. инжектим.
Ну еще из плюсов, легче собирать из этих кубиков нужный функционал. А когда все друг другу require делают, система превращается в Big ball of mud.
Так же легче перетаскивать отдельный компоненты например в отдельный сервис.
У вас может быть другой опыт и мнение. Не претендую на истину, но вот вот как-то так…
З.Ы.
Хочу заметить речь не идет о DI фреймворках… их я тоже не очень люблю. Не люблю магию и implicitly. Но на вкус и цвет…
Я когда разбирался с сообществом увидел попытки натянуть предыдущий опыт разрабов на ноду, аля lavarel и общее непонимание ситуации технологий и неразбериху. А вот переосмысления предыдущего опыта фреймворков всех этих куч hapi, restify, koa и какая то экосистема мне встретилась только в Fastify. (10 нода минималка) Макаронникам я бы тоже не шибко доверял, маловато там народу по мне, но как-то там более менее все похоже на продукт и он продолжает развиваться.
А вы не думали что мнение что JS для малограмотных это не просто устаревший стереотип? Может действительно программисты на других языках знают то что не знают JS-ники?
Я веб оставил после того как посмотрел сколько срани попадает в node_modules в проекте уровня hello world.
Может это показатель плохой продуманности языка и тулчейна?
Сам цикл for..in, который не гарантирует порядок индексов для массивов
Пардон, а зачем вы используете for..in для итерации массивов? о_О
В таком случае непонятно почему вы относите это к "в JS переусложнена куча банальных вещей". for-in это просто очень старый механизм перебора ключей по объекту, включая его прототипы. Очень низкоуровневая по сути штука (в пределах JS, разумеется). Его просто нет резона тащить в код почти… всегда. Потому что это очень необычная задача, когда вам надо пролистать все ключи включая прототипные, да ещё и с особенностями из defineProperty.
В JS есть итераторы и цикл for-of. И я не уверен что его можно назвать переусложнённым. Он вроде простой как валенок.
Node.js в 2020: Выйди и зайди нормально