IF Developer
52 subscribers
2 photos
6 videos
91 links
Тут я делюсь своими мыслями, решениями насущных проблем, полезными ссылками, заметками и юморком.

Сам прожжен девелоперским 10+ лет опытом в frontend/backend и частично в mobile/desktop направлениях

P.S. Обратная связь со мной: @if_devlpr_feedback_bot
Download Telegram
Часто бывают ситуации, когда в React-приложении уже не хватает возможностей стандартного React Context + useState, но тянуть какой-то сторонний стейт-менеджер желания (и главное большой необходимости) нет. В статье ниже, реализован очень хороший пример своего легкого, удобного и расширяемого стора:

➡️ https://blog.bitsrc.io/streamlining-state-management-in-react-with-a-plugin-based-architecture-48aa9ba04abc

Внизу данной статьи приведены ссылки на самые популярные на сегодня стейт-менеджеры. От себя еще добавлю в список Jotai - нечто среднее между Zustard и Recoil. Он легковесный и простой в понимании:

https://jotai.org/

#react
Немного авторского лонгрида. Многие часто задаются желанием сделать архитектуру приложения более предсказуемой, а код читаемым, но не все знают инструментария для воплощения. Для JS/TS проектов есть несколько ESLint-плагинов, которые помогут реализовать желаемое.

Архитектура приложения:

eslint-plugin-boundaries
Гибкий и удобный плагин, для ограничения импорта элементов системы в соответсвии с задеваемыми настройками. Поможет держать организацию папок/файлов проекта под контролем. Возможностей много, настраивать можно как удобно на свой вкус и цвет.

Дополнительные плагины для архитектуры приложение с узким применением:
https://www.npmjs.com/package/eslint-plugin-hexagonal-architecture
https://www.npmjs.com/package/eslint-plugin-relations

Строгость кода:

eslint-plugin-sonarjs
Плагин, помогающий определить потенциально плохие участки кода. Правил много, не со всеми обязательно соглашаться, но основная часть будет очень полезна для чистоты проекта.

Красота кода:

Prettier + eslint-plugin-prettier (смотрите секцию Recommended Configuration для настройки с ESLint)

Избавляет от извечного холивара по поводу стилистика кода. Да, правил для кастомизации стилизации не сказать, что много, но их достаточно, чтобы код выглядел красиво и единообразно. Крайне желательно настраивать с пре-коммитом через husky + lint-staged, чтобы в репозиторий всегда улетал отформатированный код.

Самая простая конфигурация:

.husky/pre-commit:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

package.json:

{
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"git add"
]
}
}

eslint-plugin-import + @typescript-eslint/consistent-type-imports + sort-imports

Превращает бесформенную массу импортов в упорядоченный список.

Пример конфигурации, которую использую в своих проектах:

.eslintrs.js

{
rules: {
'@typescript-eslint/consistent-type-imports': 'error', // нужно для разделения на import и import type. Подробнее зачем вообще import/export type тут: https://stackoverflow.com/a/64243357
'sort-imports': [ // упорядочивает импортируемые значения. Подробнее тут: https://eslint.org/docs/latest/rules/sort-imports
'error',
{
ignoreDeclarationSort: true,
allowSeparatedGroups: true
}
],
'import/first': 'off', // отключено, т.к. правило перезатирается "import/order" ниже
'import/order': [ // собственно сортировка импортов, которая мне нравится
'error',
{
alphabetize: {
order: 'asc'
},
groups: [
['builtin', 'external'],
'internal',
['parent', 'object'],
['sibling', 'index'],
'type'
],
'newlines-between': 'always'
}
]
}
}

@cspell/eslint-plugin
Красивый код - это еще и грамматически верно написанный, поэтому проверка правописания необходима. Плагин в этом поможет. Можно добавить свой whitelist для специфичных слов. Есть минус - крайне сильно негативно влияет на скорость проверки ESLint, поэтому есть смысл вынести только на уровень CI и исправлять грамматически ошибки уже после CI-пробежки.

Пример базовой конфигурации для CI:

.eslintrs.js

const eslintConfiguration = {
// настройки
}

