Skip to content

gramax-cli v46--custom-css вызывает зависание браузера #870

Description

@copilottest20250717

Describe the bug

Баг: gramax-cli v46--custom-css вызывает зависание браузера

Версия: 1.0.46
Компонент: статическая сборка (gramax-cli build --custom-css)
Статус: открыт


Описание

При использовании флага --custom-css gramax-cli v46 генерирует в HTML <script> с функцией loadAndMoveStyles. После инлайн-копирования CSS запускается MutationObserver:

function startObserving() {
    var obs = new MutationObserver(function () {
        ensureStyleLast();  // перемещает <style id="dynamic-styles"> в конец <head>
    });
    obs.observe(document.head, { childList: true });
    setTimeout(function () { obs.disconnect(); }, 10000);
}

function ensureStyleLast() {
    var style = document.getElementById("dynamic-styles");
    if (document.head.lastElementChild !== style) {
        document.head.appendChild(style);  // ← мутация
    }
}

Stacktrace / Markdown (Optional)

No response

Expected behavior (Optional)

Баг: gramax-cli v46--custom-css вызывает зависание браузера

Версия: 1.0.46
Компонент: статическая сборка (gramax-cli build --custom-css)
Статус: открыт


Описание

При использовании флага --custom-css gramax-cli v46 генерирует в HTML <script> с функцией loadAndMoveStyles. После инлайн-копирования CSS запускается MutationObserver:

function startObserving() {
    var obs = new MutationObserver(function () {
        ensureStyleLast();  // перемещает <style id="dynamic-styles"> в конец <head>
    });
    obs.observe(document.head, { childList: true });
    setTimeout(function () { obs.disconnect(); }, 10000);
}

function ensureStyleLast() {
    var style = document.getElementById("dynamic-styles");
    if (document.head.lastElementChild !== style) {
        document.head.appendChild(style);  // ← мутация
    }
}

ensureStyleLast вызывает appendChild при каждом добавлении стилей React/emotion в <head>. Это создаёт новую мутацию, повторно триггерящую observer. Возникает цикл, браузер зависает. Даже пустой portal.css воспроизводит проблему.

Воспроизведение

gramax-cli build --source . --destination ./build/html --custom-css portal.css
npx serve build/html
# открыть в браузере — страница не загружается

Ожидаемое поведение

Страница загружается, кастомные стили применены, браузер не зависает.

Workaround (реализован в inject-search.js)

На этапе пост-процессинга функция startObserving() заменяется на no-op:

function startObserving() {}

Metadata

Metadata

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions