Vue2 + Monaco Editor 使用教程

CodeEditor.vue 组件文档

Monaco Editor

js 复制代码
monaco-editor:"0.45.0"
monaco-editor-webpack-plugin:"7.1.0"

vue.config.js配置

js 复制代码
const { defineConfig } = require('@vue/cli-service')
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack: {
    // webpack 配置
    plugins: [
      // 其他插件...
      new MonacoWebpackPlugin(),
    ],
  },
  
})

介绍

CodeEditor.vue 组件是一个 Vue.js 组件,集成了由 Microsoft 开发的强大的基于 Web 的代码编辑器 Monaco Editor。该组件提供了可定制的代码编辑体验,并附带了 JavaScript 的 T9 自动完成和自定义悬停建议等额外功能。

模板

vue 复制代码
<template>
  <div>
    <div ref="editorContainer" style="height: 500px; width: 500px;" class="editor-container"></div>
  </div>
</template>

模板部分定义了组件的结构,包括一个带有 ref 属性的 div 元素,用于引用编辑器容器。

脚本

vue 复制代码
<script>
import * as monaco from "monaco-editor";

export default {
  name: "Editor",
  data() {
    return {
      // Monaco Editor 实例
      editor: null,
      // T9 自动完成项提供者实例
      hoverProvider: null,
      // 语言注册实例
      languages: null,
      // 初始代码
      code: "",
    };
  },
  mounted() {
    // 在组件挂载后初始化编辑器
    this.initEditor();
  },
  beforeDestroy() {
    // 在组件销毁前处理,销毁编辑器和相关提供者
    this.disposeEditor();
  },
  methods: {
    initEditor() {
      // 使用指定配置初始化 Monaco Editor
      this.editor = monaco.editor.create(this.$refs.editorContainer, {
        // 初始代码
        value: this.code,
        // 指定语言为 JavaScript
        language: "javascript",
        // 主题配置
        theme: "vs-dark", // 使用暗色主题
        // 其他编辑器配置选项
        readOnly: false, // 是否只读
        automaticLayout: true, // 自动布局
        lineNumbers: "on", // 显示行号
        fontFamily: "Consolas, 'Courier New', monospace", // 字体设置
        fontSize: 14, // 字体大小
        tabSize: 2, // 制表符大小
        wordWrap: "on", // 自动换行
        scrollBeyondLastLine: false, // 是否允许滚动超过最后一行
        minimap: {
          enabled: true, // 是否显示缩略图
        },
      });

      // 为 JavaScript 语言注册 T9 自动完成项提供者
      monaco.languages.registerCompletionItemProvider("javascript", {
        provideCompletionItems: (model, position) => {
          const word = model.getWordUntilPosition(position);
          const suggestions = [
            {
              label: "console",
              kind: monaco.languages.CompletionItemKind.Function,
              insertText: "console",
              range: {
                startLineNumber: position.lineNumber,
                startColumn: word.startColumn,
                endLineNumber: position.lineNumber,
                endColumn: word.endColumn,
              },
            },
            // 添加其他 T9 提示项
            {
              label: "guid",
              kind: monaco.languages.CompletionItemKind.Function,
              insertText: "guid",
              range: model.getWordAtPosition(position).range,
              detail: "xxxxx",
            },
          ];

          return {
            suggestions: suggestions,
          };
        },
      });

      // 为 JavaScript 语言注册悬停提供者
      monaco.languages.registerHoverProvider("javascript", {
        provideHover: (model, position) => {
          const guid = model.getWordAtPosition(position);
          if (guid) {
            return {
              contents: [
                {
                  value: `自定义提示: ${guid.word}`,
                },
              ],
              range: model.getWordAtPosition(position).range,
            };
          }
        },
      });
    },
    disposeEditor() {
      // 在组件销毁前处理,销毁编辑器并注销悬停提供者和语言注册
      if (this.editor) {
        this.editor.dispose();
      }
      if (this.hoverProvider) {
        this.hoverProvider.dispose();
      }
      if (this.languages) {
        this.languages.dispose();
      }
    },
    shouldShowHover(word) {
      // 定义显示悬停的条件
      // 例如,仅在单词为 'guid' 时显示悬停
      return word === "guid";
    },
  },
};
</script>

脚本部分定义了组件的行为和功能。关键部分包括:

  • Data(数据) :初始化组件的数据属性,包括 editorhoverProviderlanguagescode
  • Mounted 生命周期钩子 :在组件挂载时调用 initEditor 方法。
  • BeforeDestroy 生命周期钩子 :在组件销毁前调用 disposeEditor 方法,以清理资源。
  • Methods(方法)
    • initEditor(初始化编辑器):使用指定的配置初始化 Monaco Editor,并为 JavaScript 语言注册 T9 自动完成项和悬停提供者。
    • disposeEditor(销毁编辑器):在组件销毁时销毁编辑器并注销悬停提供者。
    • shouldShowHover(是否显示悬停):定义显示悬停的条件。目前设置仅在单词为 'guid' 时显示悬停。

样式

css 复制代码
cssCopy code<style scoped>
  /* 可以在这里添加一些样式 */
  .editor-container {
    padding: 50px;
  }
</style>

样式部分包含了局部样式,专门应用于该组件。在此例中,它为编辑器容器添加了内边距。

使用

要在 Vue.js 应用程序中使用 CodeEditor.vue 组件,请将其导入并在需要的地方包含在模板中。通过调整提供的选项和样式来自定义组件。

vue 复制代码
<template>
  <div>
    <!-- 其他组件或元素 -->

    <!-- 包含 CodeEditor 组件 -->
    <CodeEditor :code="yourJavaScriptCode" />

    <!-- 其他组件或元素 -->
  </div>
</template>

<script>
import CodeEditor from "@/components/CodeEditor.vue";

export default {
  components: {
    CodeEditor,
  },
  data() {
    return {
      yourJavaScriptCode: "console.log('Hello, World!');",
    };
  },
};
</script>

yourJavaScriptCode 替换为实际要在代码编辑器中显示的 JavaScript 代码。

结论

CodeEditor.vue 组件为 JavaScript 提供了灵活且功能丰富的代码编辑体验,利用了 Monaco Editor 库。通过调整提供的选项和样式来自定义组件,以适应应用程序的需求。

相关推荐
cindershade3 小时前
用原生 HTML5 视频与 Canvas 实现浏览器端视频抽帧封面
前端
笨鸟先飞,勤能补拙3 小时前
Web 服务器与计算机网络全景原理
运维·服务器·前端·网络·人工智能·计算机网络·web安全
NutShell Wang3 小时前
Wails v3 Beta 实战:用显式对象模型重写你的第一个 Go 桌面应用
前端·人工智能·go·vibe coding
cindershade3 小时前
前端国际化工程实践:语言包拆分、动态加载与日期数字格式统一
前端
kisbad4 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript
qq_267612894 小时前
Gitee CodePecker行业场景化落地指南:金融、车联网与IoT双引擎选型与工程化路径
前端·gitee·自动化
初晨未凉4 小时前
elementui自定义内容图片预览
前端
无糖可可果5 小时前
从零读懂一个 Next.js 全栈笔记应用
前端
Maxkim5 小时前
DeepSeek Harness 源码深度分析:像 VS Code 一样插件化的 Agent 框架
前端·架构
喜欢睡觉5 小时前
从零看懂一个 Next.js 笔记应用
前端