@justfork/vue-monaco v0.3.1
vue-monaco
Monaco Editor is the code editor that powers VS Code, now it's available as a Vue component <MonacoEditor> thanks to this project.
Install
npm install vue-monacoOr
yarn add vue-monacoUsage
Use ESM version with webpack
Use monaco-editor-webpack-plugin:
// webpack.config.js
const MonacoEditorPlugin = require('monaco-editor-webpack-plugin')
module.exports = {
  plugins: [
    new MonacoEditorPlugin({
      // https://github.com/Microsoft/monaco-editor-webpack-plugin#options
      // Include a subset of languages support
      // Some language extensions like typescript are so huge that may impact build performance
      // e.g. Build full languages support with webpack 4.0 takes over 80 seconds
      // Languages are loaded on demand at runtime
      languages: ['javascript', 'css', 'html', 'typescript']
    })
  ]
}Then use the component:
<template>
  <MonacoEditor class="editor" v-model="code" language="javascript" />
</template>
<script>
import MonacoEditor from 'vue-monaco'
export default {
  components: {
    MonacoEditor
  },
  data() {
    return {
      code: 'const noop = () => {}'
    }
  }
}
</script>
<style>
.editor {
  width: 600px;
  height: 800px;
}
</style>Use AMD version
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>
  <body>
    <div id="app"></div>
    <script src="https://unpkg.com/vue"></script>
    <script src="https://unpkg.com/vue-monaco"></script>
    <script src="monaco-editor/min/vs/loader.js"></script>
    <script>
      require.config({ paths: { vs: 'monaco-editor/min/vs' } })
      new Vue({
        el: '#app',
        template: `
          <monaco-editor
            style="width:800px;height:600px;border:1px solid grey"
            v-model="code" 
            language="javascript" 
            :amdRequire="amdRequire"
          />`,
        data: {
          code: 'const noop = () => {}'
        },
        methods: {
          amdRequire: require
        }
      })
    </script>
  </body>
</html>When loading monaco-editor from a CDN, you need to change require.config to look like this:
require.config({ paths: { vs: 'http://www.mycdn.com/monaco-editor/min/vs' } })
// Before loading vs/editor/editor.main, define a global MonacoEnvironment that overwrites
// the default worker url location (used when creating WebWorkers). The problem here is that
// HTML5 does not allow cross-domain web workers, so we need to proxy the instantiation of
// a web worker through a same-domain script
window.MonacoEnvironment = {
  getWorkerUrl: function(workerId, label) {
    return `data:text/javascript;charset=utf-8,${encodeURIComponent(`
        self.MonacoEnvironment = {
          baseUrl: 'http://www.mycdn.com/monaco-editor/min/'
        };
        importScripts('http://www.mycdn.com/monaco-editor/min/vs/base/worker/workerMain.js');`)}`
  }
}Props
options: The second argument ofmonaco.editor.create.value: A shortcut to setoptions.value.theme: A shortcut to setoptions.theme.language: A shortcut to setoptions.language.amdRequire: Load monaco-editor using given amd-style require function.diffEditor:booleanIndicate that this is a DiffEditor,falseby default.
Component Events
editorWillMount
- Params:
monaco:monaco module
 
Called before mounting the editor.
editorDidMount
- Params:
editor:IStandaloneCodeEditorfor normal editor,IStandaloneDiffEditorfor diff editor.
 
Called when the editor is mounted.
change
Editor value is updated.
- Params:
value: New editor value.event: TheeventfromonDidChangeModelContent.
 
Editor Events
You can listen to the editor events directly like this:
<template>
  <MonacoEditor v-model="code" @editorDidMount="editorDidMount" />
</template>
<script>
export default {
  methods: {
    editorDidMount(editor) {
      // Listen to `scroll` event
      editor.onDidScrollChange(e => {
        console.log(e)
      })
    }
  },
  data() {
    return {
      code: '...'
    }
  }
}
</script>Refer to this page for all editor events.
Methods
getEditor(): IStandaloneCodeEditor: Return the editor instance.
Use ref to interact with the MonacoEditor component in order to access methods: <MonacoEditor ref="editor" />, then this.$refs.editor.getEditor() will be available.
Use the DiffEditor
Use diffEditor prop to indicate that this is a DiffEditor, use original prop to set the content for the original editor, use value prop to set the content for the modified editor.
<MonacoEditor
  language="javascript"
  :diffEditor="true"
  :value="code"
  :original="originalCode"
/>In this case, the component's getEditor() returns the IStandaloneDiffEditor instance, while you can use getModifiedEditor() to get the modified editor which is an IStandaloneCodeEditor instance.
Contributing
- Fork it!
 - Create your feature branch: 
git checkout -b my-new-feature - Commit your changes: 
git commit -am 'Add some feature' - Push to the branch: 
git push origin my-new-feature - Submit a pull request :D
 
Author
vue-monaco © egoist, Released under the MIT License. Authored and maintained by egoist with help from contributors (list).
Website · GitHub @egoist · Twitter @_egoistlily
4 years ago