news 2026/4/16 21:47:16

Vue3项目集成monaco-editor实现浏览器IDE代码编辑功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3项目集成monaco-editor实现浏览器IDE代码编辑功能

前言

相信大家在做一些低代码平台的项目时,都会涉及到一些在线IDE代码编辑的功能吧,比如通过在线代码编辑后实现在线运行代码效果.

本篇给大家分享一下作者个人在开发低代码平台时如何实现如下图所示的
vscode在线代码IDE编辑功能的吧

一、安装相关插件

pnpm add monaco-editor pnpm add monaco-editor-vue3

因为是在Vue3项目中所以这里直接使用monaco-editor-vue3这个插件会更加便捷

二、新增一个monaco.ts 配置文件(这个很重要)

在安装完插件后其实我们这样直接在页面中引入就可以使用了,但是这个时候页面其实会有报错的,大概就是提示你monaco-editor相关配置没有处理

<template> <div style="height: 400px; width: 800px"> <CodeEditorv-model:value="code" language="javascript" theme="vs-dark" :height="600" :options="editorOptions" /> </div> </template> <script setup> import { ref } from 'vue'; import { CodeEditor } from 'monaco-editor-vue3'; const code = ref(`function hello() { console.log('Hello, Monaco Editor!'); }`); const editorOptions = { fontSize: 14, minimap: { enabled: false }, automaticLayout: true, }; </script>

这时候我们需要创建一个monaco.ts文件并添加以下配置内容

import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'; import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'; import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'; import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'; import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'; import * as monaco from 'monaco-editor'; declare global { interface Window { MonacoEnvironment?: { getWorker: (moduleId: string, label: string) => Worker; }; } } (self as Window).MonacoEnvironment = { getWorker(_: string, label: string) { 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(); }, };

同时在main.ts中引入monaco.ts

import App from './App.vue'; import '@/utils/monaco' type AppInstance = AppType<Element>; const app: AppInstance = createApp(App); app.mount('#app');

界面:ok配置成功后界面内容大概就是这样

自定义主题

如果你觉得编辑器默认的主题样式不太好看也可以自定义主题样式,这里简单的配置一下

依旧在monaco.ts中添加代码

// 定义符合项目系统的自定义主题 const customTheme: monaco.editor.IStandaloneThemeData = { base: 'vs-dark', // 基于官方暗色主题 inherit: true, // 继承默认语法高亮规则 rules: [ { token: 'comment', foreground: '617b91', fontStyle: 'italic' }, // 注释呈现斜体灰蓝 { token: 'keyword', foreground: 'c5cceb', fontStyle: 'bold' }, // 关键字加粗淡紫 { token: 'string', foreground: 'a9b1d6' }, // 字符串淡蓝 { token: 'number', foreground: 'c5cceb' }, // 数字淡紫 { token: 'operator', foreground: 'c7cacf' }, // 运算符浅灰 { token: 'delimiter', foreground: 'c7cacf' }, // 分隔符浅灰 { token: 'type', foreground: 'c5cceb' }, // 类型标识淡紫 { token: 'class', foreground: 'c5cceb' }, // 类名淡紫 { token: 'function', foreground: 'a9b1d6' }, // 函数名淡蓝 { token: 'variable', foreground: 'c5cceb' }, // 变量名淡紫 ], colors: { 'editor.background': '#252837', // 编辑器背景 'editor.foreground': '#c5cceb', // 默认前景文字 'editor.lineHighlightBackground': '#29344c', // 当前行高亮背景 'editor.inactiveSelectionBackground': 'rgba(69, 137, 255, 0.15)', // 未激活选区背景 'editorCursor.foreground': '#c5cceb', // 光标颜色 'editorWhitespace.foreground': '#535f79', // 空白字符提示色 'editorIndentGuide.background': '#535f79', // 缩进指示线 'editorIndentGuide.activeBackground': '#a9b1d6', // 活动缩进指示线 'editorLineNumber.foreground': '#617b91', // 行号默认颜色 'editorLineNumber.activeForeground': '#c5cceb', // 当前行号颜色 'editorGutter.background': '#252837', // 行号区域背景 'editorWidget.background': '#29344c', // 弹出组件背景 'editorWidget.border': '#535f79', // 弹出组件边框 'editorSuggestWidget.background': '#29344c', // 智能提示背景 'editorSuggestWidget.border': '#535f79', // 智能提示边框 }, }; // 注册自定义主题 monaco.editor.defineTheme('custom-dark', customTheme);

界面效果:

monaco.ts 完整的配置

