monaco-editor添加js和json語(yǔ)法校驗(yàn)

    
<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 = {

  // 提供一個(gè)定義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() // 基礎(chǔ)功能文件苛让, 提供了所有語(yǔ)言通用功能 無(wú)論使用什么語(yǔ)言菇曲,monaco都會(huì)去加載他。

  }

}

export default {

  name: 'codeMirror',

  props: {

    hiddentip: {

      type: Boolean,

      default: false

    },

    // 語(yǔ)言 目前只有 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, // 默認(rèn)顯示的值

        language: this.language,

        folding: true, // 是否折疊

        foldingHighlight: true, // 折疊等高線

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

        showFoldingControls: 'always', // 是否一直顯示折疊

        disableLayerHinting: true, // 等寬優(yōu)化

        emptySelectionClipboard: false, // 空選擇剪切板

        selectionClipboard: false, // 選擇剪切板

        automaticLayout: true, // 自動(dòng)布局

        codeLens: true, // 代碼鏡頭

        scrollBeyondLastLine: false, // 滾動(dòng)完最后一行后再滾動(dòng)一屏幕

        colorDecorators: true, // 顏色裝飾器

        accessibilitySupport: 'on', // 輔助功能支持"auto" | "off" | "on"

        lineNumbers: 'on', // 行號(hào) 取值: "on" | "off" | "relative" | "interval" | function

        lineNumbersMinChars: 4, // 行號(hào)最小字符   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, // 表示能否通過(guò)delete刪除屬性结序,能否再次修改屬性描述符,默認(rèn)false

        enumerable: true, // 表示該屬性是否可枚舉(for...in循環(huán)、Object.keys()等),默認(rèn)false

        get: function () {

          return self.monacoEditor.getValue()

        },

        set: function (val) {

          return val

        }

      })

    },

    initCustomLanguage () {

      monaco.languages.registerCompletionItemProvider('javascript', {

        provideCompletionItems: function (model, position) {

          // 獲取當(dāng)前行數(shù)

          const line = position.lineNumber

          // 獲取當(dāng)前列數(shù)

          const column = position.column

          // 獲取當(dāng)前輸入行的所有內(nèi)容

          const content = model.getLineContent(line)

          // 通過(guò)下標(biāo)來(lái)獲取當(dāng)前光標(biāo)后一個(gè)內(nèi)容指郁,即為剛輸入的內(nèi)容

          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語(yǔ)句關(guān)鍵詞提示

          var javascriptList = [

            'var',

            'let',

            'const',

            'Promise',

            '$tu',

            'new',

            'for',

            'forEach',

            'etx.meta2d'

          ]

          for (var i in javascriptList) {

            suggestions.push({

              label: javascriptList[i], // 顯示的提示內(nèi)容

              kind: monaco.languages.CompletionItemKind['Keyword'], // 用來(lái)顯示提示內(nèi)容后的不同的圖標(biāo)

              insertText: javascriptList[i], // 選擇后粘貼到編輯器中的文字

              detail: '', // 提示內(nèi)容后的說(shuō)明

              range: range

            })

          }

          return {

            suggestions: suggestions

          }

        },

        triggerCharacters: ['']

      })

    },

    destroyCodeMorror () {

      this.monacoEditor.dispose()

    },

    _initialize () {

      this.initCodeMirror()

      this.initCustomLanguage() // 自定義提示詞語(yǔ)

    }

  }

}

</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

  }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坡氯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洋腮,更是在濱河造成了極大的恐慌,老刑警劉巖手形,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啥供,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡库糠,警方通過(guò)查閱死者的電腦和手機(jī)伙狐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞬欧,“玉大人贷屎,你說(shuō)我怎么就攤上這事∷一ⅲ” “怎么了唉侄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)野建。 經(jīng)常有香客問(wèn)我属划,道長(zhǎng),這世上最難降的妖魔是什么候生? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任同眯,我火速辦了婚禮,結(jié)果婚禮上唯鸭,老公的妹妹穿的比我還像新娘须蜗。我一直安慰自己,他們只是感情好目溉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布明肮。 她就那樣靜靜地躺著,像睡著了一般停做。 火紅的嫁衣襯著肌膚如雪晤愧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天蛉腌,我揣著相機(jī)與錄音官份,去河邊找鬼只厘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舅巷,可吹牛的內(nèi)容都是我干的羔味。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钠右,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赋元!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起飒房,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搁凸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后狠毯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體护糖,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嚼松,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫡良。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡献酗,死狀恐怖寝受,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罕偎,我是刑警寧澤很澄,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站锨亏,受9級(jí)特大地震影響痴怨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜器予,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一浪藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乾翔,春花似錦爱葵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至雷则,卻和暖如春辆雾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背月劈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工度迂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藤乙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓惭墓,卻偏偏與公主長(zhǎng)得像坛梁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腊凶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容