92b5c39860
lab.html 4324L → 3499L (-825L). 824 lines of glue code moved. Position preserved: lab-glue.js loads after lab-init.js, before newton.js / forcesandbox.js / etc. — same execution order as inline. node --check passes. /lab returns 200. /js/labs/lab-glue.js returns 200. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
69 lines
3.5 KiB
Markdown
69 lines
3.5 KiB
Markdown
# Phase 2: Extract inline `<script>` glue → `frontend/js/labs/lab-glue.js`
|
||
|
||
**Status:** ✅ Done
|
||
**Parent plan:** [PLAN.md](./PLAN.md)
|
||
**Domain:** frontend
|
||
|
||
## Objective
|
||
|
||
Вынести 825L inline `<script>` блока (lines 4327-5152) из lab.html в отдельный `frontend/js/labs/lab-glue.js`. Этот блок содержит glue-код (sim-switcher logic, init helpers, event wiring). lab-init.js остаётся orchestrator'ом.
|
||
|
||
## Tasks
|
||
|
||
- [ ] Определить точные границы inline `<script>` блока (line 4327 start, find matching `</script>`)
|
||
- [ ] Создать `frontend/js/labs/lab-glue.js`
|
||
- [ ] Скопировать содержимое в lab-glue.js
|
||
- [ ] **Сохранить порядок загрузки**: lab-glue.js должен подгружаться ПОСЛЕ всех `labs/*.js` engine-модулей И ПЕРЕД `labs/lab-init.js` (или после — зависит от dependencies, проверить!)
|
||
- [ ] Удалить inline блок из lab.html
|
||
- [ ] Добавить `<script src="/js/labs/lab-glue.js"></script>` в правильное место
|
||
- [ ] Verify: page loads, `console.log` ошибок нет, sim-switcher работает
|
||
- [ ] Smoke: переключить 3-4 разных sim, проверить что render запускается
|
||
|
||
## Files to Modify/Create
|
||
|
||
- `frontend/js/labs/lab-glue.js` — NEW (~825L)
|
||
- `frontend/lab.html` — удалить inline `<script>` блок, добавить `<script src>` тег (net −823L)
|
||
|
||
## Acceptance Criteria
|
||
|
||
- lab.html без большого inline `<script>` блока на lines 4327-5152
|
||
- `/lab` отвечает 200
|
||
- No `ReferenceError` / `is not defined` в console (load-order правильный)
|
||
- Sim-switcher переключает sims корректно
|
||
- 5 любых симуляций инициализируются и рендерятся
|
||
|
||
## Notes
|
||
|
||
### Load-order анализ
|
||
|
||
Перед extract — проверить какие globals использует inline glue:
|
||
- Если использует `CollisionSim` (из engine-modules) → нужно загружаться ПОСЛЕ engine-modules
|
||
- Если использует `Lucide` (CDN) → после Lucide
|
||
- Если других inline-vars нет — безопасно вынести
|
||
|
||
### Watch for
|
||
|
||
- Inline `<script>` без `defer` атрибута выполняется sync — после переноса в external может выполниться раньше DOM ready. Возможно нужен `DOMContentLoaded` wrapper, либо `defer` атрибут.
|
||
- `window.xxx = ...` глобальные exports должны остаться (onclick handlers HTML on них опираются)
|
||
|
||
### Strategy
|
||
|
||
1. Read весь inline блок
|
||
2. Identify все function/var declarations
|
||
3. Скопировать как есть в lab-glue.js
|
||
4. Add at top: `'use strict';` если ещё нет
|
||
5. Тестировать пристально
|
||
|
||
## Review Checklist
|
||
|
||
- [ ] lab-glue.js загружается в правильном порядке (после engine modules)
|
||
- [ ] No console errors на /lab
|
||
- [ ] Sim-switcher работает (тест: переключить projectile → newton → chemsandbox)
|
||
- [ ] Все onclick handlers HTML работают
|
||
- [ ] No emoji в коде
|
||
- [ ] Pre-commit hook passes
|
||
|
||
## Handoff to Next Phase
|
||
|
||
<!-- Implementer фиксирует: где находится hash-router-точка-расширения (Phase 4 будет добавлять hashchange handler сюда). -->
|