en
Feedback
Node.js Recipes

Node.js Recipes

Open in Telegram
3 195
Subscribers
No data24 hours
-47 days
-230 days
Posts Archive
Як «дрібні» донати допомагають бійцям Серед деяких людей існує думка що донати на невеликі волонтерські ініціативи не дають великого внеску в перемогу. Мовляв, нам західні партнери дають зброї на сотні мільйонів доларів, ось це має значення, а що там ваш збір корч? І взагалі, держава має платити, чого це громадяни повинні забезпечувати армію? Переконаний, що це неправильно. Дійсно, хімарси, 777, бойові машини та безпілотники які нам надають в рамках військової підтримки, значать дуже багато. Але не менше значить комфорт конкретного бійця у конкретному окопі. Кожна наша з вами витрачена гривня що йде на автівки, на амуніцію, на їжу, на спальники, на взуття, на грілки, на павербанки та екофлоу, на дрони, кожна наша гривня працює на фронті. Так, без 777 не буде точної роботи по позиціях кацапів, але коли цією 777 керують бійці що добре та смачно поїли, виспалися в теплі, вдягнені у комфортне та тепле взуття з одягом, а роботу коригують за допомогою мавіка — результат буде кращий ніж без цього всього. Кілька тижнів тому Капелан покликав нас з дружиною на тренінг по виживанню в умовах війни. Тренінг читав боєць, військовий. Він був досить довгий, але одна з речей, на яких робився наголос, це те що потрібно постійно дбати про комфорт та зручність. Навіть найменші покращення у побуті можуть радикально вплинути на боєздатність людини. Тому наші бійці мають мати найкращі сухпаї, найтепліші спальники, найзручніше взуття, тепловізори та нічники, легкі магазини, генератори, зарядні станції, та автівки, щоб це все возити на позиції. Тому аж поки моя робота дозволить поліпшити повсякденне життя та комфорт хоч одного бійця, я буду працювати для цього. Так, війна це чорна діра де щезають людські життя та матеріальні цінності. Так, буває таке що автівку купили, а через два тижні її вже посікло вщент, дрона збили, а в располагу бійців попали й погоріла вся амуніція. Але це війна. Якщо не ми їх, то вони нас. Тому я вибираю щоденну підтримку армії донатами та закликаю вас до того ж. На світлині боєць отримує тактичні навушники, на які ми з вами збирали через @Donate1024Bot. #війна permalink | @full_of_hatred 👇Щоденні донати💰на ЗСУ🪖 🫡@Donate1024Bot

Що таке Exclusion Constraint у Postgresql? #database Exclusion Constraint це тип обмеження, який дозволяє вказати, що значення в стовпці або наборі стовпців не повинні перекриватися зі значеннями в іншому стовпці або наборі стовпців. Це корисно для дотримання бізнес-правил або забезпечення цілісності даних. Наприклад, скажімо, у вас є таблиця, яка представляє календар, і ви хочете переконатися, що дві події не можуть бути заплановані одночасно. Ви можете додати до таблиці обмеження виключення, яке перевіряє час початку та завершення подій на наявність збігів. CREATE EXTENSION IF NOT EXISTS "btree_gist"; CREATE TABLE calendar (   id serial primary key,   user_id integer not null,   start_time timestamp without time zone,   end_time timestamp without time zone,   EXCLUDE USING gist (user_id with =, tsrange(start_time, end_time, '[)') with &&) ); У цьому прикладі ми використовуємо ключове слово EXCLUDE для створення Exclusion Constraint, яке перевіряє наявність перекриття між стовпцями start_time, end_time та user_id. Вираз USING gist повідомляє PostgreSQL використовувати метод індексу Generalized Search Tree (GiST) для забезпечення обмеження. Для цього нам допоможе btree-gist. Після створення таблиці ми можемо вставляти в неї рядки, але будь-яка спроба вставити рядок, який порушує обмеження виключення, призведе до помилки. Приклад: INSERT INTO calendar (user_id, start_time, end_time) VALUES (1, '2023-01-01 10:00:00', '2023-01-01 11:00:00'); INSERT INTO calendar (user_id, start_time, end_time) VALUES (1, '2023-01-01 10:30:00', '2023-01-01 11:30:00'); Варто зазначити, що Exclusion Constraint як і всякий сonstraint сповільнює вставку.

