fix(math6): запускать init() после экспортов хелперов в window
Реальная причина пустых §1 (заглушки) во всех главах: в math6_engine.js вызов init() стоял ВЫШЕ строк window.makeCard=…/secNav=…. При обычной загрузке через defer скрипт исполняется при readyState='interactive', поэтому ветка `else init()` срабатывала синхронно — init→goTo→buildP1() звал makeCard ДО его экспорта → ReferenceError 'makeCard is not defined' → перехват в ensureBuilt → заглушка. В jsdom-тестах баг не воспроизводился (там старт шёл через DOMContentLoaded, экспорты успевали). - init() теперь вызывается СТРОГО после всех window.* экспортов. - ensureBuilt перечитывает window.M6 (надёжнее против устаревшего замыкания). - html учебника всегда no-store (убрал кэш-причину стале-страниц). - регресс-тест: init() обязан идти после window.makeCard. Тесты 18/18. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,14 @@ const CHAPTERS = [
|
||||
{ file: 'math_6_ch6.html', cards: 6 }
|
||||
];
|
||||
|
||||
test('engine: init() вызывается ПОСЛЕ экспортов (guard от sync-defer бага makeCard)', () => {
|
||||
const src = readF('frontend/js/math6_engine.js');
|
||||
const exportIdx = src.indexOf('window.makeCard = makeCard');
|
||||
const initCallIdx = src.lastIndexOf('else init();');
|
||||
assert.ok(exportIdx > 0, 'есть экспорт window.makeCard');
|
||||
assert.ok(initCallIdx > exportIdx, 'else init() должен идти ПОСЛЕ window.makeCard = makeCard (иначе билдеры упадут с ReferenceError при defer-старте)');
|
||||
});
|
||||
|
||||
for (const ch of CHAPTERS) {
|
||||
test(`${ch.file}: SPA без ошибок, ${ch.cards} карточек, активен § 1`, async () => {
|
||||
const { doc, errors } = await loadDom(ch.file);
|
||||
|
||||
Reference in New Issue
Block a user