npm 12, TypeScript 7.0 и Bun на Rust
Выкатили npm 12 — install-скрипты теперь выключены по дефолту. Сломов дофига, так что сперва лучше проапгрейдиться до 11.18.0. GitHub
Финальный TypeScript 7.0 — на Go и «в 10 раз быстрее». Но полный API пока не докрутили, поэтому многие советуют пока не слезать с 6.0.
Bun переехал с Zig на Rust — автор выкатил полный репортаж о том, как портировал рантайм. Кучу инстансов Claude Code припахали, суммарно сожгли ~$165k по API-ценам. Rust-версия станет базой для Bun 1.4, его ждут с часу на час. Jarred Sumner
Node.js 26.5.0 — заимпортили текстовые файлы в ES-модулях через import attributes и blob.textStream().
👉 Node.JS [ru]
Выкатили npm 12 — install-скрипты теперь выключены по дефолту. Сломов дофига, так что сперва лучше проапгрейдиться до 11.18.0. GitHub
Финальный TypeScript 7.0 — на Go и «в 10 раз быстрее». Но полный API пока не докрутили, поэтому многие советуют пока не слезать с 6.0.
Bun переехал с Zig на Rust — автор выкатил полный репортаж о том, как портировал рантайм. Кучу инстансов Claude Code припахали, суммарно сожгли ~$165k по API-ценам. Rust-версия станет базой для Bun 1.4, его ждут с часу на час. Jarred Sumner
Node.js 26.5.0 — заимпортили текстовые файлы в ES-модулях через import attributes и blob.textStream().
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👍2
Неявное зависание Promise.all при отмене AsyncIterator через AbortController
Вы используете
Как возникает утечка
Когда
Диагностика на практике
Добавьте в конец
Совет по исправлению
Всегда оборачивайте тело асинхронного генератора в
Вывод: Каждый
Вы используете
for await...of с асинхронным генератором и AbortController для отмены. Кажется, всё чисто, но Promise.all зависает намертво. Проблема в том, что вызов abort() вызывает return() генератора, но если внутри остался незавершённый промис (таймер, подписка, поток), он просто висит, и Promise.all никогда не завершится.Как возникает утечка
Когда
abort() срабатывает внутри for await...of, итератор завершается. Но если в генераторе есть запущенный, но не завершённый setInterval, await на потоке данных или подписка на событие, этот промис остаётся висеть в памяти. Например, генератор каждую секунду отправляет данные, а при abort обработчик завершает итерацию, но не очищает таймер. Promise.all ждёт этот таймер вечно.Диагностика на практике
Добавьте в конец
return() генератора console.log('return called'). Если return вызывается, а Promise.all не завершается — ищите, какой ресурс утекает. Используйте обёртку с таймаутом: Promise.race([Promise.all(...), AbortSignal.timeout(5000)]). В продакшне это спасёт от вечного ожидания, но не решит корень проблемы.Совет по исправлению
Всегда оборачивайте тело асинхронного генератора в
try/finally. В finally явно очищайте все ресурсы: удаляйте слушатели, отменяйте таймеры, разрешайте ожидающие промисы. Например, если внутри генератора есть setInterval:async function* gen(signal) {
const timer = setInterval(() => {}, 1000);
try {
while (!signal.aborted) {
await new Promise(r => setTimeout(r, 100));
yield data;
}
} finally {
clearInterval(timer);
}
}Вывод: Каждый
yield и await в асинхронном генераторе должен быть гарантированно завершён до конца итерации, иначе return() не прервёт внутренние промисы, что приведёт к невосстанавливаемому зависанию.❤1👍1
MinIO, MongoDB, PostgreSQL для хранения 25 лет истории стоимости акций
💾 Когда ты строишь эмулятор для проверки торговой стратегии — 20 акций, 25 лет поминутных данных — выбор хранилища превращается в головную боль архитектурного уровня.
Автор раскурил, почему MinIO тут не взлетел, где MongoDB уперлась в потолок, и как PostgreSQL с Pgpool-II и read-репликами срезал время чтения свечи с 40мс до 10мс.
Читать далее: https://habr.com/ru/articles/1059062/
👉 Node.JS [ru]
Автор раскурил, почему MinIO тут не взлетел, где MongoDB уперлась в потолок, и как PostgreSQL с Pgpool-II и read-репликами срезал время чтения свечи с 40мс до 10мс.
Читать далее: https://habr.com/ru/articles/1059062/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Point0 — очередной фулстек-фреймворк, который уже успели обозвать конкурентом tRPC. Судя по описанию, DX тут реально похож: те же квери и мутации. Но Point0 идет дальше — позволяет объявлять запросы прямо в клиентских файлах вместе с серверной логикой, сам шарит за гидрацию и дегидрацию при SSR, умеет швырять файлы через FormData, выдает стабильные урлы для эндпоинтов и может отдавать серверные компоненты или интерактивные острова.
Плюс фреймворк не кладет редактор мордой в стол, когда эндпоинтов становится дофига, и нормально рулит состояниями загрузки. Автор предполагает, что ты уже шаришь за tRPC — так что в статье накидали примеров на нем для сравнения.
Читать далее
👉 Node.JS [ru]
Плюс фреймворк не кладет редактор мордой в стол, когда эндпоинтов становится дофига, и нормально рулит состояниями загрузки. Автор предполагает, что ты уже шаришь за tRPC — так что в статье накидали примеров на нем для сравнения.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
Диагностика неявного deadlock в async_hooks при IPC в Node.js кластерах
Вы сталкивались с ситуацией, когда кластеризованное Node.js приложение потребляет 100% CPU без видимых ошибок, а event loop замирает? Часто причина — неявный deadlock в
Гонка за ресурсами IPC
Production-пример: кластер с обработкой запросов, где каждый воркер отправляет результат через send и закрывает порт. После пары тысяч запросов — deadlock, все воркеры зависают.
Диагностика
Чтобы отловить проблему, включите логирование
-
-
- No errors in logs
Практический совет: исправление
Замените синхронный
Хороший паттерн:
Используйте
Профилактика
- Ставьте timeout на все IPC-операции
- Мониторьте
- Гоняйте кластер под нагрузкой с логированием ресурсов
Вывод: Синхронный IPC-вызов с последующим закрытием порта создает неявный deadlock в
Вы сталкивались с ситуацией, когда кластеризованное Node.js приложение потребляет 100% CPU без видимых ошибок, а event loop замирает? Часто причина — неявный deadlock в
async_hooks, возникающий при смешивании синхронных IPC-вызовов через child_process.send и MessagePort.close в воркерах.Гонка за ресурсами IPC
send() в child_process синхронно блокируется до отправки данных. Если следом вызвать port.close(), возникает замыкание: send() удерживает IPC-ресурс, close() ждет его освобождения, а async_hooks зависает в состоянии "ожидания завершения". Результат — ресурсы не освобождаются, ошибок нет, CPU занят вхолостую.Production-пример: кластер с обработкой запросов, где каждый воркер отправляет результат через send и закрывает порт. После пары тысяч запросов — deadlock, все воркеры зависают.
Диагностика
Чтобы отловить проблему, включите логирование
async_hooks с таймстампами:-
init для IPC-каналов появляется-
destroy приходит с задержкой или отсутствует вовсе- No errors in logs
Практический совет: исправление
Замените синхронный
send на асинхронный. Плохой паттерн:send({ data }, (err) => { port.close(); });Хороший паттерн:
await new Promise(resolve => process.send({ data }, resolve));
port.close();Используйте
MessageChannel вместо child_process.send — он избегает блокировки. Если deadlock уже произошел, убивайте воркер через worker.kill(), а не process.exit().Профилактика
- Ставьте timeout на все IPC-операции
- Мониторьте
async_hooks метрики через performance hooks- Гоняйте кластер под нагрузкой с логированием ресурсов
Вывод: Синхронный IPC-вызов с последующим закрытием порта создает неявный deadlock в
async_hooks, который проявляется только как 100% CPU и зависший event loop — переходите на асинхронные паттерны для всех межпроцессных коммуникаций.Зачем долбить бинарный поиск, если платят за кнопки
Слушай, на Хабре уже лет сто ломают копья: алгоритмы в реальной работе — это маст-хэв или просто пыль для собесных задачек? Вот очередной смельчак решил влезть в эту свару. Когда он только вкатывался во фронтенд, его мучили те же вопросы: «Нахрена меня на собесе гоняют по обходу графа, если по факту я только правлю отступы в CSS?» или «Какая мне разница до O(N), если верстка все равно разваливается в Safari?» А с приходом AI эти вопросы зазвучали еще громче: «Зачем мне вообще парить мозг, если нейронка склепает цикл за пару секунд?»
Но чем глубже автор закапывался в алгоритмические задачи, тем чаще замечал, что они всплывают в реальных проектах, когда задача оказывается сложнее, чем «зацентрировать див». Он научился собирать бизнес-фичи компактнее, быстрее выискивать места, которые конкретно тормозят прод, и — самое банальное — перестал сомневаться в своих действиях.
Дальше
👉 Node.JS [ru]
Слушай, на Хабре уже лет сто ломают копья: алгоритмы в реальной работе — это маст-хэв или просто пыль для собесных задачек? Вот очередной смельчак решил влезть в эту свару. Когда он только вкатывался во фронтенд, его мучили те же вопросы: «Нахрена меня на собесе гоняют по обходу графа, если по факту я только правлю отступы в CSS?» или «Какая мне разница до O(N), если верстка все равно разваливается в Safari?» А с приходом AI эти вопросы зазвучали еще громче: «Зачем мне вообще парить мозг, если нейронка склепает цикл за пару секунд?»
Но чем глубже автор закапывался в алгоритмические задачи, тем чаще замечал, что они всплывают в реальных проектах, когда задача оказывается сложнее, чем «зацентрировать див». Он научился собирать бизнес-фичи компактнее, быстрее выискивать места, которые конкретно тормозят прод, и — самое банальное — перестал сомневаться в своих действиях.
Дальше
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Зависание HTTP/2 прокси: как кастомные priority-фреймы убивают flow control
Когда параллельные стримы с разными приоритетами перестают отвечать, сессия жива, но данные не идут - проблема не в сети, а в управлении потоком. Разработчики часто путают висящие стримы с сетевыми таймаутами, теряя часы на отладку.
Две ловушки flow control
HTTP/2 имеет два окна управления потоком: на сессию (65535 байт по умолчанию) и на каждый стрим. При кастомных приоритетах (например, weight=256 у одного стрима и weight=1 у остальных) прокси начинает насыщать только приоритетный стрим. Остальные ждут, окно соединения исчерпывается - дедлок неизбежен.
Как диагностировать залипание
Чтобы поймать проблему:
- Смотри WINDOW_UPDATE фреймы. Если их число падает на уровне сессии, а на стримах нет - сигнал тревоги.
- Включи логирование priority. Когда более 80% веса приходится на один стрим, жди беды.
- Попробуй увеличить initial window size до мегабайта. Если зависание исчезает, копай в flow control.
Простой пример на Node.js
Вот как управлять окном приоритетов:
Типичная ошибка и её решение
При кастомных приоритетах убедись, что сумма весов не даёт перекоса под 80% на один стрим. Следи за stream.state: если localWindowSize почти ноль, а remoteWindowSize нет - это залипание. На прокси-сервере проверяй, не блокирует ли nghttp2 флаг NGHTTP2_FLAG_PRIORITY_OPEN.
Вывод: Контроль баланса весов приоритетов и мониторинг WINDOW_UPDATE фреймов на уровне сессии критичен для предотвращения дедлоков в параллельных стримах HTTP/2.
Когда параллельные стримы с разными приоритетами перестают отвечать, сессия жива, но данные не идут - проблема не в сети, а в управлении потоком. Разработчики часто путают висящие стримы с сетевыми таймаутами, теряя часы на отладку.
Две ловушки flow control
HTTP/2 имеет два окна управления потоком: на сессию (65535 байт по умолчанию) и на каждый стрим. При кастомных приоритетах (например, weight=256 у одного стрима и weight=1 у остальных) прокси начинает насыщать только приоритетный стрим. Остальные ждут, окно соединения исчерпывается - дедлок неизбежен.
Как диагностировать залипание
Чтобы поймать проблему:
- Смотри WINDOW_UPDATE фреймы. Если их число падает на уровне сессии, а на стримах нет - сигнал тревоги.
- Включи логирование priority. Когда более 80% веса приходится на один стрим, жди беды.
- Попробуй увеличить initial window size до мегабайта. Если зависание исчезает, копай в flow control.
Простой пример на Node.js
Вот как управлять окном приоритетов:
const http2 = require('http2');
const { HTTP2_HEADER_PATH, HTTP2_HEADER_METHOD } = http2.constants;
const client = http2.connect('https://example.com');
client.setLocalWindowSize(1048576);
async function sendRequest(path) {
return new Promise((resolve, reject) => {
const stream = client.request({
[HTTP2_HEADER_PATH]: path,
[HTTP2_HEADER_METHOD]: 'GET',
});
let data = '';
stream.on('data', chunk => data += chunk);
stream.on('end', () => resolve(data));
stream.on('error', reject);
});
}
Promise.all([
sendRequest('/api/1'),
sendRequest('/api/2'),
sendRequest('/api/3')
]);Типичная ошибка и её решение
При кастомных приоритетах убедись, что сумма весов не даёт перекоса под 80% на один стрим. Следи за stream.state: если localWindowSize почти ноль, а remoteWindowSize нет - это залипание. На прокси-сервере проверяй, не блокирует ли nghttp2 флаг NGHTTP2_FLAG_PRIORITY_OPEN.
Вывод: Контроль баланса весов приоритетов и мониторинг WINDOW_UPDATE фреймов на уровне сессии критичен для предотвращения дедлоков в параллельных стримах HTTP/2.
❤1
В Strapi есть забавная особенность: формат ответа напрямую зависит от того, что ты ГОВОРИШЬ ему в запросе. Попросил статью без
Авторы разбирают, как выкрутиться из этой задницы через кодогенерацию: вытягиваешь схему с живого Strapi, по ней генеряешь TypeScript-клиент и заставляешь систему типов на этапе компиляции вычислять тип ответа прямо из параметра
Читать статью
👉 Node.JS [ru]
populate — на тебе голые скалярные поля. Сунул populate: { category: true } — и уже подтянулась вложенная категория. А если еще и fields: ['name'] добавил внутрь — она придет обнуленной. Получается, один и тот же эндпоинт возвращает кучу разных форм, и стандартный TypeScript-интерфейс нормально не опишешь: он либо обманывает, заявляя поля, которых в ответе на самом деле нету, либо просто бесполезен, превращаясь в то самое any.Авторы разбирают, как выкрутиться из этой задницы через кодогенерацию: вытягиваешь схему с живого Strapi, по ней генеряешь TypeScript-клиент и заставляешь систему типов на этапе компиляции вычислять тип ответа прямо из параметра
populate. Принцип — как у Prisma: что передал в вызов, то тебе типы и вернут. Код на TypeScript, сам клиент опенсорсный под лицензией MIT.Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Pete Hunt снова в деле — теперь рулит Next.js
Гильермо Рауч рапортует: в Vercel подтянули Пита Ханта и Ника Шрока (того самого, что клепал GraphQL). Пит — бывалый чувак из ядра React, так что теперь именно он будет командовать развитием Next.js.
Контора теперь решила бахать патчи безопасности для Next.js каждый месяц по расписанию. Первый такой апдейт стучат буквально со дня на день.
Cloudflare тем временем перекрошил свой блог под ноль — переехал на EmDash. Это такой «духовный наследник WordPress» на базе Astro. Запустили его аккурат 1 апреля.
👉 Node.JS [ru]
Гильермо Рауч рапортует: в Vercel подтянули Пита Ханта и Ника Шрока (того самого, что клепал GraphQL). Пит — бывалый чувак из ядра React, так что теперь именно он будет командовать развитием Next.js.
Контора теперь решила бахать патчи безопасности для Next.js каждый месяц по расписанию. Первый такой апдейт стучат буквально со дня на день.
Cloudflare тем временем перекрошил свой блог под ноль — переехал на EmDash. Это такой «духовный наследник WordPress» на базе Astro. Запустили его аккурат 1 апреля.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👎1
Как entity затащила features, а композиция свалилась в widgets
Разработчики засунули компактную карточку банковской карты в
Никаких инцидентов у пользователей не случилось, но время на исправление улетело. В entity оставили голый
В FSD 2.1 советуют начинать со страниц и вытаскивать код вниз по мере появления переиспользования. Иногда самостоятельный сценарий с близким вторым потребителем оправдывает границу раньше.
Читать далее
👉 Node.JS [ru]
Разработчики засунули компактную карточку банковской карты в
entities/card/ui: маску номера, баланс и статус прикрутили. Через два спринта в карточку добавили «заблокировать карту» и «изменить лимит». В итоге entity начала тащить features/block-card, features/change-card-limit и проверку прав доступа, игнорируя public API. Когда карточку надо было показать в выборе счета списания, с ней приехали лишние зависимости и проверки ролей.Никаких инцидентов у пользователей не случилось, но время на исправление улетело. В entity оставили голый
CardPreview, сценарии подключили выше, композицию дашборда перекинули в widgets/card-summary, а затем прогнали ролевые тесты заново. После этого на ревью начали обсуждать имя папки ближе к концу разговора — сначала отвечали на вопрос: «Какие будущие изменения выбранная граница позволит оставить локальными?»В FSD 2.1 советуют начинать со страниц и вытаскивать код вниз по мере появления переиспользования. Иногда самостоятельный сценарий с близким вторым потребителем оправдывает границу раньше.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Ну что, погнали дальше ковырять этот Wails.
В проекте, если хочешь чего-то добиться, реально нужны только четыре файла:
Читать дальше: https://habr.com/ru/articles/1060336/
👉 Node.JS [ru]
В проекте, если хочешь чего-то добиться, реально нужны только четыре файла:
index.html, styles.css, main.js и app.go. Всё остальное либо вообще не трогаешь, либо настраиваешь разок в самом начале и забываешь. Фронт написан на чистом HTML, CSS и JS — без этих ваших модных фреймворков. Разбирать фронтендскую часть детально никто не будет, HTML тут просто для галочки, чтобы показать, как дёргать JS-функции.Читать дальше: https://habr.com/ru/articles/1060336/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Пятая кнопка за вечер. Фронтенд-архитектура, когда за тебя пишет LLM
К концу второго месяца вайб-кодинга на фронте пет-проекта уже накопилось пять разных кнопок, четыре спиннера, страничный компонент на 700 строк и шапка, показывающая один баланс, в то время как рядом открытая модалка выдавала совсем другой. LLM-агент всё это генерил уверенно, быстро и с нормальным стилем кода. Фронтенд под LLM сыпется быстрее бэкенда — и на то есть причины: от обучающей выборки, где вперемешку валяются три поколения React, до самой сути JSX, где разметка, логика и состояние спокойно живут в одном файле по законам жанра.
Под катом — что в итоге зашло: Feature-Sliced Design, обрезанный до трёх слоёв, как навигация для агента; dependency-cruiser в роли архитектурного контракта, который не обойти; генерация API-клиента из OpenAPI вместо доменной модели; за что я простил Tailwind; и честно — про самое больное место конвейера: агент, верстающий вслепую. Это сиквел статьи про бэкенд, но читается и отдельно.
Читать далее
👉 Node.JS [ru]
К концу второго месяца вайб-кодинга на фронте пет-проекта уже накопилось пять разных кнопок, четыре спиннера, страничный компонент на 700 строк и шапка, показывающая один баланс, в то время как рядом открытая модалка выдавала совсем другой. LLM-агент всё это генерил уверенно, быстро и с нормальным стилем кода. Фронтенд под LLM сыпется быстрее бэкенда — и на то есть причины: от обучающей выборки, где вперемешку валяются три поколения React, до самой сути JSX, где разметка, логика и состояние спокойно живут в одном файле по законам жанра.
Под катом — что в итоге зашло: Feature-Sliced Design, обрезанный до трёх слоёв, как навигация для агента; dependency-cruiser в роли архитектурного контракта, который не обойти; генерация API-клиента из OpenAPI вместо доменной модели; за что я простил Tailwind; и честно — про самое больное место конвейера: агент, верстающий вслепую. Это сиквел статьи про бэкенд, но читается и отдельно.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👎2
Как ужать расходы на AI-обработку данных в 12 раз
Чувак реально вынес мозг десяткам тысяч сообщений через LLM: вытягивал данные из текста, раскладывал объявления по полочкам и собирал из этого чистый JSON. Пробовал и халявные модели, и платные API — в итоге докрутил стоимость одного запроса до смешных 0.006 рублей, не потеряв в качестве.
В статье он вскрывает, как докопался до решения и зачем наваял свой API-слой поверх OpenCode Go.
Читать далее
👉 Node.JS [ru]
Чувак реально вынес мозг десяткам тысяч сообщений через LLM: вытягивал данные из текста, раскладывал объявления по полочкам и собирал из этого чистый JSON. Пробовал и халявные модели, и платные API — в итоге докрутил стоимость одного запроса до смешных 0.006 рублей, не потеряв в качестве.
В статье он вскрывает, как докопался до решения и зачем наваял свой API-слой поверх OpenCode Go.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1😁1
Парень вкатил на прод сразу три инструмента: Claude Code, Cursor и Codex. Каждый закрывает свою зону ответственности, и выбор тут упирается не в список фич, а в то, как устроена работа в команде. Он прогнал одну и ту же таску через все три, засекая время, и сравнил, что выгоднее, насколько каждый автономен и где они честно отваливаются.
Подробности — в статье на Habr.
👉 Node.JS [ru]
Подробности — в статье на Habr.
Please open Telegram to view this post
VIEW IN TELEGRAM
👎3🐳1
Ленивая загрузка провалилась: main.js всё тот же двухметровый монстр
Даже если нарезать Angular‑проект на ленивые модули и врубить production‑билд, main.js всё равно норовит потяжелеть почти до двух мегабайт. Всё упирается в общие модули, жирные зависимости и импорты, которые блочат tree‑shaking.
На Хабре расковыряли эту тему: как выкурить лишний код из бандла и реально ускорить загрузку.
Тыкай сюда
👉 Node.JS [ru]
Даже если нарезать Angular‑проект на ленивые модули и врубить production‑билд, main.js всё равно норовит потяжелеть почти до двух мегабайт. Всё упирается в общие модули, жирные зависимости и импорты, которые блочат tree‑shaking.
На Хабре расковыряли эту тему: как выкурить лишний код из бандла и реально ускорить загрузку.
Тыкай сюда
Please open Telegram to view this post
VIEW IN TELEGRAM
🦀 Transferum — TypeScript-библиотека для реактивных графов данных
Один чувак расчехлил свою поделку — легковесную либу Transferum. Штука позволяет собирать гибкий реактивный граф для обработки данных, где ноды живут сами по себе, а связи между ними стыкуются автоматом, исходя из их способностей.
Внутри: система вычислимых типов, чтобы контракты пробивать на этапе компиляции, роутинг данных по графу и несколько примеров, как на этой базе клеить динамические пайплайны для IoT-датчиков и панелек управления.
Читать далее
👉 Node.JS [ru]
Один чувак расчехлил свою поделку — легковесную либу Transferum. Штука позволяет собирать гибкий реактивный граф для обработки данных, где ноды живут сами по себе, а связи между ними стыкуются автоматом, исходя из их способностей.
Внутри: система вычислимых типов, чтобы контракты пробивать на этапе компиляции, роутинг данных по графу и несколько примеров, как на этой базе клеить динамические пайплайны для IoT-датчиков и панелек управления.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
Это показало новое исследование на 45+ тысяч зарплат специалистов. Изучаем главное, чтобы быть готовыми к рынку:
- Медианная зарплата в IT в первой половине 2026 года составила 191 000 ₽ — это всего на 4% больше, чем полгода назад. При этом прогнозируемая годовая инфляция — 4,5–5,5%.
- Самый щедрый по офферам город, разумеется, Москва. Там медиана по зп — 235 тысяч, в регионах же всего 160.
- Топ-5 самых высокооплачиваемых специальностей в IT: на первом месте — разработчики, дальше идут менеджеры, администраторы, специалисты по информационной безопасности и аналитики.
- Самые высокие зарплаты среди языков при этом у Objective-C — этим гигачадам предлагают 400 000 ₽. Следом идут Elixir (348к), Swift и Golang с 326 и 325 тысячами рублей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Зелёный CI, красные глаза
eslint-plugin-playwright в режиме recommended вешает warning, а не error на те самые опасные штуки:
В статье — конфиг, который делает warning ошибками, и 10 правил для ревью, которые линт не выкурит. Читать далее
👉 Node.JS [ru]
eslint-plugin-playwright в режиме recommended вешает warning, а не error на те самые опасные штуки:
force: true, waitForTimeout(3000) и когда ассертов нет вообще. Валится всё только в рантайме — привет, ночные падения.В статье — конфиг, который делает warning ошибками, и 10 правил для ревью, которые линт не выкурит. Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Некто раскатал свой опыт по стройке проекта на Next.js. В статье на живом примере разобрано: как запилили структуру, разрулили маршруты, замутили DAL, навесили аутентификацию, валидацию, тесты и прочую бытовуху из процесса. Автор не строит из себя гуру универсальных решений — просто показывает один из вариантов, как можно собрать приложение в кучу.
Читать далее
👉 Node.JS [ru]
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
👎1
WebAssembly (WASM) изначально затачивали, чтоб тащить тяжелый код в браузере быстрее JS. Но в последнее время эта песочница повылазила за его пределы — сервера, edge, плагины, виртуалки. Амбиций добавили рантаймы типа Wasmtime, WasmEdge, Wasmer — они уже запускают WASM‑модули прямо на ОС. Вроде красивая сказочка: скомпилил один бинарник и хоть где крути в изоляции.
Но есть те, кто попробовал прикрутить свою VM на WASM и послал эту идею нафиг. Самый жирный пример — Polkadot. Они слепили PolkaVM на основе набора инструкций RISC‑V и перетащили на неё слой смарт‑контрактов (рантайм Polkadot всё ещё компилится в WASM, но это уже другая история). Возникает резонный вопрос: если WASM такой крутой, почему для свежего движка они выбрали регистровую машину, а не его?
В статье разбирают, чем стековая модель отличается от регистровой и какие компромиссы зашиты в WASM. Читать далее
👉 Node.JS [ru]
Но есть те, кто попробовал прикрутить свою VM на WASM и послал эту идею нафиг. Самый жирный пример — Polkadot. Они слепили PolkaVM на основе набора инструкций RISC‑V и перетащили на неё слой смарт‑контрактов (рантайм Polkadot всё ещё компилится в WASM, но это уже другая история). Возникает резонный вопрос: если WASM такой крутой, почему для свежего движка они выбрали регистровую машину, а не его?
В статье разбирают, чем стековая модель отличается от регистровой и какие компромиссы зашиты в WASM. Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1