Как создать несколько редакторов monaco javascript, чтобы они не разделяли глобальное пространство имен?

#javascript #monaco-editor

#javascript #monaco-editor

Вопрос:

Я хотел бы иметь несколько редакторов Monaco на странице, но каждый со своим собственным набором глобалов. Переменные, созданные в одном редакторе, не должны быть доступны как типы в другом.

Я пробовал настраивать monaco.languages.typescript.javascriptDefaults.setCompilerOptions({isolatedModules: true}) , но, похоже, это не повлияло на эти общие глобальные типы.

Как я могу создать несколько редакторов monaco javascript, чтобы они не использовали глобальное пространство имен?

 // set up code for the Monaco Playground:
const container = document.getElementById("container");
const container1 = document.createElement("div");
const container2 = document.createElement("div");
container1.style.height="200px";
container1.style.border = "solid 2px black";
container1.style.marginBottom = "16px";
container2.style.height="200px";
container2.style.border = "solid 2px black";
container.appendChild(container1);
container.appendChild(container2);



// actual code:
monaco.editor.create(container1, {
    model: monaco.editor.createModel(`const abc = 123;`,
        "javascript",
        monaco.Uri.parse("js:editor1.js")
    )
});

monaco.editor.create(container2, {
    model: monaco.editor.createModel(
        "const value = abc; // should be typed as `any`, but is typed as `123` instead!",
        "javascript",
        monaco.Uri.parse("js:editor2.js")
    )
});
 

Попробуйте это на игровой площадке: https://microsoft.github.io/monaco-editor/playground.html

Ответ №1:

Я нашел некоторое обсуждение в https://github.com/microsoft/monaco-editor/issues/262 .

Мое временное решение — добавить export {} в начале кода. Надеюсь, я смогу найти более элегантный способ решения проблемы.

 // set up code for the Monaco Playground:
const container = document.getElementById("container");
const container1 = document.createElement("div");
const container2 = document.createElement("div");
container1.style.height = "200px";
container1.style.border = "solid 2px black";
container1.style.marginBottom = "16px";
container2.style.height = "200px";
container2.style.border = "solid 2px black";
container.appendChild(container1);
container.appendChild(container2);



// actual code:
monaco.editor.create(container1, {
    model: monaco.editor.createModel(
        `export {}nconst abc = 123;`,
        "javascript",
        monaco.Uri.parse("js:editor1.js"),
    )
});

monaco.editor.create(container2, {
    model: monaco.editor.createModel(
        "export {}nconst a = abc; // should be typed as `any`, but is typed as `123` instead!",
        "javascript",
        monaco.Uri.parse("js:editor2.js")
    )
});