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-monaco
Or
yarn add vue-monaco
Usage
Use ESM version with webpack
Use monaco-editor-webpack-plugin:
const MonacoEditorPlugin = require('monaco-editor-webpack-plugin')
module.exports = {
plugins: [
new MonacoEditorPlugin({
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' } })
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 of monaco.editor.create
.value
: A shortcut to set options.value
.theme
: A shortcut to set options.theme
.language
: A shortcut to set options.language
.amdRequire
: Load monaco-editor using given amd-style require function.diffEditor
: boolean
Indicate that this is a DiffEditor, false
by default.
Component Events
editorWillMount
Called before mounting the editor.
editorDidMount
Called when the editor is mounted.
change
Editor value is updated.
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
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