推荐使用 @monaco-editor/react,基于 react 封装
- 有一套 loader 机制,动态加载 monaco-editor 无需官方 webpack 插件
- loader 机制被提取为 @monaco-editor/loader
- monaco-editor 的文件可以通过 copy-webpack-plugin 复制,也可以引用 cdn 上的资源
- 对比 react-monaco-editor:配置复杂度、更新成本、构建速度有明显提升
npm https://www.npmjs.com/package/@monaco-editor/reactpnpm add @monaco-editor/react
Github https://github.com/suren-atoyan/monaco-react
在线编辑器预览 https://monaco-react.surenatoyan.com
对于企业级应用来说,依赖三方 cdn 是个潜在的风险点,
私有化部署需求,把 paths.vs
配本地,同时用 copy-webpack-plugin 复制 monaco-editor 相应代码到产物目录
import React, { useRef } from 'react';
import Editor, { loader } from '@monaco-editor/react';
const loaderConfig = {
'vs/nls': {
availableLanguages: {
'*': 'zh-cn',
},
},
paths: {
// 根据需要调整版本和产物类型
// https://cdn.jsdelivr.net/npm/monaco-editor@0.43.0/min/vs
vs: 'https://gw.alipayobjects.com/os/lib/monaco-editor/0.34.0/min/vs',
},
};
loader.config(loaderConfig);
function MonacoEditor () {
const editorRef = useRef(null);
function onEditorDidMount(editor, monaco) {
console.log('editor', editor, monaco)
editorRef.current = editor;
}
function onEditorChange(value, event) {
console.log('here is the current model value:', value);
}
return (
<Editor
height={600}
language="javascript"
theme="vs-dark"
defaultValue="console.log('hello world')"
onMount={onEditorDidMount}
onChange={onEditorChange}
/>
)
}
export default MonacoEditor;
如果不用 cdn 的私有化部署需求,可以把 paths.vs 配本地,将资源放置本地,替换cdn资源
同时用 copy-webpack-plugin 复制 monaco-editor 相应代码到产物目录
loader
https://github.com/suren-atoyan/monaco-loader
用vs 作为路径别名,避免路径过长的问题
vs 默认配置
https://github.com/suren-atoyan/monaco-loader/blob/master/src/config/index.js
loader.init
loader.init().then((monaco) => {
const wrapper = document.getElementById("root");
wrapper.style.height = "100vh";
const properties = {
value: "function hello() {\n\talert('Hello world!');\n}",
language: "javascript"
};
monaco.editor.create(wrapper, properties);
});