Node.js Recipes – Telegram
Node.js Recipes
3.23K subscribers
167 photos
7 videos
1 file
612 links
По буднях нотатки по #Nodejs розробці, по вихідним огляди конференцій та доповідей (с) @galkin_nikita
Download Telegram
Product 360: Payments by Wix 26-28 мая
#conference #freebies

➡️ 26-28 мая | 18:00-20:00
➡️ Онлайн, бесплатно
➡️ Регистрация 👉 https://bit.ly/Wix-Product-360

Компания WIX входит в топ-10 брендов IT-работодателей Украины. Внутри компании классная инженерная культура. В конце месяца будет эвент, где можно будет к ней приобщиться.

Программа:
∙ 26 мая — Разработка продукта по правилам Wix: от проблем пользователей к их решению;
∙ 27 мая — Разработка многостороннего продукта в стремительно меняющейся среде;
∙ 28 мая — A/B-тестирование: ешь, тестируй, люби - и так по кругу!

#nodejs разработчикам особенно будет интересен второй день, 27 мая. Инженеры Wix расскажут как они одновременно поддерживают большие нагрузки и 10+ версий продукта.
10 Things I Regret About Node.js by Ryan Dahl 
#worth_seeing

Сегодня доклад, у которого полмиллиона просмотров. Это неудивительно, ведь докладчик создатель Node.js Ryan Dahl. Первая половина доклада анализ допущенных ошибок во время создания #nodejs, вторая – продвижение Deno.

📕Slides
В чем проектировать структуру базы данных?
#service #database

Как известно, исправлять ошибки на этапе проектирование проще всего. Поэтому делайте дизайн структуры базы данных.

Вот подборка онлайн сервисов с удобной визуализацией и кодогенераций. Все они платные, но бесплатного тарифа хватает для фича дизайна.
➡️ SqlDBM – лучший функционал, активно развивается. Легко переключается режим просмотра.
➡️ drawsql.app – Очень простой и приятный интерфейс. Бесплатный план отлично подойдет для проекта до 15 таблиц.
➡️ dbdiagram.io – есть свой DSL, так называемый Database Markup Language. К сожалению, проект не развивается уже год.

Альтернативы, про которые не стоит забывать:
➡️ Дизайнить в SQL с последующей визуализацией в DataGrip или его аналоге.
➡️ Бумага и карандаш
👍1
Как понять запущен ли Node.js внутри Docker?
#nodejs_api #docker

Docker контейнеры созданы, чтобы запускать только один процесс. У этого процесса id всегда 1. Рекомендуемый запуск #nodejs:
ENTRYPOINT ["node", "src/index.js"]
Тогда на уровне кода легко проверить
const isDocker = process.pid === 1

Кроме айди текущего процесса (process.pid), у нас есть айди родительского процесса – process.ppid. Для стартового процесса он равен 0.

Если вы запускаете через npm run ..., то npm будет иметь pid=1 и являться родительским процессом для Node.js. Так делать не следует.

Возможные варианты использования:

1️⃣ При локальной разработке использовать человекочитаемые логи, а внутри Docker в формате json:
const pino = require('pino');
const logger = pino({ prettyPrint: process.pid !== 1 });
Требует pino-pretty.

2️⃣ Переходить в debug режим по нажатию ctrl+T.
if (process.pid !== 1) {
process.on('SIGINFO', () => {
require('inspector').open();
});
}
Это автоматизация для дебага запущенного процесса. Без нее сначала узнаем айди процесса через ctrl+T, а потом делаем kill -SIGUSR1 <pid>
Voice Chat #2, О тестирование, 20 Мая 21:00-22:00
#announcement #voice_chat

В этот четверг в гостях будет Хотемской Александр, независимый SDET контрактор с 10 летним опытом в автоматизации тестирования.

Обсудим такие вопросы:
Где граница обязаностей в работе разработчиков и тестировщиков? Кто отвечает за какие виды тестов?
Какие инструменты и для чего использовать?
Документация VS специкация. Кто и как должен ее вести?
Виды проектов и особенности их тестирования, подготовка данных для автотестов?
Какая связь у UUID и MD5?
#architecture

