Разработка: Эффект провокация
Добавлен эффект провокация. Пока карта жива, враг атакует только ее
Добавлен эффект провокация. Пока карта жива, враг атакует только ее
Многие знают, что поверхностное копирование (const copy = obj) копирует только ссылку на объект, но не создаёт полноценную копию. Если изменить copy, изменится и исходный объект.
Для глубокого копирования раньше использовали JSON.parse(JSON.stringify()). Но у этого способа куча проблем: он не копирует Date, Map, Set, RegExp, undefined, падает на циклических ссылках и просто молча проглатывает функции.
Хотелось напомни , а некоторым и рассказать что существует другой более удобный и полезный способ ,глубокого копирования объекта.
structuredClone()-встроенный метод для глубокого копирования, который работает на уровне движка.
const original = {
name: "Мощный WEB",
date: new Date(),
map: new Map([['key', 'value']]),
set: new Set([1, 2, 3]),arr: [1, 2, 3],
nested: { a: 1, b: 2 } };
const clone = structuredClone(original); // Теперь clone — это полноценная копия console.log(clone !== original); // true
console.log(clone.date instanceof Date); // true
console.log(clone.map instanceof Map); // true
Всё работает "из коробки": Map, Set, Date, ArrayBuffer, TypedArray, циклические ссылки.
Все современные браузеры ,поддерживают данный метод.
Используйте ,его даже во времена AI и "Вайбкодинга", знать такие вещи необходимо.
Пару дней назад я сделал небольшое расширение, которое возвращает вставку, копирование, выделение текста и контекстное меню на сайтах ФССП, Госавтоинспекции и МВД. Не ожидал такой отклик для мини расширения. и поэтому по заявкам запилил все найденные мной госсайты а так же добавил все по заявкам.
Версия 1.3.0 — теперь расширение поддерживает сразу 28 государственных ресурсов.
⚠️Главное изменение — появилось нормальное окно настроек. В нём можно отдельно включить нужные сайты и найти ресурс через поиск. По умолчанию расширение по-прежнему работает только на сайтах ФССП, Госавтоинспекции и МВД, поэтому после обновления оно не начнёт вмешиваться в работу остальных страниц без разрешения пользователя.
Добавил 25 новых ресурсов: Госуслуги, ФНС России, Росреестр, Социальный фонд России, Роспотребнадзор, Роструд, Онлайнинспекция.рф, «Работа России», Генеральная прокуратура, Следственный комитет, ГАС «Правосудие», Арбитражные суды, Картотека арбитражных дел, «Мой арбитр», ЕИС «Закупки», портал проектов нормативных актов, портал государственных учреждений, Роскомнадзор, реестры Роскомнадзора, Росздравнадзор, Федеральная таможенная служба, Министерство юстиции, портал госслужбы, Судебный департамент и Военное следственное управление.
Настройки хранятся локально в браузере. Расширение не отправляет содержимое страниц, введённые данные или список выбранных сайтов на внешние серверы. Скрипт запускается только на тех ресурсах, которые пользователь включил самостоятельно.
Заодно добавил историю версий — она открывается по кнопке i прямо в окне расширения. Теперь там можно посмотреть список изменений без поисков старых постов. Если на каком-то из добавленных сайтов вставка или копирование всё ещё блокируются — напишите адрес страницы в комментариях.
📦 Скачать можно здесь:
💬 Обратная связь
Если знаете другие официальные сайты, на которых отключены копирование, выделение текста или вставка через Ctrl+V, — напишите в комментариях.
Буду благодарен, если проверите расширение на разных формах и напишете, где оно работает или требует доработки.
Продолжаю разрабатывать Action-Satisfying Roguelike. Игра полностью без готовых ассетов (все генерируется в коде), мир процедурный, динамический. В этот раз сильно переработал окружение и левел дизайн. Смысл игры в том, что игрок должен получать наслаждения от каждого действия, мир будет динамическим и мельчайшими деталями реагировать на действия игрока.
Проект разрабатывается в полете мысли, без точной сформированной идеи финального видения игры, поэтому нет четких рамок и прям полноценного цикла разработки.
Соответственно публиковаться в стиме не будет, бесплатно можно будет поиграть на разных открытых платформах прямо в браузере.
Еднитсвенное небольшое упрощение при разработке игры это THREEJS. Однако я все-таки отмечу, что это лишь небольшое упрощение и не является игровым движком, просто упрощает рендер и многие вещи, движок все равно приходится писать надстройкой.
Надеюсь понятно преподнес контекст. Все сделано кодом, анимации, модели, и прочее (математически и процедурно). Ничего готового, никаких визуальных редакторов и прочего, никаких картинок или звуков, все внутри кода.
Сразу немного видео геймплея без дополнительных вводных:
Переехал с версии Threejs r128 на r185 (последняя). Подумал, что может пригодятся какие-то современные приблуды. Переезд был не таким простым, много чего отвалилось, в том числе цветовые схемы, шейдеры и прочее. Ну ничего, все успешно было восстановлено.
Также было много измнений объектов окружения и деталей. Вроде деревьев, на которых теперь висят маслянные фонари, которые освещают мягким теплым светом. Под деревьями добавил опавшие листья.
Ну кстати объектов окружения стало слишком много, поэтому переписал алгоритм процедурной генерации и создал систему взаимодействия окружения между собой. Например условно трава может расти под деревом, а вот дерево из камня расти не может. Ну вы поняли, короче система в которой формируются приоритеты и занятые слоты пространства, либо слоты, которые разрешают размещение только определенных объектов.
Изменил генерацию забора и прилегающих к нему колонн. Теперь они выглядят более ветшалыми, кривыми, потасканные временем, с налетом ржавчины, пыль, грязи и т.д. Также повреждения геометрии в виде искревления, сколов и прочего.
Переработал глобальное освещение, теперь появился объем и глубина.


