en
Feedback
Node.js Recipes

Node.js Recipes

Open in Telegram
3 195
Subscribers
No data24 hours
-47 days
-230 days
Posts Archive
Как уменьшить потребление памяти во время TypeScript компиляции? #typescript #nestjs TL;DR Используйте skipLibCheck и понимайте import В чате @nest_ru задали вопрос "Сталкнулся с такой проблемой, nest не может сбилдить проект внутри докера на слабой машине с 1gb памяти". По умолчанию Nest.js использует TypeScript для сборки. При неправильной конфигурации он может требовать больше 1GB памяти. Расскажу об оптимизации из реального проекта с подобной проблемой. На каждом этапе оптимизации удалялся папка build как при сборке Docker-а потом запускалась команда tsc --diagnostics --project tsconfig.build.json, чтобы отследить метрики. 0️⃣ Начальное состояние: Memory used: 1006023K Total time: 17.70s 1️⃣ Проверяем в tsconfig.json включенный флага skipLibCheck. Его нет, это типичная ошибка. После включения: Memory used: 858580K Total time: 15.08s 2️⃣ Смотрим какие импорты библиотек можно упростить. Например, aws-sdk стоит 400Mb. На проекте она используется в одном файле. Делаем вот такой рефакторинг: import KinesisVideo from 'aws-sdk/clients/kinesisvideo'; import KinesisVideoSignalingChannels from 'aws-sdk/clients/kinesisvideosignalingchannels'; import type { AWSError } from 'aws-sdk/lib/error'; // import { AWSError, KinesisVideo, KinesisVideoSignalingChannels } from 'aws-sdk'; Memory used: 432743K Total time: 9.67s Таким образом мы сократили запуск затраты памяти в 2.3 раза и ускорили билд на 8 секунд.

Зачем нужен тип "true" в TypeScript? #typescript #worth_seeing Докладчик сегодняшнего видео, Андрей Старовойт делает поддержку TypeScript в продуктах JetBrains. За что ему низкий поклон. Лучше него как работает TypeScript понимают только инженеры из Microsoft, которые собственно делают TypeScript. В своем докладе Андрей рассказывает как работает литеральные типы, показывает некоторые TS паттерны и объясняет почему стоит явно указывать тип возвращаемого значения функции.

Среди 80 участников розыгрыша удача улыбнулась: @Vlod_R, @habiiev, @ShGKme! 🎉🎉🎉 Поздравляем! В ближайшее время с вами свяжется менеджер конференции и поможет оформить ваши билеты.

Dev.Pro JS Conference #conference #raffle 22-23 мая будет онлайн-конференция, где я буду выступать с докладом The Road to pro
Dev.Pro JS Conference #conference #raffle 22-23 мая будет онлайн-конференция, где я буду выступать с докладом The Road to production. Содержание доклада: ответы на вопросы, о которых нужно задумываться на разных этапах развития #nodejs проекта. Из докладов для себя я выделил: 👀 Minko Genchev, Tools for Fast Angular Applications, даже если вы не пишете на Angular этот докладчик стоит внимания. 👀 Hannes Obweger, Frontend Engineering at a Scale, доклад от того, кто реально понимает на личном опыте эту сложную тему. Так же будет два воркшопа: ⚙️ Тимур Шемсединов Node.js for Enterprise, часть контента уже была в рамках FWdays. ⚙️ Елена Жукова Stunning Performance Workshop, об оптимизации загрузки фронтенда. 🎤 Формат: онлайн с использование spatial.chat, лучшим инструментом для онлайн нетворкинга. ➡️ Регистрация: jsconf.dev.pro 💵 Цена: 450грн, промокод на 10% – NodeRecipes До встречи на конференции!

42 WebStorm Tips and Tricks #worth_seeing Сегодняшнее видео не доклад с конференции, а с вебинара. Оно полностью посвящено тому, как использовать WebStorm на полную мощность. Вот hotkey к функционалу, который реально ускоряет разработку: ⌥T – refactor for selected text ⌥⌘T – surround with ⌥⌘L – reformat Code ⇧⏎ – smart new line ⌥⌘⏎ – new line before current one ⌥↑ or ⌥↓ – change selection ⇧⌥↑ or ⇧⌥↓ – move lines Полезные ссылки по WebStorm: ➡️ ShortcutMapper ➡️ WebStorm Guide ➡️ Key Promoter X PS На холиварный вопрос "WebStorm или VisualStudioCode?" я отвечаю "не или, а и". Для DevOps задач – VS, для разработки – WebStorm.

