Обновление файла
This commit is contained in:
@@ -1,30 +1,30 @@
|
||||
// VNC-консоль через noVNC.
|
||||
//
|
||||
// noVNC — UMD/IIFE-библиотека, она не экспортирует ES-модули, поэтому
|
||||
// подключаем её через <script> (лежит в /novnc/rfb.js, копируется из
|
||||
// node_modules/@novnc/novnc/lib на этапе сборки Docker-образа).
|
||||
// В noVNC 1.4.0 основной модуль — это ES-модуль (core/rfb.js), который
|
||||
// экспортирует класс RFB через `export default`. Грузим его через
|
||||
// динамический import(). Скрипт и его зависимости (vendor/, utils/,
|
||||
// core/inflator.js и т.п.) лежат в /novnc/* внутри nginx-контейнера —
|
||||
// собирается в Docker-образе из GitHub release (см. frontend/Dockerfile).
|
||||
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { api } from "../api.js";
|
||||
|
||||
const NOVNC_SCRIPT = "/novnc/rfb.js";
|
||||
// @vite-ignore — запрещаем Vite пытаться разрешить путь на этапе сборки,
|
||||
// иначе он упадёт, не найдя модуль в локальной файловой системе.
|
||||
const NOVNC_MODULE_URL = "/novnc/core/rfb.js";
|
||||
|
||||
let scriptPromise = null;
|
||||
let modulePromise = null;
|
||||
|
||||
function loadNoVNC() {
|
||||
if (typeof window !== "undefined" && window.RFB) {
|
||||
return Promise.resolve(window.RFB);
|
||||
}
|
||||
if (scriptPromise) return scriptPromise;
|
||||
scriptPromise = new Promise((resolve, reject) => {
|
||||
const script = document.createElement("script");
|
||||
script.src = NOVNC_SCRIPT;
|
||||
script.async = true;
|
||||
script.onload = () => (window.RFB ? resolve(window.RFB) : reject(new Error("RFB не найден после загрузки скрипта")));
|
||||
script.onerror = () => reject(new Error(`Не удалось загрузить ${NOVNC_SCRIPT}`));
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
return scriptPromise;
|
||||
if (modulePromise) return modulePromise;
|
||||
modulePromise = import(/* @vite-ignore */ NOVNC_MODULE_URL)
|
||||
.then((mod) => {
|
||||
if (!mod.default) {
|
||||
throw new Error("RFB не найден в модуле noVNC");
|
||||
}
|
||||
return mod.default;
|
||||
});
|
||||
return modulePromise;
|
||||
}
|
||||
|
||||
export default function ConsoleViewer({ instanceId }) {
|
||||
@@ -83,4 +83,4 @@ export default function ConsoleViewer({ instanceId }) {
|
||||
<div className="console-frame" ref={containerRef} style={{ width: "100%", height: 480 }} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user