Electron & ES6 如何在使用 gulp 和 ES6 模块时实现 require remote/ipc

Electron & ES6 how to implement require remote/ipc when using gulp and ES6 modules

我正在使用 ES6 js 文件,然后由 gulp (browserify/babel) 编译,ES6 文件的示例是:

我有一个普通的 App.js 用于设置主 window 等。然后 html 页面将使用一个 main.min.js 文件,基本上是把我所有的 ES6 类 编译成一个文件组成:

loader.es6 文件

import Main from  './pages/Main.es6'

new Main()

Main.es6 文件

 import Vue from 'vue';

export default class Main extends Vue{
   constructor() {...}
   .....
}

编译后 运行 这一切工作正常而且一切都很好......但是我想如果我想实现 'IPC', 'Remote' 模块,我有编译问题,因为他们无法通过我的 类.

中的 require()import.. 方法找到这些模块

因此执行以下操作失败:

 import Remote from 'remote'
 import Main from  './pages/Main.es6'

 new Main()

var Remote = require('remote')
import Main from  './pages/Main.es6'

new Main()

这有可能做到或实现吗,或者不需要更多考虑,请回到正常的 js。

任何想法/建议都将非常感谢

编辑:添加错误详细信息

有问题的示例文件Main.es6

查看顶部添加的变量 var Remote = require('remote') 这会导致以下错误。

甚至使用 import Remote from 'remote'

{ [Error: Cannot find module 'remote' from '/Volumes/DAVIES/ElectronApps/electron-vuejs-starter/resources/js/pages']
 stream:
  { _readableState:
  { highWaterMark: 16,
    buffer: [],
    length: 0,
    pipes: [Object],
    pipesCount: 1,
    flowing: true,
    ended: false,
    endEmitted: false,
    reading: true,
    sync: false,
    needReadable: true,
    emittedReadable: false,
    readableListening: false,
    objectMode: true,
    defaultEncoding: 'utf8',
    ranOut: false,
    awaitDrain: 0,
    readingMore: false,
    decoder: null,
    encoding: null,
    resumeScheduled: false },
   readable: true,
   domain: null,
   _events:
  { end: [Object],
    error: [Object],
    data: [Function: ondata],
    _mutate: [Object] },
  _maxListeners: undefined,
  _writableState:
   { highWaterMark: 16,
    objectMode: true,
    needDrain: false,
    ending: true,
    ended: true,
    finished: true,
    decodeStrings: true,
    defaultEncoding: 'utf8',
    length: 0,
    writing: false,
    corked: 0,
    sync: false,
    bufferProcessing: false,
    onwrite: [Function],
    writecb: null,
    writelen: 0,
    buffer: [],
    pendingcb: 0,
    prefinished: true,
    errorEmitted: false },
  writable: true,
  allowHalfOpen: true,
  _options: { objectMode: true },
  _wrapOptions: { objectMode: true },
   _streams: [ [Object] ],
  length: 1,
   label: 'deps' } }

一直在玩,我已经设法让它以某种方式工作:

基本上我在 html 页面中设置远程和 ipc 模块,然后将它们传入我的 class 页面。

main.html

 <script>
   var remote = require('remote');
   var ipc = require('ipc');
   new Main(ipc);
 </script>

Main.js - Class File

 export default class Main extends Vue{
  constructor(ipc) {
   ....
   ipc.send('listener here','message here');

   .....

可在此Branch中查看文件:

老实说,解决这个问题的最简单方法是不缩小二进制文件或使用 browserify。 Electron 在全局范围内已经有 require - 你需要做的就是 运行 你的文件通过 Babel 到 ES6 => ES5 编译它们(electron-compile 也让这变得非常简单)。您的 import 语句将被翻译成 require,Electron 将自动处理开箱即用。

一般来说,您在网络上习惯使用的许多优化策略(例如缩小或串联)在 Electron 中是不必要的或没有意义的,您大多可以不这样做!

就我而言,我使用的是 browserify with babelify,如果我尝试:

var remote = require('remote')

我会得到错误:

Error: Cannot find module 'remote' from xxx

但如果我尝试过

var remote = window.require('remote')

有效。

import remote from 'remote' 不起作用,似乎 browserify 无法找到那些未在 package.json.

中定义的本机模块