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 页面。
<script>
var remote = require('remote');
var ipc = require('ipc');
new Main(ipc);
</script>
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
.
中定义的本机模块
我正在使用 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 页面。
<script>
var remote = require('remote');
var ipc = require('ipc');
new Main(ipc);
</script>
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
.