推荐使用 @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/vsvs: '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 (<Editorheight={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);});