Вчера был опубликован types/node@14.17.0. Теперь typenoscript проекты могут использовать crypto.randomUUID, который возвращает 4-ую версию uuid. Отличный повод поговорить, что общего у MD5 и UUID.

MD5 это хэш файла и используется для проверки, что файл не был поврежден в ходе загрузки. UUID это случайный идентификатор вида 63f04799-4bc1-4101-be08-263306e7b6ae.

UUID имеет длину 128 бит и столь низкий шанс повтора, что его можно считать уникальным. Хеш MD5 тоже имеет длину 128 бит, но и не гарантирует уникальности, а только имеет низкую вероятность коллизии. Из-за наличия коллизий его часто критикуют, ведь он подвержен birthday-атаке.

На одном из проектов, с хранением видео файлов использовали MD5 для нахождения дубликатов и случайный UUID как первичный ключ в БД. То есть использовались два 128-ми битных ключа. Один хранился как uuid, второй как строка. Использование MD5 как UUID позволил сохранить структура данных такой же, но убрать информационную избыточность.

Вот пример кода:

export function md5_to_uuid(md5: string): string {
if (typeof md5 !== 'string') throw Error('md5 should be string');
if (!/^[a-f0-9]{32}$/.test(md5)) throw Error('Wrong md5 format');

return `${md5.substring(0, 8)}-${md5.substring(8, 12)}-${md5.substring(12, 16)}-${md5.substring(16, 20)}-${md5.substring(20)}`;
}

export function uuid_to_md5(uuid: string): string {
return uuid.replace(/-/g, '');
}

В завершение хочу сказать спасибо @Jek_Rock, за нахождение ошибок в первой версии рецепта.
Live stream scheduled for
Запуск GDG Cloud Kyiv
#announcement #cloud

В конце апреля я проводил Cloud Study Jam. Это был trail event. По его итогу открыли Google Developer Group Cloud Kyiv. Google помогает комьюнити доступом к различным ресурсам. У нас уже была Google Developer Group Kyiv, но там фокус не на Cloud.

Комьюнити создано, чтобы помочь инженерам в освоение Cloud Native подходов. Именно инженерам, без разделения на разработчиков и DevOps инженеров. Разработчикам нужно знать облачные инструменты, а DevOps инженерам особенности поддержки и разворачивания языков.

Ссылки на комьюнити:
🔗 Платформа: https://gdg.community.dev/gdg-cloud-kyiv/
🔗 Канал: https://news.1rj.ru/str/GDGCloudKyiv
🔗 Чат: https://news.1rj.ru/str/GDGCloudKyiv_chat

Первое мероприятие через неделю.
🎤 Cloud Study Jam: Build a Website on Google Cloud
📍 26 мая, 18:30-21:00
🔗 Регистрация
refactoring.guru
#code_pattern #typenoscript

В комментариях к код ревью считается хороший тоном оставлять ссылки на внешние ресурсы. Так коллега сможет быстрее понять, что ему рекомендуют. Помимо ссылок на документацию библиотек или #nodejs я оставляю ссылки на разделы refactoring.guru.

Там есть и паттерны проектирования, и советы по рефакторингу. Александр Швец сопровождает их хорошей визуализацией, переводами на разные языки и примерами кода, в том числе на TypeScript.
Audio
Voice Chat #2, About testing
#voice_chat

Гость: Хотемской Александр, независимый SDET контрактор с 10 летним опытом в автоматизации тестирования.

Вопросы:
Где граница обязаностей в работе разработчиков и тестировщиков? Кто отвечает за какие виды тестов?
Какие инструменты и для чего использовать?
Документация VS специкация. Кто и как должен ее вести?
Виды проектов и особенности их тестирования, подготовка данных для автотестов?

Ссылки, которые были озвучены:
🔗 Сервис для тестирования емейлов
🔗 Node.js митап
🔗
openapi-response-validator
🔗 GDG Cloud Kyiv
🔗 reqover для оценки coverage
🔗 Playlist "How test REST API" от Саши
🔗 playwright.dev модая либа для UI тестов
Как работает Readonly в TypeScript?
#typenoscript

В чистом JavaScript нельзя запретить изменение объектов и массивов без использования библиотек или просадки производительности.

