feat(lab-content-engine): phase 3 - ленивая загрузка кода симуляций

Старт /lab грузит только каркас (~530KB) вместо ~2.9MB + three.js(~600KB):
- _loader.js — LabLoader.ensure(id): грузит файлы симуляции по манифесту +
  three.js при необходимости; кеш по URL; САМОВОССТАНОВЛЕНИЕ (если open-функция
  не определена после загрузки — грузит все ленивые файлы -> корректность
  гарантирована независимо от точности манифеста)
- _sim_deps.js — сгенерированный манифест SIM_DEPS{id:{open,files,three}} +
  LAB_LAZY_FILES; three:true только для crystal/orbitals/stereo/periodic
- _register-all.js — open-обёртка: LabLoader.ensure(id).then(rawOpen)
- lab-init.js openSim — обработка Promise от open() (lucide после init)
- lab.html — убраны 45 ленивых <script> + three.js из eager; каркас: registry,
  loader, sim_deps, fx-движки, общие визуалы, graph.js (GRID для 15 сим)

Проверка: vm-harness (per-sim load, three only 3D, кеш, self-heal) ALL PASS;
инвариант owner-in-files для всех 40; нет утечки ленивых в eager; node --check OK.
В БРАУЗЕРЕ НЕ ПРОВЕРЕНО.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 15:02:29 +03:00
parent 6ea140af54
commit fc1139f51d
3 changed files with 391 additions and 53 deletions
+15 -53
View File
@@ -400,71 +400,33 @@
<script src="/js/api.js"></script>
<script src="/js/sidebar.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.149.0/build/three.min.js"></script>
<!-- ════════════════════════════════════════════════════════════════════════
Контент-движок, Фаза 3 — ЛЕНИВАЯ ЗАГРУЗКА КОДА СИМУЛЯЦИЙ.
На старте грузится только КАРКАС (~360 КБ): реестр, загрузчик, манифест,
fx-движки, общие визуалы (_phys_visuals/_chem_visuals/_graph_panel/_util),
graph.js (предоставляет GRID для 15 симуляций), lab-init/glue/register-all.
Код конкретной симуляции (~2.5 МБ суммарно) и three.js (~600 КБ) грузятся
по клику через LabLoader (см. _loader.js + _sim_deps.js). three.js — только
для 3D-симуляций (crystal/orbitals/stereo/periodic).
════════════════════════════════════════════════════════════════════════ -->
<script src="/js/labs/_registry.js"></script>
<script src="/js/labs/_loader.js"></script>
<script src="/js/labs/_sim_deps.js"></script>
<script src="/js/labs/_fx_core.js"></script>
<script src="/js/labs/_fx_particles.js"></script>
<script src="/js/labs/_fx_motion.js"></script>
<script src="/js/labs/_fx_sound.js"></script>
<script src="/js/labs/graph.js"></script>
<script src="/js/labs/_phys_visuals.js"></script>
<script src="/js/labs/emfield.js"></script>
<script src="/js/labs/triangle.js"></script>
<script src="/js/labs/_graph_panel.js"></script>
<script src="/js/labs/projectile.js"></script>
<script src="/js/labs/collision.js"></script>
<script src="/js/labs/gas.js"></script>
<script src="/js/labs/states.js"></script>
<script src="/js/labs/brownian.js"></script>
<script src="/js/labs/diffusion.js"></script>
<!-- coulomb.js removed: merged into emfield.js -->
<script src="/js/labs/circuit.js"></script>
<script src="/js/labs/_phys_visuals.js"></script>
<script src="/js/labs/_chem_visuals.js"></script>
<script src="/js/labs/reactions.js"></script>
<script src="/js/labs/flask.js"></script>
<script src="/js/labs/redox.js"></script>
<script src="/js/labs/ionexchange.js"></script>
<script src="/js/labs/stereo.js?v=10"></script>
<script src="/js/labs/_util.js"></script>
<script src="/js/labs/graph.js"></script>
<script src="/js/notifications.js"></script>
<script src="/js/search.js"></script>
<script src="/js/mobile.js"></script>
<script src="/js/labs/lab-init.js"></script>
<script src="/js/labs/lab-glue.js"></script>
<script src="/js/labs/newton.js"></script>
<script src="/js/labs/forcesandbox.js"></script>
<script src="/js/labs/angrybirds.js"></script>
<script src="/js/labs/waves.js"></script>
<script src="/js/labs/chemsandbox.js"></script>
<script src="/js/labs/stoichiometry.js"></script>
<script src="/js/labs/celldivision.js"></script>
<script src="/js/labs/photosynthesis.js"></script>
<script src="/js/labs/crystal.js"></script>
<script src="/js/labs/orbitals.js"></script>
<script src="/js/labs/trigcircle.js"></script>
<script src="/js/labs/_util.js"></script>
<script src="/js/labs/quadratic.js"></script>
<script src="/js/labs/normaldist.js"></script>
<script src="/js/labs/graphtransform.js"></script>
<script src="/js/labs/pendulum.js"></script>
<script src="/js/labs/equilibrium.js"></script>
<script src="/js/labs/opticsbench.js?v=10"></script>
<script src="/js/labs/isoprocess.js"></script>
<script src="/js/labs/titration.js"></script>
<script src="/js/labs/probability.js"></script>
<script src="/js/labs/bohratom.js"></script>
<script src="/js/labs/electrolysis.js"></script>
<script src="/js/labs/race.js"></script>
<script src="/js/labs/hydrostatics.js"></script>
<script src="/js/labs/radioactive.js"></script>
<script src="/js/labs/geometry.js"></script>
<script src="/js/labs/logic.js"></script>
<script src="/js/labs/heatengine.js"></script>
<script src="/js/labs/solutions.js" defer></script>
<script src="/js/labs/organic.js" defer></script>
<script src="/js/labs/_periodic_data.js" defer></script>
<script src="/js/labs/periodic.js" defer></script>
<script src="/js/labs/qualanalysis.js" defer></script>
<script src="/js/labs/_register-all.js" defer></script>
<script src="/js/labs/_register-all.js"></script>
<script>
/* Sync sound toggle button icon with localStorage state on load */
(function() {