Monaco Editor is the code editor that powers VS Code, now it's available as a Vue component <MonacoEditor>
thanks to this project.
npm install vue-monaco
Or
yarn add vue-monaco
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>
<!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');`)}`
}
}
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
:boolean
Indicate that this is a DiffEditor,false
by default.
- Params:
monaco
:monaco module
Called before mounting the editor.
- Params:
editor
:IStandaloneCodeEditor
for normal editor,IStandaloneDiffEditor
for diff editor.
Called when the editor is mounted.
Editor value is updated.
- Params:
value
: New editor value.event
: Theevent
fromonDidChangeModelContent
.
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.
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 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.
- 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
vue-monaco © egoist, Released under the MIT License.
Authored and maintained by egoist with help from contributors (list).
Website · GitHub @egoist · Twitter @_egoistlily