Что такое Floating Promise и почему это опасно? #code_pattern #nodejs_api TL;DR Используйте no-floating-promises и unhandledRejection Floating (не отловленный, плавающий) promise как правило указывает на ошибку в коде. Если внутри Floating promise произойдет ошибка, то #nodejs процесс аварийно завершит работу. Для отлавливания таких событий существует unhandledRejection. Пример из документации: process.on('unhandledRejection', (reason, promise) => { console.log('Unhandled Rejection at:', promise, 'reason:', reason); }); Отлавливать Floating promise лучше не в run time, а с помощью линтера. Для этого существуют правила: ➡️ в eslint ➡️ в typescript-eslint ➡️ тут мог бы быть tslint, но его уже нельзя использовать. В определенных случаях, бизнес логика не требует ожидания завершения промиса. Тогда необходимо использовать комментарий в коде, указывающий линтеру игнорировать ошибку. Вот пример, когда REST не дожидается отправки емейла новому пользователю. import { usersRepository } from '~/repositories'; import { sendConfirmationEmail } from '~/services/notifications'; import logger from '~/logger'; // pseudo route handler export async function registerUser(data: newUserDTO): { const user = await usersRepository.create(data); // eslint-disable-next-line @typescript-eslint/no-floating-promises sendConfirmationEmail(user) .catch(err => logger({err, user}, 'Error during sending confirmation email'); return user; }

#voice_chat

Спасибо все участникам. Особенно @feed4rz, который тыкнул носом как сделать запись.

Voice Chat #0, сегодня 21:00-21:30 по Киеву #announcement #voice_chat В качестве эксперимента попробуем Q&A в Voice Chat формате. Отобранные вопросы из #nodejs чатов: ❓ребята, какие есть способы логирования кроме winston, cosole.log(), res.send() ??@nodejs_ru Что еще можно посмотреть или лучше даже почитать(имею в виду не книги, а может блоги какие-то хорошие) по ноде@nodeua Отвечать на вопросы на форумах - хорошая идея для подтягивания теории или практики?@nodejs_ru Присоединяйтесь послушать или задать свой вопрос.

Как документировать логику? #architecture #service Мало кто из #nodejs разработчиков пользуется UML диаграммами. А зря! Это о
Как документировать логику? #architecture #service Мало кто из #nodejs разработчиков пользуется UML диаграммами. А зря! Это очень наглядно и улучшает поддержку. Благодаря синтаксису PlantUML диаграммы можно не рисовать, а писать. Вот пример кода с картинки: @startuml Alice -> Bob: Authentication Request Bob --> Alice: Authentication Response Alice -> Bob: Another authentication Request Alice <-- Bob: another authentication Response @enduml Данный код описывает самую частую диаграмму – Sequence Diagram (последовательности). Есть и другие. За примерами прошу на сайт PlantUML. Диаграммы можно описывать как в отдельных .puml файлах, так и вставлять в JSDoc. Рекомендую хранить в git репозитории не только исходники, но и сгенерированные диаграммы. Это упростить изучение проекта. Для рендеринга можно использовать: ➡️ Расширение для JetBrains PlantUML integration ➡️ Расширение для Visual Code PlantUML ➡️ Онлайн версия В комментариях напомнили альтернативу на JS – mermaid.

Как запускать Node.js с доп. аргументами? #nodejs_api #devops При запуске #nodejs бывает необходимо передать дополнительные аргументы. Примеры: ➡️ node --no-warnings app.js ➡️ node --title='MyApp' app.js ➡️ node --require dotenv/config app.js Полный перечень аргументов и их использование в документации CLI. Стоит знать об переменной окружения NODE_OPTIONS. Любые значения из нее Node.js добавляет в перечень аргументов. На одном из проектов мы включаем DataDog вот таким образом: NODE_OPTIONS='--require dd-trace/init'

