Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 52 additions & 24 deletions docs/integrate-esm.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,32 +193,27 @@ Adding monaco editor to [Vite](https://vitejs.dev/) is simple since it has built
```js
import * as monaco from 'monaco-editor';

import EditorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
import JsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
import CssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
import HtmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker";
import TsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";

self.MonacoEnvironment = {
getWorker: function (workerId, label) {
const getWorkerModule = (moduleUrl, label) => {
return new Worker(self.MonacoEnvironment.getWorkerUrl(moduleUrl), {
name: label,
type: 'module'
});
};

switch (label) {
case 'json':
return getWorkerModule('/monaco-editor/esm/vs/language/json/json.worker?worker', label);
case 'css':
case 'scss':
case 'less':
return getWorkerModule('/monaco-editor/esm/vs/language/css/css.worker?worker', label);
case 'html':
case 'handlebars':
case 'razor':
return getWorkerModule('/monaco-editor/esm/vs/language/html/html.worker?worker', label);
case 'typescript':
case 'javascript':
return getWorkerModule('/monaco-editor/esm/vs/language/typescript/ts.worker?worker', label);
default:
return getWorkerModule('/monaco-editor/esm/vs/editor/editor.worker?worker', label);
getWorker(_, label) {
if (label === "json") {
return new JsonWorker();
}
if (label === "css" || label === "scss" || label === "less") {
return new CssWorker();
}
if (label === "html" || label === "handlebars" || label === "razor") {
return new HtmlWorker();
}
if (label === "typescript" || label === "javascript") {
return new TsWorker();
}
return new EditorWorker();
}
};

Expand All @@ -227,3 +222,36 @@ monaco.editor.create(document.getElementById('container'), {
language: 'javascript'
});
```

> [!NOTE]
> If you are running your frontend on a port that is different from the origin domain where the workers are evaluated,
> you will encounter cross-origin errors.
>
> In this scenario, you can use a blob like this:
> ```js
> self.MonacoEnvironment = {
> getWorker(_, label) {
> function createBlobWorker(workerModule) {
> const code = workerModule.toString();
> const blob = new Blob([code], { type: 'application/javascript' });
> const blobUrl = URL.createObjectURL(blob);
> return new Worker(blobUrl, { type: 'module' });
> }
>
> if (label === "json") {
> return createBlobWorker(JsonWorker);
> }
> if (label === "css" || label === "scss" || label === "less") {
> return createBlobWorker(CssWorker);
> }
> if (label === "html" || label === "handlebars" || label === "razor") {
> return createBlobWorker(HtmlWorker);
> }
> if (label === "typescript" || label === "javascript") {
> return createBlobWorker(TsWorker);
> }
>
> return createBlobWorker(EditorWorker);
> }
> };
> ```