Добавил асинхронную генерацию мира. Сейчас кстати это не так быстро происходит, мир генерируется секунд 10-15, это занимает именно процедурная генерация. Поправлю этот момент. Явно не мир майнкрафта, чтобы так долго генерить.
оптимизация производительности
добавил эффект ветра, теперь во время ветра колышит траву, летают разные частицы по карте вроде засохших листьев, пыли и тд, также фонари качаются при ветре
добавил наземную фауну жуков, которых аж 3 вида, даже аналог сороконожки есть с механикой движения тела, при приближении к ним они разбегаются в разные стороны
добавил воронов. Они летают по разным точкам вроде веток дерьвьев, также могут сесть на землю и искать там червячков, ходить туда-обратно, также пугаются если подойти к ним слишком близко и улетают
переделаны могильные плиты. Теперь они множества видов и форм, имеют уникальные потрепанные временем тестуры. Также есть зачатки других прилегающих объектов в ним вроде вырытой ямы и кучи земли.
ну и фонари могут также стоять на земле рядом могильными плитами
немного переделал шейдер модели слизи и разнообразил визуал. Модель одна - вариаций бесконечное множество из-за цветов, размеров, разных наростов и прочего.
Переделал UI главного меню и прокачки скиллов
Самый первый концепт (более месяца назад):
Немного позже, уже начинает формироваться видение:
А вот геймлей 1.5 недели назад:
🛠 Продолжаю делать небольшие расширения, каждое из которых решает одну конкретную проблему.
На этот раз столкнулся с формами на сайтах ФССП, Госавтоинспекции и МВД. В некоторых полях нельзя нормально вставить заранее подготовленный текст.
Нажимаешь привычный Ctrl+V — и ничего не происходит.
Иногда вместе со вставкой блокируются копирование, выделение текста и контекстное меню.
⌨️ Можно, конечно, каждый раз перепечатывать заявление вручную. Особенно весело, если там ФИО, номера документов, адреса и текст на несколько абзацев.
Но мы пойдём другим путём.
🧩 Что я сделал
Создал небольшое расширение для Chrome, которое возвращает стандартное поведение браузера.
Расширение:
✅ разрешает обычную вставку через Ctrl+V;
✅ возвращает копирование и вырезание;
✅ позволяет выделять текст;
✅ возвращает контекстное меню;
✅ работает с динамически появляющимися полями;
✅ поддерживает встроенные фреймы.
🌐 Поддерживаемые сайты
госавтоинспекция.рф
мвд.рф
их поддомены.
🚀 Как пользоваться
Никаких дополнительных кнопок или отдельного интерфейса нет:
Устанавливаете расширение.
Открываете нужную форму.
Пользуетесь обычными командами браузера.
Ctrl+V, Ctrl+C, выделение текста и контекстное меню снова работают привычным образом.