​​Как использовать cron в Node.js? #kubernetes #service #nestjs Есть много бизнес задач делать что-то по расписанию. Для этого используют утилиту cron, а расписание описывают crontab выражением. Пример: задача – отправлять отчет на емейл каждый день в 3 часа ночи, график – 0 3 * * *. Разобраться с crontab поможет сервис crontab.guru Реализовывать cron в #nodejs проекте можно по разному: ❌Cron вызов REST API. Потерян контроль, найти ошибку будет сложно. ❌Использование setInterval/setTimeout. Оставьте это авторам библиотек, сфокусируйтесь на бизнес домене. ⚠️На уровне кода cron можно реализовать одноименным пакетом. В Nest.js есть @nestjs/schedule. Стоить учесть, что только один Node.js процесс должен запускать cron, иначе приложение теряет масштабируемость. Решается введением master process. ✅ На уровне операционной системы. Встроенный OS cron будет вызывать Node.js как CLI утилиту. Хорошо в виртуальных машинах, противопоказано внутри Docker контейнеров (избегайте порождающих процессов). Для этого используем не библиотеку аля yargs, а cli-framework (см. clipanion и его аналоги). Для Nest.js есть пакеты nestjs-command и nestjs-console. ✅ Cloud Native подход. Зависит от облака и требуемого способа запуска (serverless или docker). Смотрим документацию облака и консультируемся с DevOps инженером. ✅Kubernetes native подход: ➡️Cron на уровне кода, но его запуск только в одной реплике. Используется StatefulSets, а мастер реплика определяется через _0 postfix. Подробней ➡️Cron на уровне кода, но вынесен в отдельный Deployment с одной репликой. ➡️Если же задачи ресурсоемкие, то правильно использовать CronJob. Выбирайте решение на правильном уровне!

Что такое Race Condition на клиенте? #architecture В одном из #nodejs чатов задали вопрос: "как думаете, норм использовать API для начальной подгрузки большого кол-ва контента, а socket.io для отправки на клиент единичных данных?" (c) Так делать не стоит. Состояние при таком подходе будет зависит от того, в каком порядке пришли сообщения. Это называется Race Condition. Чтобы такой ситуаций не было, необходимо использовать только один протокол для получения данных. Конкретный пример: вы делаете страницу Ethereum Blocks с live updates, получая начальные данные по REST и подпиской на обновления по WS. Клиент или теряет блок, или получить его дважды. Пускай скорость генерации блоков 1 в 13 секунд, а задержки данных между WS и REST 0.5 секунды. Расчет показывает, что есть 4% шанс не корректного поведения. Варианты решения: 👎 REST с запросами с setInterval – не верное архитектурное решение из-за повышенной нагрузки на сервер. Попытки решить через Etag 👍 WS с созданием подписки на требуемые обновления. В момент создания подписки сервер отдает текущее состояние ресурса. Необходимо предусмотреть переконект с учетом последнего сообщения и множественные подписки. 🔥 Server Sent Events создан именно для таких случаев. Имеет переподключение из коробки, а подписка определяется по URL. Требует HTTP2, чтобы избежать ограничения браузера в 4 соединения. Имеет разную реализацию в браузерах, что решается с помощью event-source-polyfill. Имеет поддержку в Nest.js, см. server-sent-events

How to Build and Run Node Apps with Docker and Compose #worth_seeing #docker Доклад с прошлого DockerCon. Он особенно полезен для начинающих #nodejs разработчиков. Если вы опытный разработчик, то рекомендую посмотреть весь плейлист, откуда взят этот доклад.

Подборка node.recipes за апрель 2021 Рецепты для #nodejs разработчиков: ➡️ Когда можно считать, что вышла новая версия Node.js? ➡️ Как правильно настроить TypeScript в Node.js проекте? ➡️ Как исправить код в node_modules? ➡️ Как протестировать webhook локально? ➡️ Как изменить timezone (часовой пояс) в Node.js? ➡️ Сравнение Nest.js и Koa.js с точки зрения бизнеса ➡️ Как конфигурировать Node.js приложение? ➡️ Как узнать ip пользователя в Node.js? ➡️ Как в Node.js узнать местоположение пользователя? ➡️ Какую версию npm использовать?  ➡️ Как правильно написать package.json в проекте? ➡️ Как узнать источник соединение в БД? ➡️ Как вывести в браузер сколько времени обрабатывался запрос на сервере? ➡️ Как померять время выполнения команды в терминале? ➡️ Обзор Node.js v16: AbortController ➡️ Почему разработчикам необходимо знать Cloud сервисы? freebies: 🤑 Как получить бесплатную Node.js сертификацию? 🤑 Free GitLab Certified Associate 🤑 Бесплатная месячная подписка на O'Reilly Доклады, которые стоит посмотреть: 👀 The Benefits of a “CLI First” Development Strategy 👀 Serverless Sockets for Real Time  👀 GraphQL Summit Worldwide 👀 Can we double HTTP client throughput? 👀 Кодстайл и насилие 👀 6 способов взломать твое JavaScript приложение Конференции, которые стоит посетить: 🎤 OpenJS World 2021 🎤 StrapiConf 🎤 Подборка конференций от Cloud провайдеров