if (process.env.NODE_ENV === 'production') {
eslintConfiguration.overrides.push({
files: ['src/**/*'], // список файлов для проверки правописания
excludedFiles: ['src/**/*.stories.ts'], // исключения
plugins: ['@cspell'],
rules: {
'@cspell/spellchecker': [
'error',
{
customWordListFile: './spellcheck-whitelist.dict' // файл с исключениями. Имеет специальный формат. Побробнее тут: https://cspell.org/docs/dictionaries-custom/
}
]
}
});
}

return eslintConfiguration;

Stylelint
Не джаваскриптом едины - стилизация и структуризация нужны и для CSS. Stylelint поддерживает поддерживает как сам CSS, так и CSS-подобные (например, SASS/LESS), так же CSS-in-JS (например, styled-components, emotion). Заводится не без приключений, но оно того определенно стоит.

#javascript #typescript #eslint
Заключение:

Красота кода так же важна, как и те задачи, которые он решает. Не пренебрегайте и не доводите ваше детище до состояние одной сплошной нечитаемой массы 😄 Если у вас есть какие-то полезные плагины, то шарьте в комментариях - добавлю в текущий список

P.S. Если ESLint/Prettier набили вам оскомину и хочется попробовать что-то более “современное”, то ниже статья с альтернативами:

➡️  https://blog.logrocket.com/modern-faster-alternatives-eslint/

На мой взгляд, наиболее стабильный и быстроразвивающийся проект - это Rome. Сочетает в себе возможности ESLint + Prettier из коробки. Пока не такой богатый по правилам, как ESLint, но потенциал у проекта огромный
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Если захочется поиграться и запустить собственного ChatGPT-бота в Telegram, то можете начать экспериментировать на базе проекта:

➡️ https://github.com/karfly/chatgpt_telegram_bot

Там же автор указал ссылку на уже рабочий ChatGPT-бот https://t.me/chatgpt_karfly_bot для проверки возможностей (ограничение 2500 токенов бесплатно + с оплатой за доп.токены). На вопросы отвечает, контекст запоминает. Красота 😍

#chatgpt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
От сидячей работы спина часто начинает побаливать и доставлять дискомфорт. Ниже простой рецепт для снятия напряжения (да и руки крепче будут 😀):

➡️ https://youtube.com/shorts/PNFvCw3uygY
🔥4
Хорошая и подробная статья по логированию вашего node.js приложения с помощью Pino:

➡️ https://betterstack.com/community/guides/logging/how-to-install-setup-and-use-pino-to-log-node-js-applications/

От себя:
На сегодня Pino один самых (если не самый) богатых модулей для логирования по возможностям и поддержке. Есть множество транспортов (или источник куда писать залогированные данные) практически куда угодно. Список транспортов тут — https://github.com/pinojs/pino/blob/master/docs/transports.md. При желании/необходимости можно написать свой кастомный без особых проблем. Из альтернатив Pino можно выделить winston, bunyan и более молодой, но неплохой cabinjs