А ви вже ознайомилися з The State of JS 2022? Ось мої коментарі: 👉 Розділ Resources дуже корисний. Я додав більше 20 підписок на різні ресурси. У списку людей, кого читають, було приємно побачити Іллю Клімова. 👉 Результати розділу Libraries нерепрезентативні для Node.js розробників, бо була заміна категорії "back-end" на "Rendering Frameworks". JS це не тільки browser. 👉 Розділ Awards підштовхує до експерименту із заміни webpack у NestJS на Vite. 👉 Розділи Usage та Opinions тільки підкреслюють, що входити в розробку з кожним роком все важче і що TypeScript won.

Сьогодні хочу пропіарити вам Excalidraw. Це #service для малювання діаграм, які виглядають намальованими від руки. Минулого т
Сьогодні хочу пропіарити вам Excalidraw. Це #service для малювання діаграм, які виглядають намальованими від руки. Минулого тижня в блозі було описано огляд оновлень за 2022. Рекомендую прочитати. А ще це opensource, тобто ви можете використовувати його у своїх продуктах. Наприклад, його прикрутили для малювання архітектурних #gcp діаграм.

Як уникнути помилок під час створення email шаблону? #list Баги в емейлах дуже важко відтворити. Який емейл клієнт використовувався web/mobile/desktop? Цей сам лист чи його перенаправили? Проблема у шаблоні чи змінних?... Замість того, щоб вирішувати ці проблеми, я рекомендую робити правильно з самого початку: 1️⃣ За основу беремо шаблон з популярного сервісу, наприклад sendgrid 2️⃣ Всі рішення щодо верстки звіряємо з caniemail.com. Це аналог caniuse.com 3️⃣ Якщо шаблони зберігаються не в коді, а на сервісі для розсилки листів, то визначаємо, як будемо їх синхронізувати. Приклад AWS SES templates. Немає стандартних рішень, таких як міграція бази даних. 4️⃣ Перевіряємо не тільки html, але text версію листа.

Сьогодні вийшов реліз Node.js v18.13.0. #nodejs_api Цей мінорний реліз містить оновлює ICU (бібліотека для інтернаціоналізації) v71.1➡️v72.1. Якщо ваш застосунок використовує активно timezone, internationalization, etс, то це оновлення є breaking change. В цьому випадку краще використовувати system-icu. Зміна Time Zone Database 2022a➡️2022e означає правильний правопис нашої таймзони 🇺🇦 Europe/Kyiv Повний опис у блозі. Для нових Docker images чекаємо pull.

Всіх з наступившим Новим роком! Хай щастить, здоров'я всім вам та близьким! Переможемо 🇺🇦💪 Плани щодо контенту на 2023: 👉 200 рецептів на цьому каналі 👉 20 подій у @GDGCloudKyiv 👉 50 відео у https://www.youtube.com/@node_recipes 👉 10 виступів на конференціях 👉 4 курси на http://node.courses/

#wrapped Продовжую ділитися професійними підсумками 2022 року. Компанією року для мене є Fulcrum. Їхні розробники молодці – залучені та мотивовані. Для них щоп'ятниці протягом осені я проводив 4-годинний воркшоп. Я знаю, як важко управляти бізнесом, особливо в кризовий час, тому знімаю капелюх перед топ-менеджментом компанії. Відкритість у комунікаціях, підтримка співробітників та ЗСУ, швидкість прийняття рішень. Компанія повернула мені віру в те, що з українським бізнесом можна працювати.

