首页 > 数据库 >monaco-editor 实现SQL编辑器

monaco-editor 实现SQL编辑器

时间:2024-06-07 16:16:15浏览次数:19  
标签:SQL sql item vs editor monaco

原文链接:https://www.yuque.com/sxd_panda/antv/editor

安装

yarn add monaco-editor
或
npm install monaco-editor

配置

看网上的教程需要添加vite配置,但是我的项目没有对vite进行配置,打包出来的也是可以用的,具体看你们的场景

vite.config.js配置

安装 vite-plugin-monaco-editor
import monacoEditorPlugin from 'vite-plugin-monaco-editor'

plugins: [
  monacoEditorPlugin({
    languageWorkers: ['editorWorkerService', 'typescript', 'json', 'html']
  }),
]

页面使用

先把对应的几个 worker 引入下,不然控制台会有警告。这段代码可以单独放在一个组件里面引入到当前页面,因为它目前的作用就是解决控制台警告的,写在当前页面也是没问题的

import editorWorker from 'monaco-editor/esm/vs/editor/editor.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 htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';


self.MonacoEnvironment = {
  getWorker(workerId, label) {
    if (label === 'json') {
      return new jsonWorker();
    }
    if (label === 'typescript' || label === 'javascript') {
      return new tsWorker();
    }
    if (label === 'html') {
      return new htmlWorker();
    }
    return new editorWorker();
  }
};

导入monaco模块准备初始化编辑器

import * as monaco from 'monaco-editor';

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

// 执行初始化的方法
onMounted(() => {
  // 初始化编辑器
  initEditor();
});

如何添加SQL关键字提示?

SQL关键字其实插件内是有的,我们只需要把它拿过啦直接用就行了,如果你觉得不全,可以自己定义一个js文件,把你需要的关键字都加入到这个文件中,后续维护就只需要维护你这个js文件就行了

插件关键字的目录:/node_modules/monaco-editor/esm/vs/basic-languages/sql/sql.js

import { language } from 'monaco-editor/esm/vs/basic-languages/sql/sql.js';

// 注册SQL关键字提示
monaco.languages.registerCompletionItemProvider('sql',{
  provideCompletionItems:(model, position) => {
    let suggestions = [];
    // language.keywords 是获取内置的SQL关键字
      language.keywords.map(item => {
      suggestions.push({
        label: item,
        kind: monaco.languages.CompletionItemKind['Keyword'],
        insertText: item + ' ',
        detail: '内置关键字',
      });
    });
     return {
        suggestions
      };
  }
})

如何添加表字段提示?

type类型文档

// 这个是自定义的表字段数据
const fieldsArr = [
  {
    type: 'Field', // 这个类型是为了区分是关键字还是字段,具体可以看下文档
    value: 'name'
  },
  {
    type: 'Field',
    value: 'age'
  },
  {
    type: 'Field',
    value: 'sex'
  }
];



monaco.languages.registerCompletionItemProvider('sql',{
  provideCompletionItems:(model, position) => {
    let suggestions = [];
   // 再把内置的关键字数据处理下
    const temp = language.keywords.map(item => {
      return {
        type: 'Keyword',
        value: item
      };
    });
// 把关键字和表字段数据合到一起,这样就不用输入快捷键才会显示表字段了
const result = [...fieldsArr, ...temp];
result.map(item => {
  suggestions.push({
    label: item.value,
    kind: monaco.languages.CompletionItemKind[item.type],
    insertText: item.value + ' ',
    detail: item.type == 'Keyword' ? '内置关键字' : '表字段',
    range
  });
});
     return {
        suggestions
      };
  }
})


添加代码格式化右键菜单

SQL编辑器默认是没有右键格式化代码的,需要手动添加菜单并借助第三方的插件实现SQL代码的格式化

插件链接:https://www.npmjs.com/package/sql-formatter

# 安装格式化插件
npm install sql-formatter   /   yarn add sql-formatter
import { format } from 'sql-formatter';

// 创建自定义菜单项
monacoEditor.addAction({
  id: 'format.sql',
  label: 'Formart SQL',
  precondition: null,
  contextMenuGroupId: 'navigation',
  contextMenuOrder: 1,
  run: function () {
    // sql代码格式化
    monacoEditor.setValue(format(monacoEditor.getValue()));
  }
});

自定义主题