Если говорить в целом, то логирование критически необходимо, хотя многие считают это нудным занятием и в итоге на него забивают. Как минимум, нужно отлавливать все ошибки глобально и регистрировать их куда-нибудь централизованно. Из внешних сервисов мне нравится Bugsnag — он условно-бесплатный, но такой версии хватит большинству Proof-of-Сoncept и мелко-средних приложений. Аналоги — Sentry, Datadog, LogRocket и множество других (например, такие: https://www.atatus.com/blog/bugsnag-alternatives/). Если не хотите стороннее решение, то можно настроить Grafana Loki (открывается под VPN). Как пример такой настройки для Pino — https://skaug.dev/node-js-app-with-loki/.

Так что логируйте, не забивайте 😄

#nodejs #logging
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🕊1
Довольно старая, но всё еще актуальная статья про ошибку десятилетий - null:

➡️ https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/

Решение проблемы с null/undefined тоже приложено к статье. Если лень читать, то решение заключается в использовании специальной Maybe-монады или ее аналогов для не ФП-ориентированных языков (больше информации, что такое монада с примером Maybe на вики). Maybe выступает в роли обертки над значением, которое может быть null/undefined. Фактически мы объявляем новый тип, который может иметь реальное значение, либо его не будет. В относительно современных языках отдельного значения null может и отсутствовать как такового, например, как в Rust, Zig, Swift и т.д, и там как раз используется данный прием с Maybe (может называться по другому, например Option в Rust, но суть та же).

Касательно JS/TS, то, как по мне, то подход с Maybe сложно-применим, особенно с его введением в уже существующий проект. Да, помогает избавится от некоторых проблем, но это за счет существенного увеличения порога вхождения в проекта, т.к нужно изучать функциональных подход к решению задач. Для TS задачу проверки на null и undefined можно переложить на сам язык через конфигурацию:

tsconfig.json:
strictNullChecks: true (а лучше strict: true в целом)
noUncheckedIndexedAccess: true

Но если же ваш проект изначально использует (или вы планируете использовать) библиотеки с ФП-парадигмой такие как rxjs (из коробки фронтовый Angular и бекендовский Nestjs хорошо дружат с rxjs), ramda, lodash/fp или прям fp-ts, то подход выше может отлично вписаться

#general #fp
🔥2🤪2
Ниже очень подробная статья по популярным npm-модулям для создания интерактивных консольных утилит и их раскраски:

➡️ https://blog.kilpatrick.cloud/posts/node-cli-app-packages/

Еще подкину в список https://lars-waechter.gitbook.io/voici.js/ для форматирования консольных таблиц

#cli #nodejs
Достаточно подробный гайд от DataDog про то, как оптимизировать ресурсы окружения в Kubernetes, а соотвественно и финансовые расходы:

➡️ https://www.datadoghq.com/blog/rightsize-kubernetes-workloads/

Очень много слов на девопсовском, но если столкнетесь со схожей проблемой, то статья может сильно помочь

#kubernetes
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
За что мы любим дизайнеров:
🤣8😁1
Вышла новая мажорная версия node.js 20. В статье описаны основные значительные изменения и новые фичи:
Отличный набор статей по React Router:

➡️ https://www.robinwieruch.de/categories/react-router-6/

Закрывает насущные вопросы по использованию библиотеки:
- Вложенный роутинг
- Аутентификация и приватные роуты
- Правильный редирект
- Основные хуки
- Ленивая подгрузка через React.Suspense

#react
👍2
Базовое, но четкое, пояснение разницы между Message-Driven, Event-Driven и Streaming, т.к зачастую понятия путаются между собой:

➡️ https://www.alibabacloud.com/blog/an-analysis-of-the-basic-concept-of-message-driven-event-driven-and-streaming_599521

Так же в конце статьи приложены варианты специфицирования вашего событийного API. Для nestjs есть модуль nestjs-asyncapi для AsyncAPI

#general #event
👍4
Пролог: когда читал статью ниже, то по ходу дела возникали мысли, которыми хотел в итоге поделиться. И этих мыслей набралось столько, что пришлось разделить пост на две части 😄 Ниже представлена первая часть. Вторая выйдет на днях. И так-с…

Привез вам немножко лонгрида (там внутри статьи есть ссылки на другие связанные статьи, поэтому чтиво множиться в ширь еще больше):

➡️ https://www.spicyweb.dev/the-great-gaslighting-of-the-js-age/

Пересказывать не буду, т.к. лучше прочувствовать боль автора самому, но посыл такой - часто молодые (и не только) разработчики добровольно становятся заложниками одной/малого количества технологии (в статье на примере React) и считают ее идеалом/будущим/[любое восхитительное прилагательное]. Изучать что-то отличное от идеала у них большого желания нет и даже считают это вредным.

Проблема глубокая и может относится не только к React и не только к вебу, а к вообще любой любимой разработчиком технологии. Вкусовщина - очень плохое (и даже в некоторой степени губительное) качество разработчика. Да, могут быть технологии, которые ближе к сердцу, но они не должны влиять на объективность при принятии решений. Оценка и выбор конечных технологий должны идти от требований, сроков и уровня команды (в порядке важности).

Лично я сторонник мнения, что программист в первую очередь должен разбираться в общих принципах и подходах - это нужно для профессионализма, а уже конкретные технологии, как React - это нужно “для души”. Общие принципы и подходы не зависят от того, где их применять - веб, десктопная, мобильная, IoT, низкоуровневая и даже аппаратная разработка. В этом ценность такого программиста - огромная скорость адаптации к изменениям, а разработка ПО одна из наиболее динамичных сфер.

Во второй части раскрою детальнее, что значат эти “общие принципы и подходы”. Ждите… 😅
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥21
Хорошая подборка библиотек для карт на React и JavaScript в целом:

➡️ https://javascript.plainenglish.io/5-javascript-mapping-libraries-when-to-use-them-961ff6366d0b

От себя:
Доводилось использовать только Leaflet - отличная библиотека, удобная в использовании и богатая по функционалу. Но из подборки впечатлила react-map-gl - обязательно попробую
Немного о «мультипоточности» в node.js. Хорошая статья рассказывающая про основы worker_threads с примерами высокоуровневых оберток:

➡️ https://snyk.io/blog/node-js-multithreading-worker-threads-pros-cons/

От себя:
В node.js «настоящих» потоков вы не найдете, как не ищи. Но это ни плохо, ни хорошо - просто сам движок не подразумевает оных. Если нужно реальное распараллеливание на уровне ОС, то в конце статьи как раз приведены примеры популярных языков с их поддержкой: Java, C/C++, Rust и еще десятки аля C#, Go, Closure, Haskell и т.д.

Вообще, если интересно разобраться с процессами/потоками, то неплохая базовая статья с картинками ➡️ https://dev.to/kwereutosu/multi-threading-and-parallel-programming-1l9m
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Твоя команда: закрываете проект раньше дедлайна, заказчик максимально доволен
Твоё начальство:
😁6
Мой хороший друг и прекрасный девелопер предложил для канала отличную статью и свой комментарий к ней. Публикую как есть:

➡️ https://vas3k.blog/blog/ai_alignment/

Эта статья от Vas3k - настоящее чудо веселья и интереса, она обо всем: прошлом, настоящем и будущем ChatGPT. Однако, есть один вопрос, который волнует многих: заменит ли нас этот нейросетевой монстр в будущем? И если да, то когда? Неужели мы станем устаревшими, как старые добрые грамофоны? Или наши мозги будут все еще нужны для решения самых сложных задач? Может быть, ChatGPT будет лучшим другом и помощником человека? Давайте рассмотрим все эти вопросы с позитивной стороны и посмотрим, что нам готовит будущее вместе с нашими нейросетевыми товарищами!

Из статьи вы узнаете:
- кто такие "технобро"
- разницу между AI safety AI alignment
- Может ли себе ИИ ставить цели

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

От себя:
Вы тоже можете помочь развивать канал через бота обратной связи @if_devlpr_bot. Предлагайте любые темы, статьи, книги, мемасики, новые идеи, строгую критику и вообще всё что приходит на ум. Буду рад любому фидбеку и если расскажите и пошарите канал со своим коллегам/друзьям/знакомым. Заранее спасибо! 😘
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🙈1
Если ищите информацию про WebAssembly, то статья ниже точно для вас. Да, лонгрид, но и целый выходной впереди :)