🔒 Безопасность и приватность
Расширение:
не читает содержимое буфера обмена;
не собирает введённые данные;
ничего никуда не отправляет;
не содержит аналитики;
не требует регистрации;
не выполняет фоновые запросы;
не загружает удалённый код.
Всё выполняется локально в браузере. Скрипт запускается только на перечисленных выше сайтах.
⚠️ Важное уточнение
Расширение не связано с государственными органами и не является их официальным продуктом. Оно не запрашивает доступ ко всем сайтам — только к доменам ФССП, Госавтоинспекции и МВД.
Оно не заполняет и не отправляет обращения автоматически — только снимает искусственную блокировку стандартных функций браузера.
📦 Установка
Расширение опубликовано в Chrome Web Store:
💬 Обратная связь
Если знаете другие официальные сайты, на которых отключены копирование, выделение текста или вставка через Ctrl+V, — напишите в комментариях.
Посмотрю, можно ли аккуратно добавить их поддержку, не выдавая расширению доступ ко всему интернету.
Буду благодарен, если проверите расширение на разных формах и напишете, где оно работает или требует доработки.
В 2026 году в React появился хук use(), который меняет подход к работе с асинхронными данными и контекстом. Он входит в состав React 19 и уже доступен в стабильной версии.
Раньше загрузка данных в компоненте требовала написания однотипного кода:
useState для хранения данных
useState для состояния загрузки
useState для ошибки
useEffect для выполнения запроса
Ручное обновление всех состояний
Этот подход работал, но создавал много шаблонного кода и размазывал логику по разным хукам.
use() -это хук, который принимает промис и «разворачивает» его прямо в теле компонента. Если промис ещё не завершился, React приостанавливает рендеринг компонента. Когда промис резолвится, компонент перерендеривается с полученными данными.
import { use, Suspense } from 'react';
function UserProfile({ userId })
{ const user = use(fetchUser(userId));
return <div>{user.name}</div>; }
Здесь fetchUser(userId) возвращает промис. use() блокирует рендеринг до тех пор, пока этот промис не будет разрешён.
Роль Suspense
Для корректной работы use() необходимо использовать компонент Suspense. Он отлавливает состояние «приостановки» дочернего компонента и показывает fallback-интерфейс.
function App()
{ return
( <Suspense fallback={<div>Загрузка...</div>}>
<UserProfile userId="123" />
</Suspense> ); }
Пока UserProfile ожидает данные, пользователь видит сообщение «Загрузка...». После завершения запроса fallback заменяется на готовый UI.
Обработка ошибок
Ошибки, возникающие внутри use(), не обрабатываются автоматически. Для их перехвата используется ErrorBoundary — компонент, который ловит ошибки в дочерних компонентах.
<ErrorBoundaryfallback={<div>Ошибка загрузки</div>}>
<Suspense fallback={<div>Загрузка...</div>}>
<UserProfile userId="123" />
</Suspense>
</ErrorBoundary>
Это стандартный для React подход к обработке ошибок.
use() не создаёт новый запрос при каждом рендере. Если переданный промис уже был разрешён, use() возвращает данные мгновенно.
use() можно вызывать условно. В отличие от useContext, use() не требует, чтобы хук вызывался всегда в одном и том же порядке.
const theme = isDark ? use(ThemeContext) : 'light';
use() можно использовать не только с промисами. Он также работает с контекстом, что делает его универсальным инструментом для чтения данных в компоненте.
Без use() (традиционный способ):
function UserProfile({ userId })
{ const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => { fetchUser(userId) .then(setUser) .catch(setError) .finally(() => setLoading(false));
}, [userId]);
if (loading) return <div>Загрузка...</div>;
if (error) throw error;
return
<div>{user.name}</div>; }
С use() (новый способ):
function UserProfile({ userId })
{ const user = use(fetchUser(userId));
return <div>{user.name}</div>; }
Код сокращается в 3–4 раза, логика становится декларативной.
use() — это новый инструмент в экосистеме React, который делает код более читаемым и предсказуемым. В сочетании с Suspense и ErrorBoundary он позволяет строить компоненты, которые описывают что должно отображаться, а не как это должно загружаться. Это шаг в сторону декларативной модели, к которой React стремится с момента своего появления.
Если вам интересна тема веб-разработки, я также публикую разборы других кейсов в своем Telegram-канале и на Максе. Буду рад единомышленникам.
Microsoft наконец-то переписала компилятор на Go, заодно добавила многопоточность.
Почему именно GO,а не C# или Rust.
Синтаксис Go очень похож на JavaScript, что упростило буквальный "построчный" перенос 14-летней кодовой базы, сохранив всю его сложную логику без единого бага.
В отличие от Rust, в Go есть сборщик мусора, и для TypeScript оказалось выгоднее просто отключать его во время компиляции.
Go создан для эффективной работы с многопоточностью, что дало примерно половину прироста в производительности (вторая половина - от нативного машинного кода)
Что же это дало =>
VS Code собирается не за 125 секунд, а за 10.6, Playwright - с 12.8 секунд до 1.47.
Памяти при этом ест на 18–26% меньше. Ошибки в редакторе теперь появляются почти мгновенно, а не через 17 секунд.
По итогу ts,стал в 8–12 раз быстрее.
TypeScript 7.0 - это не просто "поставил и забыл". Есть несколько важных изменений, которые могут задеть старые проекты :
Строгий режим включен по умолчанию. Это хорошо для новых проектов, но на старых может вызвать сотни новых ошибок типов.
Убрана поддержка устаревшего. Больше нельзя компилировать под ES5, использовать старые модульные системы (AMD, UMD, SystemJS) и некоторые устаревшие опции в tsconfig.json.
Для инструментов API пока нет. Стабильный программный API для работы с компилятором появится только в TypeScript 7.1. Поэтому сейчас TypeScript 6 и 7 могут работать параллельно в одном проекте через специальный пакет совместимости
Если вам интересна тема веб-разработки, я также публикую разборы других кейсов в своем Telegram-канале и на Максе. Буду рад единомышленникам.
Tailwind Labs уволила 75% инженеров .
Причина: AI-ассистенты (Copilot, Cursor, Claude) перехватили трафик документации -разработчики больше не заходят на сайт за примерами кода, а получают их прямо в IDE. Трафик документации упал на 40–50%, а продажи Tailwind UI (основной источник дохода, 80–90% выручки) обвалились почти на 80% .
Парадокс: AI помогал писать код с Tailwind, но убил бизнес-модель самой компании . 2026-й — год, когда AI начал ломать бизнесы, которые он же ускорял.
Если вам интересна тема веб-разработки, я также публикую разборы других кейсов в своем Telegram-канале и на Максе. Буду рад единомышленникам