Diagnostic Reports by Christopher Hiller #worth_seeing #nodejs_api Сегодня у нас доклад с Node+JS Interactive 2019. С 2020 года эту конференцию заменил OpenJS World (подробней тут). Доклад короткий, всего 20 минут. В нем Кристофер рассказывает зачем нужны Diagnostic Report и как использовать его утилиту report toolkit. Ссылки из доклада: ➡️ документация 📕 Slides 💻 утилита report toolkit В завершение, приведу пример как на Diagnostic Report  сделать аналог phpinfo(): exports.helloWorld = (req, res) => { res.status(200).send(process.report.getReport()); };

Вы заметили в вашем Docker Desktop вкладку Dev Environments? Там пока нет ничего кроме интро видео. Мы узнаем детали 27 мая н
Вы заметили в вашем Docker Desktop вкладку Dev Environments? Там пока нет ничего кроме интро видео. Мы узнаем детали 27 мая на DockerCon Live 2021. ➡️ Бесплатная регистрация #conference #docker #freebies

Почему разработчикам необходимо знать Cloud сервисы? #cloud В одном из #nodejs чатов прилетел вопрос "Подскажите, нужна либа которая из текста делает озвучку и сохраняет ее. Куда копать?" (c) Вот варианты решения задачи Text-To-Speach: 1️⃣Web Speech API, необходим запущенный браузера. 2️⃣Использовать Node.js только для запуска child_process. 3️⃣Vendor hosted, Использовать стороннего сервиса 4️⃣Cloud Native, т.е. использования сервисов предлагаемых облаком Когда бизнесу важна скорость выхода на рынок, то Cloud Native безусловный фаворит. Поэтому я бы рекомендовал начать с родного облака: ☁️ AWS предлагает Polly ☁️ GCP предлагает @google-cloud/text-to-speech ☁️ Azure предлагает microsoft-cognitiveservices-speech-sdk

Обзор Node.js v16: AbortController #nodejs_api 16-ой версия #nodejs даст нам нативный AbortController. Он создан для отмены выполнение Promise-based функций. Это аналог DOM AbortController, который отменяет fetch запросы. Ждем появления в коде и на собеседованиях abortable-функций. Уже сейчас SDK cloud-провайдеров (AWS, Azure, GCP) использует полифил. Пример кода: import { AbortController } from "@azure/abort-controller"; // create a controller and get its signal const controller = new AbortController(); const abortSignal = controller.signal; // pass the abortSignal into the API you want to cancel await blobClient.download({ abortSignal }) // then sometime later, cancel it! controller.abort(); Для полноценного перехода пока не хватает AbortError. Об это есть issue. Надеюсь ее закроют до выхода 16-й LTS.

​​Как померять время выполнения команды в терминале? #cli TL;DR Используйте hyperfine Стандартный способ померять время исполнения команды посредством time. Пример: time npm run build. Если time использовать в связке с curl, то можно узнать время выполнения запроса. Для такой задаче лучше подходит ab. Это сокращение от apache benchmark. Это команда отправляет не один запрос на указанный URL, а несколько. На основание результатов считаются статистики: средние, квартили и тп. Поэтому в название и есть benchmark. Пример: ab -n 10 http://localhost:3000/ Для оценки cli команд тоже есть benchmark. Называется hyperfine. Он может сравнивать несколько команд, делать прогрев или подготовку. Пример: hyperfine 'npm run build'. Его удобно использовать в извечном холиваре #nodejs разработчиков: yarn vs npm. Вот так можно сделать сравнение для вашего проекта: hyperfine --prepare 'rm -rf node_modules' 'yarn' 'npm install'