В TypeScript для этого существует:
➡️ ключевое слово readonly в классе, интерфейсе или типе, которое запрещает изменение указанного свойства.
➡️ Readonly<Type> возвращает тип, у которого все свойства будут readonly
➡️ ReadonlyArray<Type> определяет типа массива, у которого запрещено изменение элементов
➡️ as const делает объект или массив неизменяемым

Данный синтаксис позволяет контролировать бизнес логику на этапе компиляции и не создает ухудшение перфоманса в run-time.

Однока следует помнить, что существует проблема: "Interface with readonly property is assignable to interface with mutable property" Пример:
interface MutableValue<T> { value: T; }
interface ImmutableValue<T> { readonly value: T; }
let i: ImmutableValue<string> = { value: "hi" };
i.value = "Excellent, I can't change it"; // compile-time error
let m: MutableValue<string> = i;
m.value = "Oh dear, I can change it";

Данная проблема известна уже 4 года и ее не планирую решать.
Serverless by Stefan Judis
#worth_seeing

Популярный вопрос среди новичков: "Как отправлять контактную форму с лендинга?". В своем докладе Stefan Judis показывает ответ на этот вопрос. Он использует #nodejs не как сервер, а как функцию.

В докладе я первый раз услышал термин JAFM stack, то есть JAM + Functions. Рекомендую его посмотреть, особенно если вы не работали с serverless.

📕Slides
Mo'Problems, Mo'Nads by Kyle Simpson
#worth_seeing

Кайл Симпсон – автор серии книг "You Don't Know JS". В сегодняшнем докладе он рассказывает о том, что такое монады. Кайл проводит аналогию монад и регулярных выражений. И то, и другое не является популярный при написание коммерческого кода. Такие приемы увеличивает когнитивную сложность кода, а ее следует упрощать. Поэтому Кайл неоднократно предупреждает, что монады могут быть плохим решением в некоторых случаях. Тем не менее знать о существование такого подхода стоит, хотя бы для общей эрудиции.
📕Slides
📕Functional Light JS
#announcement

15 июня выступаю с докладом об TDD в #nodejs. Это будет совместный доклад с Львовской компанией Sombra.

Доклад начинается с обзора типичной пирамиды тестирования для Node.js проекта. На каждом уровне расскажу лучшие TDD практики и покажу какие npm пакеты использую.

Участие бесплатно, а регистрация уже доступна:
🔗 Facebook: https://fb.me/e/XPqCaXEr
🔗 Restration Form: https://us02web.zoom.us/meeting/register/tZYvcu6gqzIuG9WgFmZUja4lP-5wlsYraKhu
Как итерировать массив?
#code_pattern

Проводя интервью, я практикую live coding, то есть решение простых задач со скриншарингом экрана. Так сразу видно пишет ли кандидат код на современном JavaScript.

Итерировать массив можно 4-мя способами:
1️⃣ for
for (let i = 0; i < arr.length; ++i) {
console.log(arr[i]);
}
2️⃣ forEach
arr.forEach((v, i) => console.log(v));
3️⃣ for in
for (let i in arr) {
console.log(arr[i]);
}
4️⃣ for of
for (const v of arr) {
console.log(v);
}

Упрощенный анализ показывают, что 1️⃣и 3️⃣ создают ненужную переменную, а 2️⃣– контекст ненужной функции. Поэтому при написание кода старайтесь использовать 4️⃣ for of.

Бенчмарки и глубокий анализ можно провести самостоятельно или нагуглить. Вместо этого я порекомендую добавить к себе в проект eslint правило disallow forEach. Это же можно сделать с помощью no-restricted-syntax и селектора CallExpression[callee.property.name="forEach"]
😁4🤯2
Как успевать за развитием web-development?
#announcement #discount #chrome

В современном веб-строе нужно постоянно учиться. Как говорила Алиса: "Нужно бежать из-за всех сил, чтобы оставаться на месте". Технологии, фреймворки, подходы появляются быстрее, чем ты успеваешь читать Release Notes. По моему скромному мнению, "виноваты" в этом разработчики браузеров. Они выпускают апдейты слишком часто. Вдумайтесь, Google Chrome с 3-го квартала 2021 перейдет с 6-недельного релиз цикла на 4-х недельный.

