[{"data":1,"prerenderedAt":86},["ShallowReactive",2],{"init-db":3,"content-\u002Fblog\u002Fclimate-composable":4},true,{"id":5,"title":6,"body":7,"date":77,"description":78,"extension":79,"meta":80,"navigation":3,"path":81,"seo":82,"sitemap":83,"stem":84,"__hash__":85},"blog\u002Fblog\u002Fclimate-composable.md","8760 часов погоды без тормозов: Архитектура климата KIB4D",{"type":8,"value":9,"toc":70},"minimark",[10,14,18,21,24,29,32,35,38,41,45,48,56,60,67],[11,12,6],"h1",{"id":13},"_8760-часов-погоды-без-тормозов-архитектура-климата-kib4d",[15,16,17],"p",{},"Пока руки отдыхают от кладки блоков, продолжаю продумывать архитектуру будущего обновления. Хочу рассказать, как планирую сделать компонент, который будет отдавать погодные данные для годовой симуляции — без кнопки «Рассчитать» и без зависания вкладки.",[15,19,20],{},"Когда меняешь статичный расчет на годовой, сразу встает вопрос с объемом данных. Год — это 8760 часов, и для каждого часа нужны температура и влажность на улице. Это два массива по 8760 значений на один город — итого 17 520 чисел. А городов в списке не один десяток.",[15,22,23],{},"Вот как планирую решить эту задачу, чтобы интерфейс оставался легким.",[25,26,28],"h2",{"id":27},"что-на-самом-деле-тормозит-и-что-нет","Что на самом деле тормозит (и что нет)",[15,30,31],{},"Первая мысль была — написать Web Worker, чтобы вынести тяжелый расчет в отдельный поток браузера и не блокировать интерфейс.",[15,33,34],{},"Прогнал бенчмарк на расчете теплопотерь — цикл на 8760 итераций уложился в 0–3 миллисекунды. Для влагонакопления функций больше (поиск давления пара по таблице, учет диффузии по слоям), так что время наверняка будет выше, но пока непонятно насколько. Экран обновляется примерно каждые 16.6 мс (60 Гц), так что даже если расчет займет 10–15 мс, это все равно должно укладываться в один кадр и будет работать «бесшовно». Так что Web Worker, скорее всего, не понадобится — расчет можно оставить в основном потоке, без усложнения кода.",[15,36,37],{},"А вот что действительно может тормозить — это не сам расчет, а загрузка данных из сети. Скачивание файла погоды для выбранного города — вот тут задержка в секунду-две вполне реальна, и заставлять пользователя ждать после каждого клика по списку городов не хочется.",[15,39,40],{},"Поэтому планирую сделать «тихую» фоновую загрузку: при открытии страницы калькулятор сразу, не дожидаясь действий пользователя, начинает подгружать климатический массив для города по умолчанию (например, Москвы) и держит его в памяти. К моменту, когда пользователь достроил пирог стены, данные уже на месте, и расчет пересчитывается практически мгновенно.",[25,42,44],{"id":43},"что-делать-со-случайными-кликами","Что делать со случайными кликами",[15,46,47],{},"Отдельный вопрос — что если пользователь ищет свой город и промахивается, например, ткнул в Самару, а через полсекунды выбрал Питер. Если слать запросы один за другим без контроля, браузер начнет качать лишнее, это не порядок.",[15,49,50,51,55],{},"Чтобы так не было, планирую использовать встроенный в браузер ",[52,53,54],"code",{},"AbortController"," — при выборе нового города старый незавершенный запрос будет сразу отменяться. Плюс может иметь место небольшая задержка (debounce) в пару сотен миллисекунд, посмотим по итогу реализации и тестирования.",[25,57,59],{"id":58},"куда-сложить-всю-эту-логику","Куда сложить всю эту логику",[15,61,62,63,66],{},"Чтобы код страницы не превратился в кашу, всю работу с климатом — загрузку, отмену запросов, хранение в памяти — хочу вынести в отдельный модуль (в Nuxt это composable-функция, условно ",[52,64,65],{},"useToolClimate","). Тогда для инструментов климат будет выглядеть как черный ящик: страница просто просит погоду для города X, а модуль сам разбирается с сетью и отдает готовый массив. Такой модуль потом можно будет переиспользовать и в калькуляторе полов, и в расчете вентиляции, не переписывая логику заново.",[15,68,69],{},"Пока все это на уровне архитектурного плана, буду делиться, что получится на практике.",{"title":71,"searchDepth":72,"depth":72,"links":73},"",2,[74,75,76],{"id":27,"depth":72,"text":28},{"id":43,"depth":72,"text":44},{"id":58,"depth":72,"text":59},"2026-08-18","Планирую компонент, который отдает погодные данные для годовой симуляции — без Web Worker, с фоновой подгрузкой и отменой лишних запросов.","md",{},"\u002Fblog\u002Fclimate-composable",{"title":6,"description":78},{"loc":81},"blog\u002Fclimate-composable","SEaVnbrv1Je1tppVXQSek15nqVtwJ6KcbvD9PkwJbyU",1787293109309]