Node.js Recipes – Telegram
Node.js Recipes
3.23K subscribers
167 photos
7 videos
1 file
612 links
По буднях нотатки по #Nodejs розробці, по вихідним огляди конференцій та доповідей (с) @galkin_nikita
Download Telegram
Подборка node.recipes за апрель 2021
#monthly_list

Рецепты для #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 провайдеров
Node.js Recipes pinned «Подборка node.recipes за апрель 2021 #monthly_list Рецепты для #nodejs разработчиков: ➡️ Когда можно считать, что вышла новая версия Node.js? ➡️ Как правильно настроить TypeScript в Node.js проекте? ➡️ Как исправить код в node_modules? ➡️ Как протестировать…»
How to Build and Run Node Apps with Docker and Compose
#worth_seeing #docker

Доклад с прошлого DockerCon. Он особенно полезен для начинающих #nodejs разработчиков. Если вы опытный разработчик, то рекомендую посмотреть весь плейлист, откуда взят этот доклад.
Что такое 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
👍1
​​Как использовать 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.

Выбирайте решение на правильном уровне!
Как запускать Node.js с доп. аргументами?
#nodejs_api #devops

При запуске #nodejs бывает необходимо передать дополнительные аргументы. Примеры:
➡️ node --no-warnings app.js
➡️ node --noscript='MyApp' app.js
➡️ node --require dotenv/config app.js
Полный перечень аргументов и их использование в документации CLI.

Стоит знать об переменной окружения NODE_OPTIONS. Любые значения из нее Node.js добавляет в перечень аргументов. На одном из проектов мы включаем DataDog вот таким образом: NODE_OPTIONS='--require dd-trace/init'
Как документировать логику?
#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.
👍1
Live stream scheduled for
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

Присоединяйтесь послушать или задать свой вопрос.
Что такое 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
➡️ в typenoscript-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 @typenoscript-eslint/no-floating-promises
sendConfirmationEmail(user)
.catch(err => logger({err, user},
'Error during sending confirmation email');
return user;
}
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.
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

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

Докладчик сегодняшнего видео, Андрей Старовойт делает поддержку TypeScript в продуктах JetBrains. За что ему низкий поклон. Лучше него как работает TypeScript понимают только инженеры из Microsoft, которые собственно делают TypeScript.

В своем докладе Андрей рассказывает как работает литеральные типы, показывает некоторые TS паттерны и объясняет почему стоит явно указывать тип возвращаемого значения функции.
Live stream scheduled for
Как уменьшить потребление памяти во время TypeScript компиляции?
#typenoscript #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 секунд.
👍1
Voice Chat #1, Что там на рынке? 13 Мая 21:00-22:00
#announcement #voice_chat

В этот четверг состоится Voice Chat c Кулаковой Алесей, Business Development & Account Manager в рекрутинговом агентстве Indigo Tech Recruiters.

Мнение с обоих стороны – и кандидата, и агенства на вопросы:
Какая сейчас ситуация на рынке #nodejs разработки?
Как и почему меняется рынок, что на это влияет?
На что смотрят клиенты и за что платят?
Почему все интервью с рекрутерами такие одинаковые?

Готовьте вопросы и подключайтесь, потому что Алеся шарит.
Node.js Recipes pinned «Voice Chat #1, Что там на рынке? 13 Мая 21:00-22:00 #announcement #voice_chat В этот четверг состоится Voice Chat c Кулаковой Алесей, Business Development & Account Manager в рекрутинговом агентстве Indigo Tech Recruiters. Мнение с обоих стороны – и кандидата…»
MongoDB University
#freebies

Начинающие #nodejs разработчики обычно выбирают первой базой данных MongoDB. Упростить ее изучение позволяют MongoDB University. В настоящий момент в каталоге 14 курсов. 6 из них объединены в Developer Learning Path.

Курсы регулярно обновляются, устаревший закрываются, а прохождение организовано по когортам, как в coursera. По окончанию выдается бесплатный сертификат. Не путайте его с MongoDB сертификацией, которая стоит 150$ и включает в том числе бейдж. Платформа отлично подходит для обучения и я смело могу рекомендовать ее в план развития.
​​Что такое .npmrc и почему его стоит добавить?
#cli

У npm как и других #nodejs инструментов есть конфигурация через rc файл. Вы можете разместить .npmrc в папке проекта или в папке $HOME . Используйте npm config list, чтобы увидеть итоговую конфигурацию.

Полный перечень параметров в приведен документации. Рассмотрим те, которые стоит отключить:
➡️ update-notifier – регулярно показывает сообщение, что пора обновиться. Делать этого не стоит.
➡️ fund, выводит xx packages are looking for funding. Поддержите opensource и смело выключайте.
➡️ audit, после каждого npm install показывает сжатый security audit. После добавления npm audit в CI можно смело выключать.

Выключение всех этих параметров уменьшит количество бесполезных логов. Осталось изменить уровень loglevel с notice на error и получим .npmrc, который выводит в CI только важную информацию:
loglevel=error
fund=false
update-notifier=false
audit=false

В yarn-based проектах необходимо использовать .yarnnc. Он не заменяет, а дополняет .npmrc. Посмотреть результат конфигурации yarn config list
👍4