SimulatedGREG / electron-vue

An Electron & Vue.js quick start boilerplate with vue-cli scaffolding, common Vue plugins, electron-packager/electron-builder, unit/e2e testing, vue-devtools, and webpack.
https://simulatedgreg.gitbooks.io/electron-vue/content/
MIT License
15.47k stars 1.54k forks source link

How to integrate monaco editor? #1107

Closed yyxy closed 3 years ago

yyxy commented 3 years ago

I try the monaco samples in https://github.com/microsoft/monaco-editor/blob/main/docs/integrate-esm.md , it's ok. but when I use the electron-vue , there is an error as bellow:

Uncaught Error: Cannot find module 'monaco-editor' 
    at Module._resolveFilename (module.js:543:15)
    at Function.Module._resolveFilename (E:\vue-monaco-electron\node_modules\electron\dist\resources\electron.asar\common\reset-search-paths.js:35:12) 
    at Function.Module._load (module.js:473:25)
    at Module.require (module.js:586:17)
    at require (internal/module.js:11:18)
    at eval (webpack:///external_%22monaco-editor%22?:1:18) 
    at Object.monaco-editor (http://localhost:9080/renderer.js:1790:1) 
    at __webpack_require__ (http://localhost:9080/renderer.js:791:30) 
    at fn (http://localhost:9080/renderer.js:102:20)
    at eval (webpack:///./src/renderer/components/Monaco.vue?./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options:2:71)

My package config as bellow:

"dependencies": {
    "axios": "^0.18.0",
    "monaco-editor": "^0.26.1",
    "monaco-editor-electron": "^1.0.6",
    "vue": "^2.5.16",
    "vue-electron": "^1.0.6",
    "vue-router": "^3.0.1",
    "vuex": "^3.0.1",
    "vuex-electron": "^1.0.0"
  },
  "devDependencies": {
    "ajv": "^6.5.0",
    "babel-core": "^6.26.3",
    "babel-eslint": "^8.2.3",
    "babel-loader": "^7.1.4",
    "babel-minify-webpack-plugin": "^0.3.1",
    "babel-plugin-istanbul": "^4.1.6",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-stage-0": "^6.24.1",
    "babel-register": "^6.26.0",
    "cfonts": "^2.1.2",
    "chai": "^4.1.2",
    "chalk": "^2.4.1",
    "copy-webpack-plugin": "^4.5.1",
    "cross-env": "^5.1.6",
    "css-loader": "^0.28.11",
    "del": "^3.0.0",
    "devtron": "^1.4.0",
    "electron": "^2.0.4",
    "electron-builder": "^20.19.2",
    "electron-debug": "^1.5.0",
    "electron-devtools-installer": "^2.2.4",
    "eslint": "^4.19.1",
    "eslint-config-standard": "^11.0.0",
    "eslint-friendly-formatter": "^4.0.1",
    "eslint-loader": "^2.0.0",
    "eslint-plugin-html": "^4.0.3",
    "eslint-plugin-import": "^2.12.0",
    "eslint-plugin-node": "^6.0.1",
    "eslint-plugin-promise": "^3.8.0",
    "eslint-plugin-standard": "^3.1.0",
    "file-loader": "^1.1.11",
    "html-webpack-plugin": "^3.2.0",
    "inject-loader": "^4.0.1",
    "karma": "^2.0.2",
    "karma-chai": "^0.1.0",
    "karma-coverage": "^1.1.2",
    "karma-electron": "^6.0.0",
    "karma-mocha": "^1.3.0",
    "karma-sourcemap-loader": "^0.3.7",
    "karma-spec-reporter": "^0.0.32",
    "karma-webpack": "^3.0.0",
    "listr": "^0.14.3",
    "mini-css-extract-plugin": "0.4.0",
    "mocha": "^5.2.0",
    "monaco-editor-webpack-plugin": "^4.1.1",
    "node-loader": "^0.6.0",
    "node-sass": "^4.9.2",
    "require-dir": "^1.0.0",
    "sass-loader": "^7.0.3",
    "spectron": "^3.8.0",
    "style-loader": "^0.21.0",
    "url-loader": "^1.0.1",
    "vue-devtools": "^5.1.4",
    "vue-html-loader": "^1.2.4",
    "vue-loader": "^15.2.4",
    "vue-style-loader": "^4.1.0",
    "vue-template-compiler": "^2.5.16",
    "webpack": "^4.15.1",
    "webpack-cli": "^3.0.8",
    "webpack-dev-server": "^3.1.4",
    "webpack-hot-middleware": "^2.22.2",
    "webpack-merge": "^4.1.3"
  }

The code:

<script>
import * as monaco from 'monaco-editor'

self.MonacoEnvironment = {
getWorkerUrl: function (moduleId, label) {
if (label === 'json') {
return './json.worker.bundle.js'
}
if (label === 'css' || label === 'scss' || label === 'less') {
return './css.worker.bundle.js'
}
if (label === 'html' || label === 'handlebars' || label === 'razor') {
return './html.worker.bundle.js'
}
if (label === 'typescript' || label === 'javascript') {
return './ts.worker.bundle.js'
}
return './editor.worker.bundle.js'
}
}

export default {
mounted () {
console.log(this.$refs.container)
const container = this.$refs.container
const editor = monaco.editor.create(container, {
fontSize: 14,
language: 'html',
folding: true,
foldingStrategy: 'indentation', 
automaticLayout: true, 
overviewRulerBorder: false, 
scrollBeyondLastLine: false, 
minimap: {
enabled: false
},
value: 'test',
lineNumbers: 'off'
})
container.style.width = '100%'
container.style.height = '800px'
console.log(editor)
}
}
</script>

webpack config in .electron-vue

let rendererConfig = {
  // devtool: '#cheap-module-eval-source-map',
  entry: {
    renderer: path.join(__dirname, '../src/renderer/main.js'),
    'editor.worker': 'monaco-editor/esm/vs/editor/editor.worker.js',
        'json.worker': 'monaco-editor/esm/vs/language/json/json.worker',
        'css.worker': 'monaco-editor/esm/vs/language/css/css.worker',
        'html.worker': 'monaco-editor/esm/vs/language/html/html.worker',
        'ts.worker': 'monaco-editor/esm/vs/language/typescript/ts.worker'
  },
  externals: [
    ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))
  ],

I tried many ways without success, Please help, Thanks.

yyxy commented 3 years ago

use import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'