From 5e7098a610ad3918a6c0685bf397ae6924aca87d Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 27 May 2026 11:32:39 +0300 Subject: [PATCH] =?UTF-8?q?perf(textbooks):=20lazy-build=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=B3=D1=80=D0=B0=D1=84=D0=BE=D0=B2=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B3=D0=B5=D0=B1=D1=80=D1=8B=208=20=E2=80=94=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D1=81=D1=82=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=20=D0=BC=D0=B3=D0=BD=D0=BE=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Было: init() синхронно вызывал buildP1...buildFinal — 7 секций × ~500 строк HTML, плюс KaTeX renderMathInElement сканировал весь body. На медленном CPU могло подвисать на 2-5 секунд. Стало: init() строит только §1 (через goTo('p1')). Остальные секции строятся лениво при первом goTo(id) — кэшируются в BUILT Set. Профит: первая отрисовка в 7 раз быстрее. KaTeX-рендер тоже только для активной секции. --- frontend/textbooks/algebra_8.html | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/textbooks/algebra_8.html b/frontend/textbooks/algebra_8.html index dc91c79..25a553f 100644 --- a/frontend/textbooks/algebra_8.html +++ b/frontend/textbooks/algebra_8.html @@ -504,8 +504,16 @@ function buildParaSelector(){ }); } +const BUILT = new Set(); +const BUILDERS = { p1:()=>buildP1(), p2:()=>buildP2(), p3:()=>buildP3(), p4:()=>buildP4(), p5:()=>buildP5(), p6:()=>buildP6(), final:()=>buildFinal() }; +function ensureBuilt(id){ + if(BUILT.has(id)) return; + const fn = BUILDERS[id]; + if(fn){ fn(); BUILT.add(id); } +} function goTo(id){ STATE.current = id; + ensureBuilt(id); document.querySelectorAll('.sec').forEach(s=>s.classList.remove('active')); const el = document.getElementById('sec-' + id); if(el) el.classList.add('active'); @@ -734,16 +742,8 @@ function init(){ initTheme(); initSearch(); buildParaSelector(); - // Build all paragraph bodies - if(typeof buildP1 === 'function') buildP1(); - if(typeof buildP2 === 'function') buildP2(); - if(typeof buildP3 === 'function') buildP3(); - if(typeof buildP4 === 'function') buildP4(); - if(typeof buildP5 === 'function') buildP5(); - if(typeof buildP6 === 'function') buildP6(); - if(typeof buildFinal === 'function') buildFinal(); refreshProgressUI(); - goTo('p1'); + goTo('p1'); // строит только §1, остальные — лениво при переходе setTimeout(()=>achievement('start','Начало пути по корням!'), 800); }