monaco-editor

1,375 阅读1分钟

js 插件

monaco-editor(摩纳哥编辑器)

微软之前有个项目叫做Monaco Workbench,后来这个项目变成了VSCode,而Monaco Editor(下文简称monaco) 就是从这个项目中成长出来的一个web编辑器,他们很大一部分的代码(monaco-editor-core)都是共用的,所以monaco 和VSCode在编辑代码,交互以及UI上几乎是一摸一样的,有点不同的是,两者的平台不一样,monaco基于浏览器,而VSCode基于electron, 所以功能上VSCode更加健全,并且性能比较强大。

引入方式分为 AMD、ESM 两种方式

  • AMD

    <div id="editor"style="width: 800px; height: 600px; border: 1px solid grey"></div>
    
    <script src="../../monaco-editor-0.31/package/min/vs/loader.js"></script>
    require.config({ paths: { vs: '../../monaco-editor-0.31/package/min/vs' } });
    require(['vs/editor/editor.main'], function () {
        var editor = monaco.editor.create(document.getElementById('editor'), {
            // value: ['function x() {', '\tconsole.log("Hello world!");', '}'].join('\n'),//打印value可以获取到
            language: 'sql',
            automaticLayout: true
        });
    });
    //获取选中编辑器内容的方法
    monacoEditor.getModel().getValueInRange(monacoEditor.getSelection())
    // 获取编辑器内容
    monacoEditor.getValue()
    
  • ESM

    此版本 是基于 vite 的版本,尤雨溪已经处理过了,所以不需要在配置文件进行配置了,基于webpack 需要在webpack.config.js 添加额外配置 monaco-editor 使用

    npm install monaco-editor -S //安装monaco-editor
    
    <template>
      <div id="monacoEdit" style="width: 500px;height: 500px;text-align: left"></div>
    </template>
    
    <script>
    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';
    export default {
      name: "monacoEditor",
      mounted() {
        self.MonacoEnvironment = {
          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();
          }
        };
        monaco.editor.create(document.getElementById('monacoEdit'),{
          language:'javascript'
        })
      }
    }
    </script>