From 041fca449dc3025483e5b45dc340df9389908709 Mon Sep 17 00:00:00 2001 From: NikitaKalitov Date: Fri, 17 Jul 2026 11:12:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B0=D0=BB=D1=8C=D0=BD=D0=B5=D0=B9?= =?UTF-8?q?=D1=88=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B4=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/bitrix-integration.md | 1 + src/host/bitrixAdapter.ts | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/bitrix-integration.md b/docs/bitrix-integration.md index 6f6ef70..5d073e5 100644 --- a/docs/bitrix-integration.md +++ b/docs/bitrix-integration.md @@ -198,6 +198,7 @@ Backend не обязан ничего валидировать глубже « - `local/` уже существует как каталог для кастомного кода (`ai`, `components`, `modules`, `php_interface`, `templates` — по факту на дев-стенде). Новый подкаталог, например `local/diagram-app/`, вписывается в эту конвенцию и не пересекается с `local/modules`/`local/php_interface` — они у nginx явно помечены `internal` (заблокированы для прямого внешнего доступа), новый подкаталог под этот блок не попадает. - Нюанс: `index` на уровне сервера — `index.php`, не `index.html`. Открыть голый `/local/diagram-app/` (без имени файла) не выйдет — nginx попытается найти там `index.php` и не найдёт. Не проблема: PHP-класс (раздел 3) сам подставляет `src` у iframe, поэтому в `$appUrl` достаточно явно указывать файл — `/local/diagram-app/index.html`. - Так как приложение и портал теперь на одном домене, `VITE_BITRIX_ORIGIN`/`appOrigin` — это просто origin самого портала, а не адрес отдельного сервиса. +- **Важный нюанс, найден живым тестом на дев-стенде:** тот же regex-location в nginx, что раздаёт статику, ставит `.html`-файлам `Cache-Control: public` с `expires 30d`. Значит после **повторного** деплоя (обновили React-приложение, положили новый `dist/` поверх старого) браузеры, уже открывавшие `/local/diagram-app/index.html` раньше, могут до 30 дней получать из своего кэша старый `index.html` — а в нём старые хэши JS/CSS-файлов, которых уже нет на диске (404) или которые не соответствуют новой версии приложения. При первом же открытии URL это не проявляется (кэшировать ещё нечего), но при каждом обновлении приложения — да. Решение: в `$appUrl`/`src` iframe добавлять cache-busting query-параметр, привязанный к версии сборки (например, `?v=` или `?v=<дата билда>`), а не просто `/local/diagram-app/index.html` без параметров — тогда каждая новая версия получает свой URL и обходит браузерный кэш. То же самое верно и для самой страницы со свойством (если её тоже будете кэшировать). Порядок действий: diff --git a/src/host/bitrixAdapter.ts b/src/host/bitrixAdapter.ts index 56d8207..bb439fe 100644 --- a/src/host/bitrixAdapter.ts +++ b/src/host/bitrixAdapter.ts @@ -1,5 +1,5 @@ -import type { DiagramDocument } from '../types'; -import type { HostAdapter } from './HostAdapter'; +import type { DiagramDocument } from "../types"; +import type { HostAdapter } from "./HostAdapter"; /** * postMessage handshake with the Bitrix bridge script (see @@ -7,9 +7,9 @@ import type { HostAdapter } from './HostAdapter'; * concrete origin, never '*' — matches the security requirement from the * original design doc. */ -const READY_MESSAGE = 'diagram:ready'; -const INIT_MESSAGE = 'diagram:init'; -const CHANGE_MESSAGE = 'diagram:change'; +const READY_MESSAGE = "diagram:ready"; +const INIT_MESSAGE = "diagram:init"; +const CHANGE_MESSAGE = "diagram:change"; function getBitrixOrigin(): string { const origin = import.meta.env.VITE_BITRIX_ORIGIN; @@ -29,10 +29,11 @@ export function createBitrixAdapter(): HostAdapter { let delivered = false; function onMessage(event: MessageEvent) { - if (event.origin !== targetOrigin || event.source !== window.parent) return; + if (event.origin !== targetOrigin || event.source !== window.parent) + return; if (delivered || event.data?.type !== INIT_MESSAGE) return; delivered = true; - window.removeEventListener('message', onMessage); + window.removeEventListener("message", onMessage); const payload = event.data.payload as string | null | undefined; if (!payload) { @@ -46,11 +47,14 @@ export function createBitrixAdapter(): HostAdapter { } } - window.addEventListener('message', onMessage); + window.addEventListener("message", onMessage); window.parent.postMessage({ type: READY_MESSAGE }, targetOrigin); }, onChange(doc) { - window.parent.postMessage({ type: CHANGE_MESSAGE, payload: JSON.stringify(doc) }, targetOrigin); + window.parent.postMessage( + { type: CHANGE_MESSAGE, payload: JSON.stringify(doc) }, + targetOrigin, + ); }, }; }