monaco-editor编辑器插件的使用(vite4+vue3)

2023-07-07 1,655 0

一.简介

Monaco Editor 是一个浏览器端的代码编辑器库,同时它也是 VS Code 所使用的编辑器。

二.安装

> npm install monaco-editor@0.29.0 --save

三. 新建编辑器组件

<template>
    <div class="codemirror">
        <div id="monacoEditor" class="monaco-editor" ref="monacoEditor"></div>
    </div>
</template>
<script setup>
// 引入vue模块
import { ref, reactive, onMounted } from 'vue';
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';
//引入monaco编辑器
import * as monaco from "monaco-editor";

self.MonacoEnvironment = {
    getWorker(workerId, label) {
        if (label === 'json') {
            return new jsonWorker();
        }
        if (label === 'css' || label === 'scss' || label === 'less') {
            return new cssWorker()
        }
        if (label === 'html') {
            return new htmlWorker()
        }
        if (['typescript', 'javascript'].includes(label)) {
            return new tsWorker()
        }
        return new editorWorker();
    },
};
let code = ref(''); //代码
let language = ref(''); //语言
let editor = ref(null); //编辑器实例
const monacoEditor = ref(null);
// 定义从父组件接收的属性
const props = defineProps({
    option: Object,
});

//挂载
onMounted(() => {
    language.value = props.option.options.language;
    code.value = props.option.options.code;
    initEditor(language.value, code.value);
});

//初始化编辑器
function initEditor(language, code) {
    editor.value = monaco.editor.create(monacoEditor.value, {
        value: code,
        theme: "vs-dark", // 主题
        language: language,
        folding: true, // 是否折叠
        foldingHighlight: true, // 折叠等高线
        foldingStrategy: "indentation", // 折叠方式  auto | indentation
        showFoldingControls: "always", // 是否一直显示折叠 always | mouseover
        disableLayerHinting: true, // 等宽优化
        emptySelectionClipboard: false, // 空选择剪切板
        selectionClipboard: false, // 选择剪切板
        automaticLayout: true, // 自动布局
        codeLens: false, // 代码镜头
        scrollBeyondLastLine: false, // 滚动完最后一行后再滚动一屏幕
        colorDecorators: true, // 颜色装饰器
        accessibilitySupport: "off", // 辅助功能支持  "auto" | "off" | "on"
        lineNumbers: "on", // 行号 取值: "on" | "off" | "relative" | "interval" | function
        lineNumbersMinChars: 5, // 行号最小字符   number
        readOnly: false, //是否只读  取值 true | false
    });
}
</script>
<style scoped>
.codemirror,
.monaco-editor {
    width: 100%;
    height: 100%;
}
</style>

四.使用

<template>
    <div class="monacoEditor">
        <Monaco :option="editorp" />
    </div>
</template>
<script setup>
import Monaco from "../../components/editor/monacoEditor.vue";
// 引入vue模块
import { ref, reactive } from 'vue';
const options = {
    language: 'html',
    code: `<button class="btn">默认按钮</button>`
}

const editorp = reactive({
    el: 'monaco',
    options: options
});
</script>
<style scoped>
.monacoEditor {
    width: 100%;
    height: 100%;
}
</style>

五.效果

:Monaco Editor学习文档:https://aydk.site/editor/

相关文章

Vue 过滤器
Vue 自定义指令
Vue key的作用与原理
Vue 计算属性和监听属性
Vue MVVM与数据代理
Vue el与data的两种写法

发布评论