Проривом року у 2022 для мене є GitHub Copilot. Я тестував його у червні, але тоді він тільки заважав. Успіх ChatGPT нагадав
Проривом року у 2022 для мене є GitHub Copilot.  Я тестував його у червні, але тоді він тільки заважав. Успіх ChatGPT нагадав мені об "AI для розробки". На цей раз Copilot показав свою користь, особливо на тестах. Рекомендую спробувати, адже GitHub дає двомісячний тріал. Для чистоти експерименту я спробував ще й tabnine, але він виявився не таким просунутим та дорожчим за Copilot.

Цей день настав 😉 Нарешті я запустив ютуб канал й записав перше відео. У мене була ідея робити велики відео (по 1-2 години) з зануренням в деталі, але зрозумів, що зараз на це не знайду часу, тому вирішив, що краще почну з чогось коротшого й з тим, що не вимагає монтажу. Вже є контент план на найближчі місяці - буду потрохи записувати й викладати. ВІДЕО: https://www.youtube.com/watch?v=wYkiKaT8whY Підписуйтесь! По темі відео залишайте коментарі на ютубі під відео. Як вам перше відео?

#wrapped Відкриттям року у 2022 для мене є Raycast. Це Spotlight, як він має бути для розробника. Raycast cам по собі вміє ба
#wrapped Відкриттям року у 2022 для мене є Raycast. Це Spotlight, як він має бути для розробника. Raycast cам по собі вміє багато, функціонал можна ще розширювати плагінами. SDK для цих плагінів написаний на JavaScript/React. Діліться в коментарях, які програми стали для вас відкриттям у 2022 році?

Нагадаю, що наступного року буде припинено підтримку 14 та 16 Node.js версій. 16 версія має підтримку на 7 місяців менше, ніж
Нагадаю, що наступного року буде припинено підтримку 14 та 16 Node.js версій. 16 версія має підтримку на 7 місяців менше, ніж звичайно. Таке рішення спричинене закінченням терміну підтримки OpenSSL 1.1.1. Детальніше тут

Які tsconfig файли створювати? #typescript Ще один рецепт з налаштування TypeScript. З допомогою --project можна визначити який файл з налаштуваннями використовувати. Приклад із одного з моїх проектів. "scripts": {   "build": "tsc --project tsconfig.build.json",   "test": "jest --config jest.config.ts",   "typecheck": "tsc --project tsconfig.json",   "watch": "tsc --project tsconfig.dev.json --watch"  }, У цьому проекті використовується 4 файли: 👉 tsconfig.json успадковується від @tsconfig. Від нього успадковуються всі інші. Використовується для перевірки типів у команді typecheck. 👉 tsconfig.build.json використовується під час збирання Docker image. Тільки він має "noEmit": false 👉 tsconfig.dev.json відключає правила, які зайві в процесі розробки або troubleshooting. Наприклад: "noUnusedLocals": false 👉 tsconfig.test.json використовується для тестів. Саме його я вказую у jest.config.ts Кількість файлів буде залежить від вашого проекту та й використовуваних процесів. Просто пам'ятайте налаштування можна міняти в залежності від контексту запуску TypeScript.

Якщо у вас не встановлен Chrome Extension JSON Viewer, рекомендую це зробити.

Підняв нотатки річної давності. У цей час у сусідньому відділі відбувалося звільнення розробника. Він мав відмінне резюме та понад 20 років досвіду, але не розумів, що робив. Вічний Junior. Він був найнятий у США, тому ми пропрацювали понад рік. Цей час допоміг мені навчитися: 👉 не боятися поставити свій тикет у blocked by; 👉 давати sandwich feedback (must have у американському середовищі); 👉 тримати документацію в актуальному стані, щоб не писати ті самі речі в код-ревью, а можна було просто посилатися на неї; 👉 лагодити зламане локальне оточення за допомогою history; 👉 відновлювати віддалені commit-и за допомогою git reflog. Мораль цієї історії: розробник повинен вміти налаштувати/полагодити своє локальне оточення. У цьому йому допоможуть history та git reflog.

