From 201e94ea8193afca243f55b2215a2e5d45d45754 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 15:06:40 +0300 Subject: [PATCH] =?UTF-8?q?fix(lab-content-engine):=20phase=203=20-=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=80=D0=B0=D0=BD=D1=91=D0=BD=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA=D0=B5=D1=80=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20(lo?= =?UTF-8?q?ader=20=D0=BD=D0=B5=20=D0=B1=D1=8B=D0=BB=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D1=91=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Два edit'а Фазы 3 не применились в fc1139f (упали по отступу), запушив сломанное состояние: lab.html убрал eager sim-скрипты, но open остался синхронным -> ReferenceError при клике на любую симуляцию кроме graph. ИСПРАВЛЕНО: - _register-all.js: open-обёртка LabLoader.ensure(id).then(rawOpen) + sync-фолбэк - lab-init.js openSim: обработка Promise от open() (.then -> lucide, .catch -> log) E2E vm-harness: click->ensure->load->rawOpen после загрузки; pendulum/stereo:cube/ molphys(4 файла)/alias magnetic — ALL PASS; node --check OK. Независимое ревью поймало этот блокер. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/labs/_register-all.js | 12 +++++++++++- frontend/js/labs/lab-init.js | 15 ++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/frontend/js/labs/_register-all.js b/frontend/js/labs/_register-all.js index a31b376..c6ddd1b 100644 --- a/frontend/js/labs/_register-all.js +++ b/frontend/js/labs/_register-all.js @@ -82,7 +82,17 @@ desc: s.desc, preview: s.preview, // уже готовая SVG-строка (P_* вычислены в SIMS) theory: T[s.id] || null, - open: open + // Фаза 3: ленивая загрузка кода. LabLoader.ensure(id) подгружает файлы + // симуляции (+ three.js при необходимости), затем выполняется raw-open. + // Если LabLoader недоступен — открываем синхронно как раньше (фолбэк). + open: (function (rawOpen, simId) { + return function (c) { + if (window.LabLoader && window.LabLoader.ensure) { + return window.LabLoader.ensure(simId).then(function () { rawOpen(c); }); + } + rawOpen(c); + }; + })(open, s.id) // stop/destroy: глобальный «дробовик» _pauseAllSims()/closeSim() — паритет }); }); diff --git a/frontend/js/labs/lab-init.js b/frontend/js/labs/lab-init.js index 1986a83..d9eda90 100644 --- a/frontend/js/labs/lab-init.js +++ b/frontend/js/labs/lab-init.js @@ -116,9 +116,18 @@ const _m = window.LabRegistry.get(_cid); const _arg = _cid.includes(':') ? _cid.split(':')[1] : undefined; window.LabRegistry.setActive(_m); - try { _m.open({ id: _cid, arg: _arg }); } - catch (e) { console.error('[LabRegistry] open failed:', _cid, e); } - if (window.lucide) lucide.createIcons(); + // Фаза 3: open() может вернуть Promise (ленивая загрузка кода). Иконки + // перерисовываем после фактической инициализации тела симуляции; ошибку + // асинхронной загрузки ловим через .catch (sync try/catch её не поймает). + try { + const _r = _m.open({ id: _cid, arg: _arg }); + if (_r && typeof _r.then === 'function') { + _r.then(function () { if (window.lucide) lucide.createIcons(); }) + .catch(function (e) { console.error('[LabRegistry] open failed:', _cid, e); }); + } else if (window.lucide) { + lucide.createIcons(); + } + } catch (e) { console.error('[LabRegistry] open failed:', _cid, e); } return; } if (window.console) console.warn('[LabRegistry] неизвестная симуляция:', id);