monaco-editor添加js和json语法校验

    
<template>

  <div>

    <div class="textareaBox" ref="textarea"></div>

  </div>

</template>

<script>

import * as monaco from 'monaco-editor'

// import customKeywords from './customKeywords'

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'

window.MonacoEnvironment = {

  // 提供一个定义worker路径的全局变量

  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都会去加载他。

  }

}

export default {

  name: 'codeMirror',

  props: {

    hiddentip: {

      type: Boolean,

      default: false

    },

    // 语言 目前只有 html css js

    language: {

      type: String,

      default: 'javascript'

    }

  },

  data () {

    return {

      monacoEditor: null,

      code: ''

    }

  },

  destroyed () {

    this.destroyCodeMorror()

  },

  methods: {

    initCodeMirror () {

      if (this.language == 'javascript') {

        monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true)

        monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({

          noSemanticValidation: true,

          noSyntaxValidation: false

        })

        monaco.languages.typescript.javascriptDefaults.setCompilerOptions({

          target: monaco.languages.typescript.ScriptTarget.ES2020,

          allowNonTsExtensions: true

        })

      } else if (this.language == 'json') {

        monaco.languages.json.jsonDefaults.setDiagnosticsOptions({

          validate: true,

          enableSchemaRequest: true

        })

      }

      this.monacoEditor = monaco.editor.create(this.$refs.textarea, {

        theme: 'vs-dark', // 主题

        value: this.code, // 默认显示的值

        language: this.language,

        folding: true, // 是否折叠

        foldingHighlight: true, // 折叠等高线

        foldingStrategy: 'auto', // 折叠方式

        showFoldingControls: 'always', // 是否一直显示折叠

        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: 4, // 行号最小字符   number

        enableSplitViewResizing: false,

        readOnly: false, //是否只读  取值 true | false

        fontSize: 16

      })

      this.monacoEditor.onDidChangeModelContent(() => {

        this.$emit('change', this.monacoEditor.getValue())

      })

      let self = this

      Object.defineProperty(this, 'code', {

        configurable: true, // 表示能否通过delete删除属性,能否再次修改属性描述符,默认false

        enumerable: true, // 表示该属性是否可枚举(for...in循环、Object.keys()等),默认false

        get: function () {

          return self.monacoEditor.getValue()

        },

        set: function (val) {

          return val

        }

      })

    },

    initCustomLanguage () {

      monaco.languages.registerCompletionItemProvider('javascript', {

        provideCompletionItems: function (model, position) {

          // 获取当前行数

          const line = position.lineNumber

          // 获取当前列数

          const column = position.column

          // 获取当前输入行的所有内容

          const content = model.getLineContent(line)

          // 通过下标来获取当前光标后一个内容,即为刚输入的内容

          const sym = content[column - 2]

          var word = model.getWordUntilPosition(position)

          var range = {

            startLineNumber: position.lineNumber,

            endLineNumber: position.lineNumber,

            startColumn: word.startColumn,

            endColumn: word.endColumn

          }

          //---------------------------------------------------

          //上面的代码仅仅是为了获取sym,即提示符

          //---------------------------------------------------

          var suggestions = []

          //直接提示,以下为javascript语句关键词提示

          var javascriptList = [

            'var',

            'let',

            'const',

            'Promise',

            '$tu',

            'new',

            'for',

            'forEach',

            'etx.meta2d'

          ]

          for (var i in javascriptList) {

            suggestions.push({

              label: javascriptList[i], // 显示的提示内容

              kind: monaco.languages.CompletionItemKind['Keyword'], // 用来显示提示内容后的不同的图标

              insertText: javascriptList[i], // 选择后粘贴到编辑器中的文字

              detail: '', // 提示内容后的说明

              range: range

            })

          }

          return {

            suggestions: suggestions

          }

        },

        triggerCharacters: ['']

      })

    },

    destroyCodeMorror () {

      this.monacoEditor.dispose()

    },

    _initialize () {

      this.initCodeMirror()

      this.initCustomLanguage() // 自定义提示词语

    }

  }

}

</script>

<style scoped>

.textareaBox {

  height: 500px;

  font-size: 16px;

  font-weight: 800;

  font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, Helvetica,

    Segoe UI, Arial, Roboto, PingFang SC, miui, Hiragino Sans GB,

    Microsoft Yahei, sans-serif, Avenir;

}

.textareaBox .cm-activeLine {

  background-color: transparent;

}

</style>


{

  "name": "mate2d",

  "private": true,

  "version": "0.0.0",

  "type": "module",

  "scripts": {

    "dev": "vite",

    "build": "vite build",

    "preview": "vite preview"

  },

  "devDependencies": {

    "@vitejs/plugin-vue2": "^2.3.1",

    "vite": "^5.4.10"

  },

  "dependencies": {

    "axios": "^1.7.7",

    "codemirror": "^6.0.1",

    "echarts": "^5.5.1",

    "element-ui": "^2.15.14",

    "jquery": "^3.7.1",

    "monaco-editor": "0.30.1",

    "vue": "2.7.14",

    "vuex": "3.6.2"

  }

}


// vite.config.js

import vue from '@vitejs/plugin-vue2'

import { resolve } from 'path'

export default {

  plugins: [vue()],

  server: {

    host: '192.168.8.30', // can be overwritten by process.env.HOST

    port: 1081

  },

  base: './',

  resolve: {

    alias: {

      '@': resolve(__dirname, './src')

    }

  },

  build: {

    minify: false

  }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容