Here's what worked for me in 2023 using Next.js 13.4.11 and monaco editor 0.40.0.
Installation
npm install monaco-editor-webpack-plugin
npm install style-loader
npm install css-loader
next.config.js
/** @type {import('next').NextConfig} */
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const monacoRules = [
{
test: /\.ttf$/,
type: 'asset/resource'
}
]
module.exports = {
webpack: (
config,
{ isServer }
) => {
// Modify config and then return it
if(!isServer) {
console.log(config)
config.plugins.push(new MonacoWebpackPlugin({
languages: ["javascript", "markdown", "yaml"],
filename: "static/[name].worker.js",
}))
config.module.rules.push(...monacoRules)
}
return config
},
}
MyClientComponent.js
"use client"
import { useEffect, useRef, useState } from "react"
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
export default function MyEditor() {
const [editor, setEditor] = useState(null)
const editorRef = useRef(null)
// Instantiate Monaco Editor
useEffect(() => {
const options = {
value: "# Hello World",
language: 'markdown'
}
const myEditor = monaco.editor.create(editorRef.current, options);
setEditor(myEditor)
return () => { editor.dispose() }
}, [editorRef])
return (
<div ref={ editorRef }></div>
)
}
Note the import statement import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'
.
import * as monaco from 'monaco-editor'
gave me the error
Error: Unexpected usage at EditorSimpleWorker.loadForeignModule (webpack-internal:///(app-pages-browser)/./node_modules/monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js:523:31)
at eval (webpack-internal:///(app-pages-browser)/./node_modules/monaco-editor/esm/vs/editor/browser/services/webWorker.js:44:30)
at async eval (webpack-internal:///(app-pages-browser)/./node_modules/monaco-editor/esm/vs/language/typescript/tsMode.js:116:16)
when using language: 'javascript'
.