Дальнейшая работа над интеграцией
This commit is contained in:
@@ -198,6 +198,7 @@ Backend не обязан ничего валидировать глубже «
|
|||||||
- `local/` уже существует как каталог для кастомного кода (`ai`, `components`, `modules`, `php_interface`, `templates` — по факту на дев-стенде). Новый подкаталог, например `local/diagram-app/`, вписывается в эту конвенцию и не пересекается с `local/modules`/`local/php_interface` — они у nginx явно помечены `internal` (заблокированы для прямого внешнего доступа), новый подкаталог под этот блок не попадает.
|
- `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`.
|
- Нюанс: `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 самого портала, а не адрес отдельного сервиса.
|
- Так как приложение и портал теперь на одном домене, `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=<git-hash>` или `?v=<дата билда>`), а не просто `/local/diagram-app/index.html` без параметров — тогда каждая новая версия получает свой URL и обходит браузерный кэш. То же самое верно и для самой страницы со свойством (если её тоже будете кэшировать).
|
||||||
|
|
||||||
Порядок действий:
|
Порядок действий:
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import type { DiagramDocument } from '../types';
|
import type { DiagramDocument } from "../types";
|
||||||
import type { HostAdapter } from './HostAdapter';
|
import type { HostAdapter } from "./HostAdapter";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* postMessage handshake with the Bitrix bridge script (see
|
* 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
|
* concrete origin, never '*' — matches the security requirement from the
|
||||||
* original design doc.
|
* original design doc.
|
||||||
*/
|
*/
|
||||||
const READY_MESSAGE = 'diagram:ready';
|
const READY_MESSAGE = "diagram:ready";
|
||||||
const INIT_MESSAGE = 'diagram:init';
|
const INIT_MESSAGE = "diagram:init";
|
||||||
const CHANGE_MESSAGE = 'diagram:change';
|
const CHANGE_MESSAGE = "diagram:change";
|
||||||
|
|
||||||
function getBitrixOrigin(): string {
|
function getBitrixOrigin(): string {
|
||||||
const origin = import.meta.env.VITE_BITRIX_ORIGIN;
|
const origin = import.meta.env.VITE_BITRIX_ORIGIN;
|
||||||
@@ -29,10 +29,11 @@ export function createBitrixAdapter(): HostAdapter {
|
|||||||
let delivered = false;
|
let delivered = false;
|
||||||
|
|
||||||
function onMessage(event: MessageEvent) {
|
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;
|
if (delivered || event.data?.type !== INIT_MESSAGE) return;
|
||||||
delivered = true;
|
delivered = true;
|
||||||
window.removeEventListener('message', onMessage);
|
window.removeEventListener("message", onMessage);
|
||||||
|
|
||||||
const payload = event.data.payload as string | null | undefined;
|
const payload = event.data.payload as string | null | undefined;
|
||||||
if (!payload) {
|
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);
|
window.parent.postMessage({ type: READY_MESSAGE }, targetOrigin);
|
||||||
},
|
},
|
||||||
onChange(doc) {
|
onChange(doc) {
|
||||||
window.parent.postMessage({ type: CHANGE_MESSAGE, payload: JSON.stringify(doc) }, targetOrigin);
|
window.parent.postMessage(
|
||||||
|
{ type: CHANGE_MESSAGE, payload: JSON.stringify(doc) },
|
||||||
|
targetOrigin,
|
||||||
|
);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user