Skip to content

Commit 0b4bcb8

Browse files
authored
chore: fix demo in website (#292)
1 parent e8ab89a commit 0b4bcb8

File tree

1 file changed

+77
-25
lines changed

1 file changed

+77
-25
lines changed

docs/.vitepress/theme/components/monaco/monaco-loader.mjs

Lines changed: 77 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
/* globals MONACO_EDITOR_VERSION */
2+
3+
function importFromCDN(path) {
4+
return import(/* @vite-ignore */ path)
5+
}
6+
27
async function setupMonaco() {
38
if (typeof window !== "undefined") {
49
const monacoScript =
@@ -7,7 +12,9 @@ async function setupMonaco() {
712
script.src &&
813
script.src.includes("monaco") &&
914
script.src.includes("vs/loader"),
10-
) || (await appendMonacoEditorScript())
15+
) ||
16+
// If the script tag that loads the Monaco editor is not found, insert the script tag.
17+
(await appendMonacoEditorScript())
1118

1219
// @ts-expect-error -- global Monaco's require
1320
window.require.config({
@@ -18,6 +25,53 @@ async function setupMonaco() {
1825
}
1926
}
2027

28+
/** Load the Monaco editor. */
29+
async function loadMonacoFromEsmCdn() {
30+
let error = new Error()
31+
const urlList = [
32+
{
33+
script: `https://cdn.jsdelivr.net/npm/monaco-editor@${MONACO_EDITOR_VERSION}/+esm`,
34+
style: `https://cdn.jsdelivr.net/npm/monaco-editor@${MONACO_EDITOR_VERSION}/min/vs/editor/editor.main.css`,
35+
},
36+
{
37+
script: "https://cdn.jsdelivr.net/npm/monaco-editor/+esm",
38+
style: "https://cdn.jsdelivr.net/npm/monaco-editor/min/vs/editor/editor.main.css",
39+
},
40+
]
41+
for (const url of urlList) {
42+
try {
43+
const result = await importFromCDN(url.script)
44+
45+
if (typeof document !== "undefined") {
46+
const link = document.createElement("link")
47+
link.rel = "stylesheet"
48+
link.href = url.style
49+
document.head.append(link)
50+
}
51+
return result
52+
} catch (e) {
53+
// eslint-disable-next-line no-console -- OK
54+
console.warn(`Failed to retrieve resource from ${url}`)
55+
error = e
56+
}
57+
}
58+
throw error
59+
}
60+
61+
async function loadModuleFromMonaco(moduleName) {
62+
await setupMonaco()
63+
64+
return new Promise((resolve) => {
65+
if (typeof window !== "undefined") {
66+
// @ts-expect-error -- global Monaco's require
67+
window.require([moduleName], (r) => {
68+
resolve(r)
69+
})
70+
}
71+
})
72+
}
73+
74+
/** Appends a script tag that loads the Monaco editor. */
2175
async function appendMonacoEditorScript() {
2276
let error = new Error()
2377
const urlList = [
@@ -41,8 +95,9 @@ async function appendMonacoEditorScript() {
4195

4296
/** Appends a script tag. */
4397
function appendScript(src) {
98+
const script = document.createElement("script")
99+
44100
return new Promise((resolve, reject) => {
45-
const script = document.createElement("script")
46101
script.src = src
47102
script.onload = () => {
48103
script.onload = null
@@ -66,30 +121,27 @@ function appendScript(src) {
66121
})
67122
}
68123

69-
let setupedMonaco = null
70-
let editorLoaded = null
124+
let monacoPromise = null
71125

72-
export function loadMonacoEngine() {
73-
return setupedMonaco || (setupedMonaco = setupMonaco())
74-
}
126+
/** Load the Monaco editor object. */
75127
export function loadMonacoEditor() {
76-
if (editorLoaded) {
77-
return editorLoaded
78-
}
79-
return (editorLoaded = (async () => {
80-
const monaco = await loadModuleFromMonaco("vs/editor/editor.main")
81-
return monaco
82-
})())
83-
}
128+
return (
129+
monacoPromise ||
130+
(monacoPromise = (async () => {
131+
let rawMonaco = undefined
132+
let monaco = undefined
133+
try {
134+
rawMonaco = await loadMonacoFromEsmCdn()
135+
} catch {
136+
rawMonaco = await loadModuleFromMonaco("vs/editor/editor.main")
137+
}
138+
if ("m" in rawMonaco) {
139+
monaco = rawMonaco.m || rawMonaco
140+
} else {
141+
monaco = rawMonaco
142+
}
84143

85-
export async function loadModuleFromMonaco(moduleName) {
86-
await loadMonacoEngine()
87-
return new Promise((resolve) => {
88-
if (typeof window !== "undefined") {
89-
// @ts-expect-error -- global Monaco's require
90-
window.require([moduleName], (r) => {
91-
resolve(r)
92-
})
93-
}
94-
})
144+
return monaco
145+
})())
146+
)
95147
}

0 commit comments

Comments
 (0)