function defineTheme() {
  monaco.editor.defineTheme('naruto', {
    base: 'vs', // 以哪个默认主题为基础:"vs" | "vs-dark" | "hc-black" | "hc-light"
    inherit: true,
    rules: [
      // 高亮规则,即给代码里不同token类型的代码设置不同的显示样式
      { token: 'identifier', foreground: '#d06733' },
      { token: 'number', foreground: '#6bbeeb', fontStyle: 'italic' },
      { token: 'keyword', foreground: '#05a4d5' }
    ],
    colors: {
      'scrollbarSlider.background': '#edcaa6', // 滚动条背景
      'editor.foreground': '#0d0b09', // 基础字体颜色
      'editor.background': '#00090B', // 背景颜色
      'editorCursor.foreground': '#d4b886', // 焦点颜色
      'editor.lineHighlightBackground': '#6492a520', // 焦点所在的一行的背景颜色
      'editorLineNumber.foreground': '#008800' // 行号字体颜色
    }
  });
}
defineTheme();

monaco.editor.setTheme('naruto');

下面这个是已经实现的demo效果

标签:SQL,sql,item,vs,editor,monaco
From: https://www.cnblogs.com/sxdpanda/p/18237357

相关文章

  • 超级详细的mysql数据库安装指南
    如果你的电脑是windows,参考下面的安装步骤。一、下载mysql数据库进入MySQL官方网站(MySQLCommunityDownloads),按下图顺序点击“进入下载页面 在下载页面拉到最下面会看到下图中的安装软件 MSIInstaller注意有两个,这两个有什么区别呢?第一个(大小是10多M)是联网在线安装,会......
  • 谈谈Redis缓存中MySQL的数据如何与Redis同步
    在现代应用程序中,性能和响应速度是至关重要的。为了提高数据访问速度,常常会使用缓存技术。Redis作为一种高性能的内存数据库,常被用作缓存层,而MySQL则作为持久化存储层。如何有效地将MySQL数据与Redis缓存进行同步,是一个关键问题。本文将详细探讨Redis作为缓存时,http://ww......
  • 基于Java+SpringBoot+Mysql实现的协同过滤推荐旅游景点平台设计与实现
    一、前言介绍:1.1项目摘要随着人们生活水平的提高和休闲时间的增多,旅游已成为人们生活中不可或缺的一部分。然而,传统的旅游方式往往存在信息不对称、服务质量参差不齐、行程安排不够灵活等问题,给游客带来了诸多不便。与此同时,互联网技术的快速发展为旅游行业带来了革命性......
  • 基于Java+SpringBoot+Mysql实现的在线电影订票系统设计与实现
    一、前言介绍:1.1项目摘要在线电影订票系统的课题背景主要源于现代社会的信息化、网络化发展趋势以及人们对便捷、高效生活方式的追求。随着互联网技术的飞速发展和普及,人们的生活方式正在发生深刻的变化。在线购物、在线支付、在线预订等网络服务已经渗透到人们日常生活......
  • mysql 简单参数配置
    showglobalvariableslike'%timeout%';showglobalvariableslike'%buffer%'; innodb_buffer_pool_size=60Gwait_timeout=2400 showglobalvariableslike'%wait_timeout%';showglobalvariableslike'%innodb......
  • 基于prometheus实现SQL监控方案
    需求描述业务上经常会出现这样的问题:客户反馈某个业务今天查不到数据。怎么通过监控提前发现呢?我们的业务场景是这样:在mysql中,每小时、每天,会通过定时任务汇总统计车辆在道路上的作业情况(作业时间、里程、平均速度等)。经常出现,某一个客户某一类型数据没算(表中没有新增数据)。......
  • MySQL GROUP BY 用法介绍
    MySQL中GROUPBY用法简介GROUPBY语句用于结合合计函数,根据一个或多个列对结果集进行分组。可以把分组理解成Excel中的分组。把合计函数理解成Excel中的求和、求平均值等。语法SELECTcolumn1,column2,aggregate_function(column3)FROMtable_nameWHEREcon......
  • mysql 5.7以后需要设置安全导向
    //mysql_secure_installation安全配置向导[root@youxi1~]#mysql_secure_installationSecuringtheMySQLserverdeployment.Enterpasswordforuserroot://输入root密码The'validate_password'pluginisinstalledontheserver.Thesubsequentstepsw......
  • 新服务器从0到1安装mysql8.0(保姆级教程)
    前提:可以输入命令检测是否安装了mysqlrpm-qa|grepmysql没有安装是什么都没有输出的1.如果系统上已安装有maraidb数据库,需要卸载mariadb yumremovemariadb*-yrm-rf/etc/my.cnfrm-rf/var/lib/mysql/2.如果系统已安装有其他版本的mysql,需提前卸载清空环境r......
  • mysql安装
    mysql安裝下载ZIP包,地址:https://downloads.mysql.com/archives/community/,确保选择与你的Windows系统位数(32位或64位)相匹配的版本。解压ZIP包:将下载的ZIP文件解压到你选择的安装目录。你可以使用Windows内置的解压工具或第三方工具如WinRAR、7-Zip等。创建数据目录:在解压后的My......