Заставить монако работать с vuejs и электроном

Меня интересует использование редактора Монако в проекте Электрон, поддерживаемом Vue.js.

Пока:

Microsoft предоставляет Электронный образец (который я запускал и работает правильно)

Существует множество vue.jsnpm репозитории для монако, но ни один из них не поддерживает казаться для полной поддержки Electron прямо из коробки.

Наиболее многообещающим выглядит vue-monaco, но я столкнулся с проблемами при его правильной интеграции.

AMD Требуется?

Это код из образца Microsoft для использования с Electron

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Monaco Editor!</title>
    </head>
    <body>
        <h1>Monaco Editor in Electron!</h1>
        <div id="container" style="width:500px;height:300px;border:1px solid #ccc"></div>
    </body>

    <script>
        // Monaco uses a custom amd loader that overrides node's require.
        // Keep a reference to node's require so we can restore it after executing the amd loader file.
        var nodeRequire = global.require;
    </script>
    <script src="../node_modules/monaco-editor/min/vs/loader.js"></script>
    <script>
        // Save Monaco's amd require and restore Node's require
        var amdRequire = global.require;
        global.require = nodeRequire;
    </script>

    <script>
        // require node modules before loader.js comes in
        var path = require('path');

        function uriFromPath(_path) {
            var pathName = path.resolve(_path).replace(/\\/g, '/');
            if (pathName.length > 0 && pathName.charAt(0) !== '/') {
                pathName = '/' + pathName;
            }
            return encodeURI('file://' + pathName);
        }

        amdRequire.config({
            baseUrl: uriFromPath(path.join(__dirname, '../node_modules/monaco-editor/min'))
        });

        // workaround monaco-css not understanding the environment
        self.module = undefined;

        // workaround monaco-typescript not understanding the environment
        self.process.browser = true;

        amdRequire(['vs/editor/editor.main'], function() {
            var editor = monaco.editor.create(document.getElementById('container'), {
                value: [
                    'function x() {',
                    '\tconsole.log("Hello world!");',
                    '}'
                ].join('\n'),
                language: 'javascript'
            });
        });
    </script>
</html>

Модуль, который я использую, позволяет делать что-то вроде этого:

<template>
    <monaco-editor :require="amdRequire" />
</template>

<script>
export default {
    methods: {
        amdRequire: window.amdRequire
        // Or put this in `data`, doesn't really matter I guess
    }
}
</script>

Кажется, я не могу понять, как получить правильную переменную amdRequire, определенную в Electon + vue. Я верю, что если я смогу победить это, все остальное станет просто.

В FAQ по Electron кое-что об этом упоминается (я думаю): Я не могу подать в суд на jQuery / RequireJS / Meteor / AngularJS в Electron

Образец кода

Я разместил образец проекта на GitHub https://github.com/jeeftor/Vue-Monaco-Electron с "оскорбительным" компонентом, находящимся в ./src/renderer/components/Monaco.vue

Резюме

Как мне заставить этот редактор Monaco правильно загружаться внутри компонента Vue.js, который будет запускаться внутри электрона?

Спасибо за любую помощь, которую вы можете предложить.

3
0
1 906
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я делаю почти то же самое, только без дополнительного компонента vue-monaco. Немного потревожившись, я смог решить проблему:

function loadMonacoEditor () {
  const nodeRequire = global.require

  const loaderScript = document.createElement('script')

  loaderScript.onload = () => {
    const amdRequire = global.require
    global.require = nodeRequire

    var path = require('path')

    function uriFromPath (_path) {
      var pathName = path.resolve(_path).replace(/\\/g, '/')

      if (pathName.length > 0 && pathName.charAt(0) !== '/') {
        pathName = '/' + pathName
      }

      return encodeURI('file://' + pathName)
    }

    amdRequire.config({
      baseUrl: uriFromPath(path.join(__dirname, '../../../node_modules/monaco-editor/min'))
    })

    // workaround monaco-css not understanding the environment
    self.module = undefined

    // workaround monaco-typescript not understanding the environment
    self.process.browser = true

    amdRequire(['vs/editor/editor.main'], function () {
      this.monaco.editor.create(document.getElementById('container'), {
        value: [
          'function x() {',
          '\tconsole.log("Hello world!");',
          '}'
        ].join('\n'),
        language: 'javascript'
      })
    })
  }

  loaderScript.setAttribute('src', '../node_modules/monaco-editor/min/vs/loader.js')
  document.body.appendChild(loaderScript)
}

Я только что взял образец электронов и немного подправил. Я вызываю функцию loadMonacoEditor в созданной функции компонентов.

Чтобы не получить проблему с Not allowed to load local resource: file:///C:/.../node_modules/monaco-editor/min/vs/editor/editor.main.css, вам также необходимо установить

webPreferences: {
  webSecurity: false
}

в вашем экземпляре BrowserWindow.

Есть ли шанс, что у вас есть репо на GitHub для этого?

Jeef 10.05.2018 13:35

Конечно, взгляните на этот компонент в моем репо: github.com/PapaMufflon/hugo-desktop/blob/master/src/renderer‌ /…

Papa Mufflon 11.05.2018 14:09

Другие вопросы по теме