@ electron/ 远程
@electron/remote 是一个 电子 连接的模块
JavaScript对象从主要过程到渲染器过程. 这让你
访问仅主进程对象, 如它们在渲染器中可用
进程.
⚠️ 警告你们! 这个模块 许多微妙 陷阱几乎总是有更好的方法 完成您的任务 。 譬如说,
ipcRenderer.invoke可以为许多常用案例服务.
@electron/remote 是内置的替换 remote 模块
被腐烂并最终被取出的电子.
从 remote
注:
@electron/remote需要电能13或更高.
你要从内地迁出三件事 remote
模块改为 @electron/remote。 。 。 .
首先,你需要从国家预防机制安装:
$ npm install --save @electron/remote
第二,我们.., @electron/remote/main 主体必须初始化
工艺在从渲染器使用之前:
// in the main process:
require('@electron/remote/main').initialize()
第三个, require('electron').remote 在渲染工艺中必须是
替换为 require('@electron/remote')。 。 。 .
// in the renderer process:
// Before
const { BrowserWindow } = require('electron').remote
// After
const { BrowserWindow } = require('@electron/remote')
说明: 因为这需要通过 npm 而不是内置模块
模块,如果您正在使用 remote 从沙盒过程,你需要
适当配置您的捆绑器以包装 @electron/remote
在预装入脚本中。 当然, 使用 @electron/remote 造出沙盒来
效率低得多。 。 。 .
说明: 单位 electron >= 14.0.0,您必须使用新的 enable API 启用每个想要的远程模块 WebContents 单独: require("@electron/remote/main").enable(webContents)。 。 。 .
单位 electron < 14.0.0, (中文(简体) ), @electron/remote 尊重 enableRemoteModule 网络首选项
数值。 你必须通过 { webPreferences: { enableRemoteModule: true } } 改为
构造器 BrowserWindows. 应获准使用
@electron/remote。 。 。 .
API 参考
这个 remote 模块提供了进行进程间通信的简单方式
(IPC)介于渲染器过程(网页)和主过程之间.
在Electron中,图形用户界面相关模块(例如: dialog, (中文(简体) ), menu (例如)仅指
用于主要工艺,而非制造工艺。 为了使用它们
从渲染器工艺、 ipc 模块以发送进程间
向主进程发送信息。 与 remote 模块,您可以引用方法
在未明确发送进程间消息的情况下,
类似于 Java 的 马绍尔群岛中创建浏览器窗口的例子
渲染器工艺:
const { BrowserWindow } = require('@electron/remote')
let win = new BrowserWindow({ width: 800, height: 600 })
win.loadURL('https://github.com')
要做到这一点,首先需要初始化主进程侧 远程模块:
// in the main process:
require('@electron/remote/main').initialize()
说明: 单位 electron >= 14.0.0 任意远程模块默认已禁用 WebContents 实例并仅为指定的 WebContents 在明确呼叫后 require("@electron/remote/main").enable(webContents)。 。 。 .
单位 electron < 14.0.0 远程模块可以在下列情况下因安全原因被禁用:
BrowserWindow- 通过设置enableRemoteModule选项到false。 。 。 .<webview>- 通过设置enableremotemodule属性为false。 。 。 .
远程对象
返回的每个对象(包括函数) remote 模块代表
对象在主进程(我们称之为远程对象或远程函数).
当您引用远程对象的方法时, 请调用远程函数, 或者创建
带有远程构造器(函数)的新对象,您正在实际发送
同步进程间消息.
在上述例子中 BrowserWindow 财务报告和审定财务报表 win 被远程对象和
new BrowserWindow 没有创造 BrowserWindow 渲染器中的对象
进程。 相反,它创造了一个 BrowserWindow 主进程对象和
返回渲染器过程中相应的远程对象,即:
win 对象.
说明: 仅 可承担属性 出席者 当远程对象首先被引用时,可以通过远程访问.
说明: 组合和缓冲在 IPC 上复制,如果通过 remote
模块。 在渲染器过程中修改它们不会在主上修改它们
过程和反之亦然.
远程物体的寿命
电能保证只要在渲染器过程中的远程物体 生命(换言之,没有收集到垃圾),相应的对象 在主进程内不会发布。 当远程对象已经 收集的垃圾,主要过程中的相应对象将是 贬入.
如果远程对象在渲染器过程中被泄露(例如存储在地图上,但 永不释放),主过程中相应的对象也会被泄露出, 所以,你应该非常小心 不要泄露远程物体.
然而,像字符串和数字这样的主值类型是通过复制发送的.
向主要进程传递回调
主过程中的代码可以接受渲染器的回调——例如:
页:1 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字符串
回返 any - 物体由 require(module) 在主要过程中.
由相对路径指定的模块将相对于切入点解决
讨论主要进程.
譬如说.
project/
├── main
│ ├── foo.js
│ └── index.js
├── package.json
└── renderer
└── index.js
// main process: main/index.js
const { app } = require('@electron/remote')
app.whenReady().then(() => { /* ... */ })
// some relative module: main/foo.js
module.exports = 'bar'
// renderer process: renderer/index.js
const foo = require('@electron/remote').require('./foo') // bar
remote.getCurrentWindow()
回返 BrowserWindow - 这个网页所属的窗口.
说明: 不使用 removeAllListeners 打开 BrowserWindow。使用此工具
删除全部 blur
听众, 禁用触摸栏按钮上的事件, 以及其他意外事件
后果.
remote.getCurrentWebContents()
回返 WebContents - 这个网页的网页内容.
remote.getGlobal(name)
name字符串
回返 any - 全球变量: name (例如:. global[name])主要为:
进程.
属性
remote.process 只读
A 类 NodeJS.Process 对象。 这个 process 对象。 这是相同的
remote.getGlobal('process') 但缓存.
覆盖已曝光物体
没有过滤, @electron/remote 将提供对 JavaScript 的访问
任何渲染器请求的对象。 为了控制可以访问的东西,
@electron/remote 为应用程序提供返回自定义结果的机会
为其中任何 getGlobal, (中文(简体) ), require, (中文(简体) ), getCurrentWindow, (中文(简体) ), getCurrentWebContents, (中文(简体) ),
或任何内建模块属性.
以下事件将首先在 app 电子模块,以及
然后在具体 WebContents 它请求对象。 当发射时
页:1 app 模块,在 Event 对象将是
WebContents 请求的源头 如果有人打来电话
preventDefault,该请求将被拒绝。 如果有的话 returnValue 参数是:
在结果上设定,然后该数值将返回到渲染器,而不是
默认.
活动
事件: '远程要求'
回返情况:
event活动moduleName字符串
何时出院 remote.require() 在 webContents。 。 。 .
通话 event.preventDefault() 将防止模块被返回.
自定义值可以通过设置返回 event.returnValue。 。 。 .
活动:“远取全球”
回返情况:
event活动globalName字符串
何时出院 remote.getGlobal() 在 webContents。 。 。 .
通话 event.preventDefault() 将防止全球返回.
自定义值可以通过设置返回 event.returnValue。 。 。 .
活动:“远地建造”
回返情况:
event活动moduleName字符串
何时出院 remote.getBuiltin() 在
webContents,包括当内建模块作为属性访问时(例如.
require("@electron/remote").BrowserWindow) (中文(简体) ).
通话 event.preventDefault() 将防止模块被返回.
自定义值可以通过设置返回 event.returnValue。 。 。 .
活动: '远取- 当前窗口'
回返情况:
event活动
何时出院 remote.getCurrentWindow() 在 webContents。 。 。 .
通话 event.preventDefault() 这将防止对象被返回.
自定义值可以通过设置返回 event.returnValue。 。 。 .
事件 : “ 远程获取当前网络内容 ”
回返情况:
event活动
何时出院 remote.getCurrentWebContents() 在 webContents。 。 。 .
通话 event.preventDefault() 这将防止对象被返回.
自定义值可以通过设置返回 event.returnValue。 。 。 .