➡️ https://thenewstack.io/will-javascript-become-the-most-popular-webassembly-language/

Статья крайне удачная и раскрывает тему не сколько про технические примеры «как» (про это подкину статейку https://www.yieldcode.blog/post/native-rust-wasm), а нужен ли вообще этот ваш WebAssembly (спойлер: нужен), почему JavaScript - это центр его вселенной, какие рабочие инструменты на сегодня уже есть и виденье будущего WASM в целом. В статье найдете большое количество ссылок на разного рода проекты, инициативы и рабочие библиотеки связанные с WebAssembly. Приятного прочтения 📖

P.S. https://youtu.be/RcHER-3gFXI - отличное вводное видео в WebAssembly от Google. Кратко пробегаются по основным топикам: что такое wasm, где применяется, его портируемость и скорость.

#javascript #webassembly
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
С 16й версии node.js добавили новый модуль node:test (stable с 20й версии). Название говорящее - модуль предназначен для написания тестов со стандартным набором функций, который можно найти в любом известном аналогичном модуле как mocha, chai, jest и т.д. Поэтому необходимость таких модулей фактически сводиться на нет.

Статья ниже про создание своего кастомного тест-репортера для node:test:

➡️ https://www.nearform.com/blog/writing-a-node-js-test-reporter/

#nodejs
👍2🔥1