Для покращення читабельності великих файлів варто підказувати вашому редактору. У WebStorm цього використовується Custom folding regions. Плагін-аналог для Visual Studio Code – #region folding for VS Code.

Шкідливі поради про залежності #npm ⚠️ npm install займає багато часу, тому зберігайте node_modules в git. ⚠️ Для зміни залежностей редагуйте package.json. Так, у вас більше буде у виборі версії. Її краще вказувати * або latest ⚠️ Додайте до .gitignore package-lock.json/yarn.lock, це зменшить кількість git конфліктів. ⚠️ Економте місце за рахунок глобальної встановлення популярних залежностей: npm install -g lodash babel typescript ⚠️ Якщо ви перестали використовувати залежність, то не видаляйте її з package.json. Можливо вона десь ще використовується. ⚠️ Ігноруйте повідомлення під час npm install. Усі ці deprecated warnings і npm audit report це лише зайва витрата часу. ⚠️ Не використовуйте devDependencies/optionalDependencies – вони так само, як і NODE_ENV, застаріли.

SourceCode #code_only #typescript
SourceCode #code_only #typescript

Як використовувати npm ls? #npm Команда npm ls виводить версії пакетів та їх залежності. Формат виведення деревоподібна. Причому дерево будуватиметься на основі логічних зв'язків, а не фізичного розташування пакетів у node_modules. Глибина дерева визначається параметром depth. Приклади використання: 👉 npm ls – покаже лише безпосередні залежності. 👉 npm ls --all – покаже лише всі залежності на будь-якому рівні. 👉 npm ls -g – покаже список глобально встановлених пакетів. 👉 npm ls axios – покаже дерево для пакет axios. Має зрозуміліший вигляд, ніж npm explain.

Як користуватися промісіфікованими таймерами? #nodejs_api У Node.js v16 змінилися принципи роботи з таймерами: додано timers/promises аналогічно fs/promises. Розглянемо best practices по роботі з ними: 1️⃣ Як підключати? Ось приклад поганого коду: import { setTimeout } from 'timers/promises'; Тут ми робимо variables shadowing, так як перевизначаємо в поточному файлі однойменну глобальну змінну setTimeout. А ще імена built-in модулів краще писати з префіксом node:. Тобто гарний код: import { setTimeout as wait } from 'timers/promises'; 2️⃣ Коли який таймер використовувати? 👉 Найчастіше використовується промісіфікований setTimeout. За допомогою нього реалізується затримка виконання. 👉 За допомогою промісіфікованого setImmediate створюється AsyncIterable. Приклад: for await (const startTime of setInterval(100, Date.now())) { if ((Date.now() - startTime) > 1000) break; // some logic } 👉 setImmediate використовується щоб розблокувати EventLoop. Приклад 3️⃣ Порівняння з callback таймерами 👉 callback-based доступні глобально, а промісіфіковані потрібно імпортувати. 👉 У обох випадках використовується ref, щоб визначити чи буде таймер тримати event loop активним 👉 Скасування в callback-based відбувається через clearTimeout (і його аналоги), а у промісіфікованого через AbortController. 👉 В callback-based таймерах ми можемо передати аргументи для хендлера, а промісіфікований можна сказати, яке значення буде повертати проміс. 4️⃣ Ще раз про колізії імен Мені не подобається, що імена в callback і промісах версій співпадають. Це не створює проблем у модулі fs, так як його методи не доступні глобально, але в таймерах це ускладнює підтримку коду. Як альтернативу я рекомендую використовувати об'єкт scheduler. Виглядає це так import { scheduler } from 'node:timers/promises'; await scheduler.wait(100); Його додали у лютому 2022 року з флагом experimental. Аналіз коду показує, що всі його методи це синтаксичний сахар: 👉 scheduler.yield() це теж саме що setImmediate() без аргументів. 👉 scheduler.wait(delay, options) це теж саме що setTimeout(delay, undefined, options) за винятком того, що опція ref не підтримується.