3. remote

原文:https://github.com/electron/electron/blob/master/docs/api/remote.md
译者:Lin

从渲染进程使用主进程模块

进程:渲染进程

remote模块提供一个在渲染进程(网页)进程和主进程之间做进程通讯(IPC)的简单方法。

Electron中,GUI相关的模块(例如dialogmenu等)只在主进程中有效,在渲染进程中无效。未了在渲染进程中使用它们,ipc模块必须发送进程间的信息给主进程。有了remote模块,你可以调用主进程袖低昂的方法而不用明确的发送进程间信息,类似于Java的RMI。一个在渲染进程中跟创建一个浏览器窗口的例子:

const {BrowserWindow} = require('electron').remote
let win = new BrowserWindow({width: 800, height: 600})
win.loadURL('https://github.com')

注意:想要反向调用(从主进程访问渲染进程),你可以使用webContents.executeJavascript

远程对象

通过remote模块返回的每个对象(包括函数)都代表着一个主进程(我们调用它来调用一个远程对象或远程函数)中的对象。当你调用一个远程对象的方法、调用一个远程函数,或者通过远程构造器(函数)创建一个新的对象时,你将发送一个同步的进程间消息。

上面的例子中,BrowserWindowwin都是远程对象,并且new BrowserWindow没有在渲染进程中创建一个BrowserWindow对象。相反,他在主进程中创建了一个BrowserWindow对象,并且将这个对应的远程对象返回到渲染线程中,即win对象。

注意:当远程对象第一次通过remote引用过来时只是当前的enumerable properties

注意:所有通过remote模块获取的数组和数据是通过进程间通讯复制过来的A。在渲染进程中修改它们并不会同时在主进程中修改,反过来也一样。

远程对象的生命周期

Electron确保在渲染进程中对应的这个远程对象会一直存在(换句话说,没有垃圾回收机制),对应的主进程中的对象也不会被回收。当远程模块已经被回收,主进程中对应的对象将被销毁。

如果远程对象在渲染进程中内存泄漏(例如存储在一个映射中没有被释放),对应的主进程中的对象也会造成内存泄漏,所以你需要非常小心的防止远程对象发生内存泄漏。

主要的值类型,例如stringsnumbers,都是通过拷贝的方式发送的。

回调到主线程

主进程中的代码可以接收渲染器的回调——来自于remote模块的实例——但是当你使用这个功能室必须非常的小心。

首先,为了避免死锁,回调到主进程是同步调用。你不应该期望主进程能够通过回调得到返回值。

比如你不能给主进程中调用的Array.map中传递一个渲染进程中的函数:

// main process mapNumbers.js
exports.withRendererCallback = (mapper) => {
    return [1, 2, 3].map(mapper)
}

exports.withLocalCallback = () => {
    return [1, 2, 3].map(x => x + 1)
}
// renderer process
const mapNumbers = require('electron').remote.require('./mapNumbers')
const withRendererCb = mapNumbers.withRendererCallback(x => x + 1)
const withLocalCb = mapNumbers.withLocalCallback()

console.log(withRendererCb, withLocalCb)
// [undefined, undefined, undefined], [2, 3, 4]

正如你看到的,渲染器并没有同步回调预期的返回值,并没有匹配到主进程中存在的相同的回掉的返回值。

其次,主进程的回调将会一直持续到它们被回收掉。

例如,下面的代码第一眼看起来是没有问题的。它给一个远程对象上的close事件安装了一个回调:

require('electron').remote.getCurrentWindow().on('close', () => {
  // window was closed...
})

但是记住,这个回调是引用自主进程,除非你显式的写在它。如果你没有显式的卸载它,每当你重新加载你的窗口这个回调都会被再一次安装,每次重启都会泄漏一个回调。

更糟糕的是,由于以前安装的回调的上下文已经被释放掉,当主进程的close事件被分发时将会引起例外。

为了避免这个问题,请确保你清理所有回调到主进程的渲染器回调。这包括清理事件处理器,或者明确的告诉主进程来自渲染进程的回调已经被销毁。

访问主进程的内置模块

主进程的内置模块被作为属性添加到remote模块中,所以你可以像使用electron模块一样直接使用它们。

const app = require('electron').remote.app
console.log(app)

方法

remote模块有以下方法:

remote.require(module)

  • module String类型

返回任意类型 - 主进程中通过require(module)返回的对象。

remote.getCurrentWindow()

返回值为BrowserWindow类型 - 这个页面所在的窗口。

remote.getCurrentWebContents()

返回值为WebContents - 这个网页的网络内容。

remote.getGlobal(name)

  • name String类型

返回任意类型 - 主进程中name对应的全局变量(例如global[name])。

属性

remote.process

主进程的process对象。这个方法类似于remote.getGlobal('process')但是会被缓存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容