ESM ломает не код, а допущения: проверь их до первого импорта
В CommonJS многие ошибки прячутся за require и module.exports. В ESM они выходят наружу сразу: строгие пути, явные расширения, отдельные правила для default и named export.
Три места, где чаще всего спотыкаются:
— импорт без расширения в Node-окружении;
— смешивание default export и named export «на глаз»;
— циклические зависимости, которые в ESM проявляются жёстче, чем в CJS.
Если проект уже живёт на TypeScript, проверь связку tsconfig и рантайма. Для сборки важно, чтобы moduleResolution, target и формат выхода не спорили между собой. Иначе код проходит typecheck, но падает при запуске или в тестах.
Отдельно смотри на библиотеки и утилиты: не всё, что красиво импортируется в Vite, так же работает в Node, Bun или при прямом запуске через tsx. ESM любит явность. Чем меньше магии в путях и экспортах, тем меньше сюрпризов в деплое.
Если мигрируешь репу на ESM, начни с одного правила: сначала стабилизируй импорты, потом меняй формат модулей. Это почти всегда дешевле, чем чинить уже собранный стек.
В CommonJS многие ошибки прячутся за require и module.exports. В ESM они выходят наружу сразу: строгие пути, явные расширения, отдельные правила для default и named export.
Три места, где чаще всего спотыкаются:
— импорт без расширения в Node-окружении;
— смешивание default export и named export «на глаз»;
— циклические зависимости, которые в ESM проявляются жёстче, чем в CJS.
Если проект уже живёт на TypeScript, проверь связку tsconfig и рантайма. Для сборки важно, чтобы moduleResolution, target и формат выхода не спорили между собой. Иначе код проходит typecheck, но падает при запуске или в тестах.
Отдельно смотри на библиотеки и утилиты: не всё, что красиво импортируется в Vite, так же работает в Node, Bun или при прямом запуске через tsx. ESM любит явность. Чем меньше магии в путях и экспортах, тем меньше сюрпризов в деплое.
Если мигрируешь репу на ESM, начни с одного правила: сначала стабилизируй импорты, потом меняй формат модулей. Это почти всегда дешевле, чем чинить уже собранный стек.
5 ошибок во Vue-проекте, которые потом превращаются в долгий техдолг
Vue обычно про скорость разработки, но типовые промахи потом бьют по поддержке. Первый — хранить слишком много состояния в компоненте, когда часть логики уже просится в composable или store. Второй — смешивать UI, запросы и форматирование в одном файле: компонент растёт, а тестировать его всё больнее.
Ещё две частые проблемы:
— неглубокая структура компонентов, где всё лежит в одном месте и любая правка задевает соседей;
— реактивность “на удачу”, когда computed и watch используют вместо понятной модели данных, а потом ловят лишние перерендеры и скрытые циклы.
Отдельно стоит смотреть на шаблоны: если там много условий, инлайн-функций и тяжёлых вычислений, это почти всегда сигнал вынести логику выше. Иначе код выглядит простым только до первого рефакторинга.
Хорошая проверка для любого Vue-модуля: если компонент нельзя объяснить за 30 секунд, значит он уже делает лишнее. Разрежьте его на визуальный слой, состояние и побочные эффекты — и сопровождать проект станет заметно легче.
Vue обычно про скорость разработки, но типовые промахи потом бьют по поддержке. Первый — хранить слишком много состояния в компоненте, когда часть логики уже просится в composable или store. Второй — смешивать UI, запросы и форматирование в одном файле: компонент растёт, а тестировать его всё больнее.
Ещё две частые проблемы:
— неглубокая структура компонентов, где всё лежит в одном месте и любая правка задевает соседей;
— реактивность “на удачу”, когда computed и watch используют вместо понятной модели данных, а потом ловят лишние перерендеры и скрытые циклы.
Отдельно стоит смотреть на шаблоны: если там много условий, инлайн-функций и тяжёлых вычислений, это почти всегда сигнал вынести логику выше. Иначе код выглядит простым только до первого рефакторинга.
Хорошая проверка для любого Vue-модуля: если компонент нельзя объяснить за 30 секунд, значит он уже делает лишнее. Разрежьте его на визуальный слой, состояние и побочные эффекты — и сопровождать проект станет заметно легче.
FastAPI ломают не роуты, а неправильные зависимости и валидация
За неделю в репах чаще всего всплывает одна и та же проблема: проект стартует быстро, а потом начинает тормозить на интеграциях. Причина обычно не в самом FastAPI, а в том, как собраны зависимости, схемы и фоновые задачи.
• Не тащите тяжёлую работу в endpoint. Всё, что ходит во внешние API, пишет файлы или собирает отчёты, уносите в очередь или background task.
• Не делайте pydantic-модели «на всё». Отдельно держите request, response и internal schema — иначе валидация превращается в кашу.
• Не смешивайте бизнес-логику с роутом. Endpoint должен принять данные, вызвать сервис и вернуть ответ, а не решать половину доменной задачи.
Есть наблюдение которое стоит проверить: большинство багов в FastAPI появляется не на async, а на границе слоёв. Там, где один и тот же объект живёт в SQLAlchemy, в ответе API и в тестах, начинаются сюрпризы с мутацией, сериализацией и лишними запросами.
Ещё один частый провал — зависимость через глобальные синглтоны. Для подключения к БД, клиентам и конфигу лучше использовать явную dependency injection: так тесты проще, а код не привязан к магии импорта.
Если FastAPI кажется «простым», это обычно до первого роста проекта. Держите роуты тонкими, схемы раздельными, а IO — вне синхронного пути, и приложение останется читаемым без героизма.
За неделю в репах чаще всего всплывает одна и та же проблема: проект стартует быстро, а потом начинает тормозить на интеграциях. Причина обычно не в самом FastAPI, а в том, как собраны зависимости, схемы и фоновые задачи.
• Не тащите тяжёлую работу в endpoint. Всё, что ходит во внешние API, пишет файлы или собирает отчёты, уносите в очередь или background task.
• Не делайте pydantic-модели «на всё». Отдельно держите request, response и internal schema — иначе валидация превращается в кашу.
• Не смешивайте бизнес-логику с роутом. Endpoint должен принять данные, вызвать сервис и вернуть ответ, а не решать половину доменной задачи.
Есть наблюдение которое стоит проверить: большинство багов в FastAPI появляется не на async, а на границе слоёв. Там, где один и тот же объект живёт в SQLAlchemy, в ответе API и в тестах, начинаются сюрпризы с мутацией, сериализацией и лишними запросами.
Ещё один частый провал — зависимость через глобальные синглтоны. Для подключения к БД, клиентам и конфигу лучше использовать явную dependency injection: так тесты проще, а код не привязан к магии импорта.
Если FastAPI кажется «простым», это обычно до первого роста проекта. Держите роуты тонкими, схемы раздельными, а IO — вне синхронного пути, и приложение останется читаемым без героизма.
7 ошибок в Python-скриптах, из-за которых автоматизация ломается на ровном месте
В Python чаще всего падает не «логика», а обвязка: ввод, сеть, файлы, окружение. Если скрипт живёт дольше одного запуска, проверь базу:
— не ловишь ли ты исключения через голый except;
— не смешиваешь ли print и нормальный logging;
— не рассчитываешь ли на порядок в dict там, где нужен явный сорт;
— не читаешь ли файл целиком, когда хватит итерации по строкам.
Ещё одна типовая проблема — скрытые зависимости. Скрипт работает у тебя, но ломается на сервере, потому что путь относительный, переменные окружения не заданы, а формат входных данных чуть отличается. Сюда же относятся:
— жёстко прошитые URL, токены и пути;
— отсутствие проверок на пустой ответ;
— работа без таймаутов для запросов;
— ожидание, что внешний сервис всегда вернёт JSON.
Если есть асинхронщина, отдельно смотри на блокировки: один случайный requests, тяжёлый парсинг или синхронный драйвер внутри event loop убивают смысл asyncio. Для фоновых задач полезно сразу разделять: I/O отдельно, CPU отдельно, ошибки отдельно.
Хороший скрипт — это не тот, который «один раз отработал», а тот, который переживает пустые данные, сетевые сбои и чужую среду. Перед запуском в проде прогоняй чек: вход, таймауты, логи, конфиг, исключения, и только потом логику.
В Python чаще всего падает не «логика», а обвязка: ввод, сеть, файлы, окружение. Если скрипт живёт дольше одного запуска, проверь базу:
— не ловишь ли ты исключения через голый except;
— не смешиваешь ли print и нормальный logging;
— не рассчитываешь ли на порядок в dict там, где нужен явный сорт;
— не читаешь ли файл целиком, когда хватит итерации по строкам.
Ещё одна типовая проблема — скрытые зависимости. Скрипт работает у тебя, но ломается на сервере, потому что путь относительный, переменные окружения не заданы, а формат входных данных чуть отличается. Сюда же относятся:
— жёстко прошитые URL, токены и пути;
— отсутствие проверок на пустой ответ;
— работа без таймаутов для запросов;
— ожидание, что внешний сервис всегда вернёт JSON.
Если есть асинхронщина, отдельно смотри на блокировки: один случайный requests, тяжёлый парсинг или синхронный драйвер внутри event loop убивают смысл asyncio. Для фоновых задач полезно сразу разделять: I/O отдельно, CPU отдельно, ошибки отдельно.
Хороший скрипт — это не тот, который «один раз отработал», а тот, который переживает пустые данные, сетевые сбои и чужую среду. Перед запуском в проде прогоняй чек: вход, таймауты, логи, конфиг, исключения, и только потом логику.
Скрипт должен падать предсказуемо: 6 проверок до запуска в прод
Если python-скрипт живёт дольше одного запуска, его надо проверять не “на глаз”, а по схеме. Иначе он ломается там, где не ждёшь: на пустом файле, на кривой кодировке, на повторной записи, на таймауте API.
— Сначала проверяй вход: файл существует, формат тот, кодировка читается, обязательные поля не пустые.
— Потом ограничивай объём: лимит на размер файла, число строк, глубину рекурсии, размер ответа от внешнего сервиса.
— Любой внешний вызов оборачивай в retry + timeout, но retry делай только для идемпотентных операций.
— Логи пиши так, чтобы по одному сообщению было ясно: что обрабатывали, на каком шаге упали, какой был payload.
— Ошибки дели на ожидаемые и аварийные: первые обрабатывай, вторые пусть валят задачу с понятным trace.
Отдельная ловушка — временные файлы и частичные записи. Сначала пишешь в tmp, потом атомарно переименовываешь; иначе после падения у тебя остаётся “почти готовый” результат, который кто-то примет за валидный.
И ещё: любой скрипт без теста на один плохой кейс — это не автоматизация, а надежда. Лучше один раз зашить проверки, чем потом вручную искать, где именно всё съехало.
Если python-скрипт живёт дольше одного запуска, его надо проверять не “на глаз”, а по схеме. Иначе он ломается там, где не ждёшь: на пустом файле, на кривой кодировке, на повторной записи, на таймауте API.
— Сначала проверяй вход: файл существует, формат тот, кодировка читается, обязательные поля не пустые.
— Потом ограничивай объём: лимит на размер файла, число строк, глубину рекурсии, размер ответа от внешнего сервиса.
— Любой внешний вызов оборачивай в retry + timeout, но retry делай только для идемпотентных операций.
— Логи пиши так, чтобы по одному сообщению было ясно: что обрабатывали, на каком шаге упали, какой был payload.
— Ошибки дели на ожидаемые и аварийные: первые обрабатывай, вторые пусть валят задачу с понятным trace.
Отдельная ловушка — временные файлы и частичные записи. Сначала пишешь в tmp, потом атомарно переименовываешь; иначе после падения у тебя остаётся “почти готовый” результат, который кто-то примет за валидный.
И ещё: любой скрипт без теста на один плохой кейс — это не автоматизация, а надежда. Лучше один раз зашить проверки, чем потом вручную искать, где именно всё съехало.
React Server Actions ломают границы между UI и мутирующей логикой — и это надо проектировать заранее
Server Actions удобно вешать на форму и забывать про отдельный API-слой. Но если рядом уже живут TanStack Query, optimistic UI и сложная авторизация, начинаются дубли: одно и то же действие вызывают из формы, модалки и фонового процесса.
Перед внедрением проверьте три вещи:
— где проходит граница между чтением и записью;
— кто владеет инвалидцией кеша;
— можно ли вызвать действие не из браузерной формы, а из обработчика, теста или cron-джобы.
Главная ошибка — тащить в Action всю бизнес-логику. Тогда её сложно переиспользовать, мокать и переносить между Next.js, Remix и обычным backend-for-frontend. Лучше держать Action тонким адаптером: валидация, вызов доменного сервиса, возврат результата.
И ещё одно: Action не отменяет необходимость явных контрактов. Если на выходе у вас меняются поля, сообщения об ошибке и побочные эффекты, фронт быстро превращается в набор хрупких допущений. Разделяйте: Action для транспорта, сервис для правил, схема для данных.
Server Actions удобно вешать на форму и забывать про отдельный API-слой. Но если рядом уже живут TanStack Query, optimistic UI и сложная авторизация, начинаются дубли: одно и то же действие вызывают из формы, модалки и фонового процесса.
Перед внедрением проверьте три вещи:
— где проходит граница между чтением и записью;
— кто владеет инвалидцией кеша;
— можно ли вызвать действие не из браузерной формы, а из обработчика, теста или cron-джобы.
Главная ошибка — тащить в Action всю бизнес-логику. Тогда её сложно переиспользовать, мокать и переносить между Next.js, Remix и обычным backend-for-frontend. Лучше держать Action тонким адаптером: валидация, вызов доменного сервиса, возврат результата.
И ещё одно: Action не отменяет необходимость явных контрактов. Если на выходе у вас меняются поля, сообщения об ошибке и побочные эффекты, фронт быстро превращается в набор хрупких допущений. Разделяйте: Action для транспорта, сервис для правил, схема для данных.
This media is not supported in your browser
VIEW IN TELEGRAM
Google выпустил Android 17
Android получил встроенную Gemini с функциями автоматизации задач, конспектирования браузера и редактирования медиа. Обновление принесло новый интерфейс Bubble, двухкамерную запись и игровой режим для складных телефонов. Критический момент: Gemini Intelligence требует Gemini Nano v3 и минимум 12 ГБ RAM, что ограничивает аудиторию премиум-девайсов. Это создаёт потенциал для таргетинга криптооффера на узкий сегмент владельцев флагманов, готовых пл…
➡️ Читайте на сайте: https://aff.top/blog/google-vypustil-android-17
🧠 Ещё больше инсайтов → в канале AFF.top
Android получил встроенную Gemini с функциями автоматизации задач, конспектирования браузера и редактирования медиа. Обновление принесло новый интерфейс Bubble, двухкамерную запись и игровой режим для складных телефонов. Критический момент: Gemini Intelligence требует Gemini Nano v3 и минимум 12 ГБ RAM, что ограничивает аудиторию премиум-девайсов. Это создаёт потенциал для таргетинга криптооффера на узкий сегмент владельцев флагманов, готовых пл…
➡️ Читайте на сайте: https://aff.top/blog/google-vypustil-android-17
🧠 Ещё больше инсайтов → в канале AFF.top