Ошибка синтаксиса: невозможно использовать оператор импорта вне модуля — плагин vue electron builder

#javascript #vue.js #webpack #electron

#javascript #vue.js #webpack #electron

Вопрос:

У меня возникли некоторые проблемы с плагином vue-cli-electron-builder. Я пытаюсь использовать nodeIntegration , как описано в документации, но установка для него значения true не даст мне возможности использовать ipcRenderer в моих компонентах vue. Чтобы попытаться устранить проблему, я попытался следовать сценарию предварительной загрузки, но также безуспешно. Поскольку плагин copy webpack не будет копировать preload.js файл когда npm run electron:serve выполняется команда, я скопировал файл вручную внутри dist_electron папки, но я получаю эту ошибку в консоли при открытии приложения

 electron/js2c/renderer_init.js:91 Unable to load preload script: /Users/me/Sites/electron-app-demo/desktop-app/dist_electron/preload.js


(function (exports, require, module, __filename, __dirname, process, global, Buffer) { return function (exports, require, module, __filename, __dirname) { import { ipcRenderer } from 'electron';
                                                                                                                                                           ^^^^^^

SyntaxError: Cannot use import statement outside a module
    at new Script (vm.js:88:7)
    at createScript (vm.js:261:10)
    at Object.runInThisContext (vm.js:309:10)
    at wrapSafe (internal/modules/cjs/loader.js:1047:15)
    at Module._compile (internal/modules/cjs/loader.js:1108:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1173:10)
    at Module.load (internal/modules/cjs/loader.js:992:32)
    at Module._load (internal/modules/cjs/loader.js:885:14)
    at Function.f._load (electron/js2c/asar_bundle.js:5:12694)
    at Object.<anonymous> (electron/js2c/renderer_init.js:91:3099)
 

Внутри preload.js файла у меня есть этот код, который совпадает с документацией плагина electron builder. Файл находится в той же папке background.js , что и файл

 import { ipcRenderer } from 'electron';
window.ipcRenderer = ipcRenderer;
 

И в моем vue.config.js файле у меня есть этот код. Файл помещается за пределы папки src

 const copyPlugin = require('copy-webpack-plugin');

module.exports = {
  configureWebpack: {
    plugins: [
      new copyPlugin([
        { from: 'src/preload.js', to: 'dist_electron/preload.js' }
      ])
    ]
  },
  pluginOptions: {
    electronBuilder: {
      builderOptions: {
        //nodeIntegration: true,
        preload: 'src/preload.js'
      }
    }
  }
}
 

В моем компоненте vue я импортирую ipcRenderer таким образом, если я использую nodeIntegration import { ipcRenderer } from 'electron'; , но безуспешно, или таким образом, если я пытаюсь использовать метод предварительной загрузки скрипта window.ipcRenderer.send()

На данный момент я понятия не имею, как решить эту проблему, и я не могу отправлять сообщения между основным процессом electron и vue. Как я могу это исправить?

Ответ №1:

У меня была такая же проблема, и, кажется, невероятно сложно выяснить, как ее решить… Я прошел через очень похожие шаги

Основная проблема заключается в том, что preload.js не входит в комплект поставки и, следовательно, отсутствует. Копирование его непосредственно в каталог dist явно не является хорошим ответом, и, как вы обнаружили, все равно не работает (причина этого в том, что вы копируете необработанный файл …)

Ваш vue.config.js неверный. Переместите запись предварительной загрузки за пределы элемента builderOptions. Вот так …

 module.exports = {
    pluginOptions: {
        electronBuilder: {
            preload: 'src/preload.js',
 

как описано здесь