MixOne:Electron Remote模块的现代化继任者
引言
在Electron生态系统中,Remote模块曾是一个革命性的功能,它允许渲染进程直接访问主进程的API,极大简化了跨进程通信。然而,随着Electron v14的发布,Remote模块因严重的安全隐患和性能问题被正式弃用。本文将介绍MixOne------一个专为解决Remote模块遗留问题而设计的现代化替代方案,它不仅解决了安全问题,还通过优雅的语法糖显著提升了开发体验。
模块的问题回顾
安全隐患
Remote模块最大的问题在于其"全有或全无"的权限模型。一旦启用,任何渲染进程(包括第三方网页)都能访问完整的Node.js和Electron API,这为恶意代码提供了可乘之机:
jsx
// 恶意网站可以这样利用remote
const { shell } = require('electron').remote;
shell.openExternal('https://malicious.site');
架构混乱
Remote模糊了主进程和渲染进程的边界,导致代码组织混乱,难以维护。
性能瓶颈
通过 remote 模块可以访问主进程的对象、类型、方法,但这些操作都是跨进程的,跨进程操作性能上的损耗可能是进程内操作的几百倍甚至上千倍。 小到更新这个对象的属性,大到使用这个对象的方法,都是跨进程的,这种累积性的性能损耗。
MixOne的解决方案
编译时权限控制
MixOne的核心创新在于编译时确定页面权限。开发者编写去IPC的语法糖将会被MixOne脚手架编译为主进程代码。
这种设计意味着即使第三方页面被加载,它们也无法任意的去访问原生功能,从根本上杜绝了安全风险。
直观的语法糖
MixOne提供了简洁的API调用方式,消除了IPC通信的样板代码。对比传统IPC和MixOne的实现:
传统方式:
jsx
// 主进程
ipcMain.handle('read-file', async (event, path) => {
return await fs.promises.readFile(path, 'utf-8');
});
// 渲染进程
const content = await ipcRenderer.invoke('read-file', '/path/to/file');
MixOne方式:
jsx
// 任何地方(MixOne自动处理进程间通信)
const content = await NodeJS.fs.readFile('/path/to/file', 'utf-8');
从"NodeJS.fs"开始的关键词,一样就可以知道这会编译为主进程代码,其功能就是读取文件内容。
其他还有以"Main.(API)"方式访问主进程API的功能。
在主进程编写了MixOne插件(Plugin JavaScript),就可以通过"PJS.(Plugin Name)"来访问插件的功能。
性能优化
-
**注释批处理。**合并多个API调用减少IPC次数
当要频繁使用主进程API的代码片段,我们可以把它封装为一个函数,并给它加上注释"// @MainProcess"即可变为主进程代码,这样函数内部频繁访问Electron API的语法依旧处于主进程执行,只给最终处理结果。解决了remote累积性的性能损耗。
-
插件功能
其次解决这样的性能损耗还可以通过编写MixOne的plugin JavaScript,通过"PJS."关键字开头来访问封装的插件功能。这样的插件不仅能集中处理原生功能,还能记录状态,在多个页面甚至多个窗口可以集成上一次操作的状态往下操作。
统一代码组织
MixOne允许你将相关功能组织在同一个文件中。无论是主进程还是渲染进程都可以直接导入使用,MixOne会在背后自动处理进程通信。

迁移指南
-
全局安装MixOne
jsxnpm install mixone -g
-
确定你原来的项目是HTML5原生、vue、react的三种技术栈模式之一。在创建mixone项目时候选择对应的技术栈模式。
jsxmixone create my-mixone-project
-
在访问原生功能的位置直接改为以"NodeJS.","Main."的方式进行访问,删除原来的主进程代码和访问实现。
为什么选择MixOne?
- 减少约60%的IPC相关代码。
- 更好的控制性能。
- 军事级别的安全。编译时确定的权限模型比运行时检查更可靠。可编译为V8字节码打包发布。
- 一套代码可打包浏览器和桌面应用(window、macOS、Liunx)。
- ......
结论:
MixOne不是简单的Remote替代品,而是Electron跨进程通信的现代化解决方案。它继承了Remote易用性的优点,同时解决了安全、性能和代码组织等关键问题。
MixOne不仅可以开发桌面,它还能一套代码打包浏览器。让CS和BS能同时考虑的脚手架工具。
对于新项目,我们强烈建议直接采用MixOne;对于现有项目,渐进式迁移也能带来立竿见影的效果。
在Electron官方放弃Remote模块后,MixOne填补了这一空白,为开发者提供了既安全又高效的开发体验,是Electron应用开发的未来方向。