JSPM

@vue-monaco/editor

0.0.6
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 151
  • Score
    100M100P100Q76609F
  • License MIT

Monaco Editor for Vue - use the monaco-editor in Vue2/3 without needing to use plugins

Package Exports

  • @vue-monaco/editor

Readme

@vue-monaco/editor

Use monaco-editor loaded in Vue 2&3, no need to configure plugins in webpack (or rollup, vite) and other packaging tools.

gitHub license npm version

English | 简体中文

Installation

npm i @vue-monaco/editor

Vue <= 2.6.14 requires @vue/composition-api to be installed.

npm i @vue-monaco/editor @vue/composition-api

Usage

Editor

<script lang="ts" setup>
  import { ref, shallowRef } from 'vue'

  const MONACO_EDITOR_OPTIONS = {
    automaticLayout: true,
    formatOnType: true,
    formatOnPaste: true,
  }

  const code = ref('// some code...')
  const editorRef = shallowRef()
  const handleMount = editor => (editorRef.value = editor)

  // your action
  function formatCode() {
    editorRef.value?.getAction('editor.action.formatDocument').run()
  }
</script>

<template>
  <monaco-editor
    v-model:value="code"
    theme="vs-dark"
    :options="MONACO_EDITOR_OPTIONS"
    @mount="handleMount"
  />
</template>

Diff Editor

<script lang="ts" setup>
  import { ref, shallowRef } from 'vue'

  const OPTIONS = {
    automaticLayout: true,
    formatOnType: true,
    formatOnPaste: true,
    readOnly: true,
  }

  const diffEditorRef = shallowRef()
  const handleMount = diffEditor => (diffEditorRef.value = diffEditor)

  // get the original value
  function getOriginalValue() {
    return diffEditorRef.value.getOriginalEditor().getValue()
  }

  // get the modified value
  function getOriginalValue() {
    return diffEditorRef.value.getModifiedEditor().getValue()
  }
</script>

<template>
  <monaco-diff-editor
    theme="vs-dark"
    original="// the original code"
    modified="// the modified code"
    language="javascript"
    :options="OPTIONS"
    @mount="handleMount"
  />
</template>

Props & Events & slots

Editor

Name Type Default Description remark
value string value of the current model, can use v-model:value v-model:value
language string all language of the current model languages supported by monaco-editor, view here
path string path to the current model
defaultValue string default value of the current model
defaultLanguage string default language of the current model languages supported by monaco-editor view here
defaultPath string default path of the current model monaco.editor.createModel(..., ..., monaco.Uri.parse(defaultPath))
theme vs | vs-dark vs the theme for the monaco editor.
line number number of lines to jump to
options object {} IStandaloneEditorConstructionOptions
overrideServices object {} IEditorOverrideServices
saveViewState boolean true save the view state of the model (scroll position, etc.) after model changes a unique path needs to be configured for each model
width number | string 100% container width
height number | string 100% container height
className string container class name
onBeforeMount (monaco: Monaco) => void execute before the editor instance is created
onMount (editor: monaco.editor.IStandaloneCodeEditor, monaco: Monaco) => void execute after the editor instance has been created
onChange (value: string | undefined, event: monaco.editor.IModelContentChangedEvent) => void execute when the changed value change
onValidate (markers: monaco.editor.IMarker[]) => void execute when a syntax error occurs monaco-editor supports syntax-checked languages view here
#loading slot 'loading...' loading status when loading files from CDN, displaying the loading status will be more friendly
#failure slot 'load failed' failure status example: CDN network error

Diff Editor

Name Type Default Description
original string The original source value (left editor)
modified string The modified source value (right editor)
language string Language for the both models - original and modified (all languages that are supported by monaco-editor)
originalLanguage string This prop gives you the opportunity to specify the language of the original source separately, otherwise, it will get the value of the language property.
modifiedLanguage string This prop gives you the opportunity to specify the language of the modified source separately, otherwise, it will get the value of language property.
originalModelPath string Path for the "original" model. Will be passed as a third argument to .createModel method - monaco.editor.createModel(..., ..., monaco.Uri.parse(originalModelPath))
modifiedModelPath string Path for the "modified" model. Will be passed as a third argument to .createModel method - monaco.editor.createModel(..., ..., monaco.Uri.parse(modifiedModelPath))
theme vs | vs-dark | string vs (vs theme equals light theme) The theme for the monaco editor. Define new themes by monaco.editor.defineTheme.
options object {} IStandaloneDiffEditorConstructionOptions
width number | string 100% Container width
height number | string 100% Container height
className string Container class name
onBeforeMount (monaco: Monaco) => void Execute before the editor instance is created
onMount (editor: monaco.editor.IStandaloneDiffEditor, monaco: Monaco) => void Execute after the editor instance has been created
#loading slot 'loading...' Loading status
#failure slot 'load failed' failure status

Vite

If you use vite, you need to do this (see #1791 (comment) for details).

import { loader } from '@vue-monaco/editor'

import * as monaco from 'monaco-editor'
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'

self.MonacoEnvironment = {
  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()
  }
}

loader.config({ monaco })

Inspiration

MonacoVue is made possible thanks to the inspirations from the following projects:

License

MIT