Обновление файла
This commit is contained in:
@@ -1,30 +1,30 @@
|
|||||||
// VNC-консоль через noVNC.
|
// VNC-консоль через noVNC.
|
||||||
//
|
//
|
||||||
// noVNC — UMD/IIFE-библиотека, она не экспортирует ES-модули, поэтому
|
// В noVNC 1.4.0 основной модуль — это ES-модуль (core/rfb.js), который
|
||||||
// подключаем её через <script> (лежит в /novnc/rfb.js, копируется из
|
// экспортирует класс RFB через `export default`. Грузим его через
|
||||||
// node_modules/@novnc/novnc/lib на этапе сборки Docker-образа).
|
// динамический import(). Скрипт и его зависимости (vendor/, utils/,
|
||||||
|
// core/inflator.js и т.п.) лежат в /novnc/* внутри nginx-контейнера —
|
||||||
|
// собирается в Docker-образе из GitHub release (см. frontend/Dockerfile).
|
||||||
|
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import { api } from "../api.js";
|
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() {
|
function loadNoVNC() {
|
||||||
if (typeof window !== "undefined" && window.RFB) {
|
if (modulePromise) return modulePromise;
|
||||||
return Promise.resolve(window.RFB);
|
modulePromise = import(/* @vite-ignore */ NOVNC_MODULE_URL)
|
||||||
|
.then((mod) => {
|
||||||
|
if (!mod.default) {
|
||||||
|
throw new Error("RFB не найден в модуле noVNC");
|
||||||
}
|
}
|
||||||
if (scriptPromise) return scriptPromise;
|
return mod.default;
|
||||||
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;
|
return modulePromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ConsoleViewer({ instanceId }) {
|
export default function ConsoleViewer({ instanceId }) {
|
||||||
|
|||||||
Reference in New Issue
Block a user