3 195
Subscribers
No data24 hours
-47 days
-230 days
Posts Archive
3 195
Как уменьшить потребление памяти во время 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 секунд.3 195
Зачем нужен тип "true" в TypeScript?
#typescript #worth_seeing
Докладчик сегодняшнего видео, Андрей Старовойт делает поддержку TypeScript в продуктах JetBrains. За что ему низкий поклон. Лучше него как работает TypeScript понимают только инженеры из Microsoft, которые собственно делают TypeScript.
В своем докладе Андрей рассказывает как работает литеральные типы, показывает некоторые TS паттерны и объясняет почему стоит явно указывать тип возвращаемого значения функции.
3 195
Среди 80 участников розыгрыша удача улыбнулась: @Vlod_R, @habiiev, @ShGKme!
🎉🎉🎉 Поздравляем!
В ближайшее время с вами свяжется менеджер конференции и поможет оформить ваши билеты.
3 195
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
До встречи на конференции!3 195
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.
3 195
Что такое 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;
}3 195
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
Присоединяйтесь послушать или задать свой вопрос.3 195
Как документировать логику?
#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.3 195
Как запускать 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'3 195
Как использовать 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.
Выбирайте решение на правильном уровне!3 195
Что такое 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-events3 195
How to Build and Run Node Apps with Docker and Compose
#worth_seeing #docker
Доклад с прошлого DockerCon. Он особенно полезен для начинающих #nodejs разработчиков. Если вы опытный разработчик, то рекомендую посмотреть весь плейлист, откуда взят этот доклад.
3 195
Подборка 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 провайдеров
3 195
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());
};3 195
Вы заметили в вашем Docker Desktop вкладку Dev Environments? Там пока нет ничего кроме интро видео. Мы узнаем детали 27 мая на DockerCon Live 2021.
➡️ Бесплатная регистрация
#conference #docker #freebies
3 195
Почему разработчикам необходимо знать 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-sdk3 195
Обзор 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.3 195
Как померять время выполнения команды в терминале?
#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'