Один из моих способов бежать чуть быстрее – использовать для повседневной работы Beta Google Chrome Channel. В этом release channel версия Chrome идет с опережением на месяц. Это ведь круто, когда ты отлавливаешь ошибки вызванные изменение в браузерах на месяц раньше, чем они будут у пользователей?

Еще в моем списки ускорялок – слушать доклада с конференций и учиться у лучших. Один из таких это Виталий Фридман. Я буду проходить его воркшоп для Front-End разработчиков, который стартует в эту среду. Присоединяйтесь! Детали:
➡️ 5 дней в первой половине дня по 2.5 часа
➡️ контента на 1500 слайдов
➡️ возможность как задать вопросы в живую, так и посмотреть в записи
🤑 Промокод: node_recipes на 15%
🔗 Подробности: http://bit.ly/Vitaly-Friedman-2021
Live stream scheduled for
Voice Chat #3, About GraphQL, 27 Мая 21:00-22:00 (GMT+3)
#announcement #voice_chat

Гость: Павел Черторогов, евангелист GraphQL. Хоть он и не любит слово евангелист ))) Работает архитектором информационных систем в казахстанской хостинговой компании ps.kz. Занимается построением консли для управления облачными услугами.

Вопросы:
Что такое GraphQL? Где его стоит, а где не стоит применять?
Каков идеальный тех стэк для GraphQL проекта в 2021?
GraphQL паттерны – микросервисы, кодогенерация, федерация и т.д? Какие инструменты?
Как тестировать GraphQL проект?

Ссылка для подключения: https://news.1rj.ru/str/node_recipes?voicechat
До встречи в эфире!
Как и зачем проверить, что код запущен под нужной версий Node.js?
#nodejs_api

Использование свежих фич #nodejs или новых синтаксических конструкция языка приводит к тому, что ваше приложение не сможет работать под старой версий. Примеры:
➡️ crypto.randomUUID – свежая фича для нативной генерации UUID 4
➡️ Различное поведения Date в зависимости от версии V8. Пример
Поэтому стоит проверять версию и выкидывать не обработанное исключение, если код запущен под неверной версией. Делать это необходимо в entry-point файле, с которого идет запуск всего приложения.

Пример проверки только мажорной версии:
const nodeVersion = process.versions.node.split('.')[0];
if (nodeVersion !== '14') throw new Error(`App requires node.js version 14`);

Пример проверки всей версии:
const nodeVersion = process.versions.node;
if (nodeVersion !== '14.17.0') throw new Error(`App requires node.js version 14.17.0`);

Поле engines внутри package.json носит рекомендательный характер и не используется при запуске приложения ни через npm run noscripts, ни напрямую. При желание его можно использовать на уровне кода после require('./package.json'). В комментариях, есть пример от Александра.
Как автоматизировать работу с git?
#cli #git

У git есть малодокументированная возможность – external commands, то есть команды определенные пользователем. Упрощено говоря, git somename это алиас для команды git-somename.

Использовать можно так:
1️⃣ Смотрим зарегистрированные пути echo $PATH.
2️⃣ Выбираем папку из 1️⃣, где мы будем создавать команду.
3️⃣ Делаем файл с нашей команда git-done и таким контентом:
#!/usr/bin/env bash
DEFAULT_BRANCH=master
CURRENT_BRANCH=$(git branch | grep \* | cut -d ' ' -f2)
git checkout ${DEFAULT_BRANCH}
git pull
git branch -D ${CURRENT_BRANCH}
4️⃣ Делаем файл исполняемым chmod +x git-done

Так мы создали команду git done, которая удаляет активную ветку и переключает на master. У меня это команда еще передвигает текущую задачу в следующую колонку в Jira.

Обратите внимание на первую строчку #!/usr/bin/env bash, после #! (shebang) идет интепритатор. Для написания скрипта на #nodejs используется конструкция #!/usr/bin/env node

Можно установить один из готовых скриптов: npm install -g git-open. Он будет открывать текущую ветку в вашем репозитории. Подробности

Так же для проектов с GitHub рекомендую посмотреть cli.github.com