import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'; import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'; import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'; import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'; import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'; import * as monaco from 'monaco-editor'; declare global { interface Window { MonacoEnvironment?: { getWorker: (moduleId: string, label: string) => Worker; }; } } (self as Window).MonacoEnvironment = { getWorker(_: string, label: string) { 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(); }, }; // 定义符合项目系统的自定义主题 const customTheme: monaco.editor.IStandaloneThemeData = { base: 'vs-dark', // 基于官方暗色主题 inherit: true, // 继承默认语法高亮规则 rules: [ { token: 'comment', foreground: '617b91', fontStyle: 'italic' }, // 注释呈现斜体灰蓝 { token: 'keyword', foreground: 'c5cceb', fontStyle: 'bold' }, // 关键字加粗淡紫 { token: 'string', foreground: 'a9b1d6' }, // 字符串淡蓝 { token: 'number', foreground: 'c5cceb' }, // 数字淡紫 { token: 'operator', foreground: 'c7cacf' }, // 运算符浅灰 { token: 'delimiter', foreground: 'c7cacf' }, // 分隔符浅灰 { token: 'type', foreground: 'c5cceb' }, // 类型标识淡紫 { token: 'class', foreground: 'c5cceb' }, // 类名淡紫 { token: 'function', foreground: 'a9b1d6' }, // 函数名淡蓝 { token: 'variable', foreground: 'c5cceb' }, // 变量名淡紫 ], colors: { 'editor.background': '#252837', // 编辑器背景 'editor.foreground': '#c5cceb', // 默认前景文字 'editor.lineHighlightBackground': '#29344c', // 当前行高亮背景 'editor.inactiveSelectionBackground': 'rgba(69, 137, 255, 0.15)', // 未激活选区背景 'editorCursor.foreground': '#c5cceb', // 光标颜色 'editorWhitespace.foreground': '#535f79', // 空白字符提示色 'editorIndentGuide.background': '#535f79', // 缩进指示线 'editorIndentGuide.activeBackground': '#a9b1d6', // 活动缩进指示线 'editorLineNumber.foreground': '#617b91', // 行号默认颜色 'editorLineNumber.activeForeground': '#c5cceb', // 当前行号颜色 'editorGutter.background': '#252837', // 行号区域背景 'editorWidget.background': '#29344c', // 弹出组件背景 'editorWidget.border': '#535f79', // 弹出组件边框 'editorSuggestWidget.background': '#29344c', // 智能提示背景 'editorSuggestWidget.border': '#535f79', // 智能提示边框 }, }; // 注册自定义主题 monaco.editor.defineTheme('custom-dark', customTheme);

总结

以上就是作者个人在Vue3项目中集成 monaco.editor 的过程

总体来说也是非常的简单

大概就是分三步流程实现

1.安装monaco-editormonaco-editor-vue3插件

2.新增和引入monaco.ts文件

3.在页面中使用CodeEditor

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:53:40

月初面了十多个前端开发,感觉天都塌了...

不是说他们基础不好。相反&#xff0c;很多人对React生命周期 、 Vue响应式原理甚至 Webpack配置项都能对答如流。真正让我感到“天塌了”的瞬间&#xff0c;是在连续几个候选人面对同一个看似简单的场景题时&#xff0c;表现出的集体性失语。 题目大概是这样的&#xff1a; “…

作者头像 李华
网站建设 2026/4/16 13:49:18

Tarjan全家桶系列--强联通分量

强联通分量(SCC) 有向图中的一个​​极大子图​&#xff0c;其中任意两个节点 u 和 v 都​​互相可达​&#xff08;即存在 u→v和 v→u的路径&#xff09;&#xff0c;则这个子图为一个强联通分量 Tarjan 算法基于深度优先搜索&#xff08;DFS&#xff09;&#xff0c;利用 DF…

作者头像 李华
网站建设 2026/4/16 15:29:22

手把手教你学Simulink——基于高比例可再生能源渗透的复杂电网建模场景实例:含高比例风电接入的弱电网稳定性分析与仿真

目录 手把手教你学Simulink ——基于高比例可再生能源渗透的复杂电网建模场景实例:含高比例风电接入的弱电网稳定性分析与仿真 一、背景介绍 二、系统结构设计 三、建模过程详解 第一步:创建新 Simulink 项目 第二步:添加主要模块 1. 风电场模型 2. 弱电网模型 3. …

作者头像 李华
网站建设 2026/4/16 18:11:43

学Simulink--基于高比例可再生能源渗透的复杂电网建模场景实例:新能源高渗透下传统同步机主导系统的动态响应建模

目录 手把手教你学Simulink ——基于高比例可再生能源渗透的复杂电网建模场景实例:新能源高渗透下传统同步机主导系统的动态响应建模 一、背景介绍 二、系统结构设计 三、建模过程详解 第一步:创建新 Simulink 项目 第二步:添加主要模块 1. 新能源发电模型 2. 同步…

作者头像 李华
网站建设 2026/4/16 15:31:42

数据结构与算法11种排序算法全面对比分析

一、算法分类概述排序算法是计算机科学中最基础且重要的算法类别&#xff0c;用于将数据元素按照特定顺序重新排列。根据是否通过比较元素大小进行排序&#xff0c;可分为比较排序和非比较排序两大类。以下是11种常见排序算法的全面对比分析。二、基本比较排序算法1. 冒泡排序&…

作者头像 李华
网站建设 2026/4/16 17:25:57

破局 AI 选择焦虑:以生态之力,找准低风险高价值的转型航向

在 AI 技术全面爆发的时代&#xff0c;企业技术决策者正面临前所未有的选择困境&#xff1a;智能客服、智能问数、数字人、代码生成等应用方向层出不穷&#xff0c;每个都看似前景广阔&#xff0c;却受限于有限的资源与未知的风险。选择跟风热门赛道&#xff0c;可能面临投入与…

作者头像 李华