From 44067efdb61a4a448d29422d3267607a983ab833 Mon Sep 17 00:00:00 2001 From: Jaakko Vanhala Date: Thu, 9 Apr 2026 21:24:08 +0300 Subject: [PATCH] =?UTF-8?q?Monaco-lataus=20refaktoroitu:=20singleton=20Pro?= =?UTF-8?q?mise,=20parempi=20virheenk=C3=A4sittely?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit initMonaco palauttaa nyt aina saman Promisen (ei moninkertaista latausta). AMD-loader virheet ja CDN-virheet napataan ja logitetaan. monacoLoaded-lippu korvattu Promise-pohjaisella tilanhallinnalla. Co-Authored-By: Claude Opus 4.6 (1M context) --- network-poc/frontend/src/pages/index.astro | 30 ++++++++++++---------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/network-poc/frontend/src/pages/index.astro b/network-poc/frontend/src/pages/index.astro index 6b2def3..c042813 100644 --- a/network-poc/frontend/src/pages/index.astro +++ b/network-poc/frontend/src/pages/index.astro @@ -57,7 +57,6 @@ import AgentBar from "../components/AgentBar.astro"; } // === Globaalit tilat === - let monacoLoaded = false; // === Tab switching === window.switchTab = function(tab) { @@ -545,26 +544,29 @@ import AgentBar from "../components/AgentBar.astro"; // === Monaco Editor (lazy load) === window.MonacoEnvironment = { getWorkerUrl: () => `data:text/javascript,self.MonacoEnvironment={baseUrl:'https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/'};importScripts('https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs/base/worker/workerMain.js')` }; - async function initMonaco() { - if (monacoLoaded) return; - monacoLoaded = true; - await new Promise(r => { + let _monacoInitPromise = null; + function initMonaco() { + if (_monacoInitPromise) return _monacoInitPromise; + _monacoInitPromise = new Promise((resolve, reject) => { const s = document.createElement('script'); s.src = 'https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs/loader.js'; + s.onerror = () => reject(new Error('Monaco loader lataus epäonnistui')); s.onload = () => { require.config({ paths: { vs: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs' }}); require(['vs/editor/editor.main'], () => { - window.monaco = monaco; // Varmistetaan globaali - r(); - }); + window.monaco = monaco; + window._monaco = monaco.editor.create(document.getElementById('monaco-container'), { + value: '// Valitse tiedosto tai generoi projekti\n', + language: 'plaintext', theme: 'vs-dark', fontSize: 14, + minimap: { enabled: false }, automaticLayout: true, padding: { top: 10 } + }); + console.log('[Monaco] Valmis'); + resolve(); + }, (err) => reject(new Error('Monaco AMD load: ' + err))); }; document.head.appendChild(s); }); - window._monaco = window.monaco.editor.create(document.getElementById('monaco-container'), { - value: '// Valitse tiedosto tai generoi projekti\n', - language: 'plaintext', theme: 'vs-dark', fontSize: 14, - minimap: { enabled: false }, automaticLayout: true, padding: { top: 10 } - }); + return _monacoInitPromise; } window._editorModels = {}; @@ -572,7 +574,7 @@ import AgentBar from "../components/AgentBar.astro"; window.openInEditor = async function(files) { switchTab('editor'); - await initMonaco(); + try { await initMonaco(); } catch(e) { console.error('Monaco-virhe:', e); return; } const m = window.monaco; if (!m) { console.error('Monaco ei latautunut'); return; } for (const [name,code] of Object.entries(files)) {