electron主进程渲染进程,如何利用sharedObject共享数据?
发布于 作者:苏南大叔 来源:程序如此灵动~本文中,苏南大叔和大家继续探讨electron
的数据通信问题。在这里,就不得不提一下:ipcMain
和ipcRenderer
。这两项可以通过不同的事件来传递不同的数据。如果不考虑事件的因素的话,仅仅考虑单纯传递数据的话,其实有个更简单的方案,那就是global
中的sharedObject
。它可以用于主进程和渲染进程通信,同时也可以用于渲染进程之间相互传递数据。
global.sharedObject
,global
这个词儿是固定不变的。而sharedObject
,只不过是大家约定俗成的叫法罢了。实际上您可以换成您喜欢的任何词儿,都不会报错的。
本文测试环境:win10
/electron@3.x
,基于electron-quick-start
项目。
数据存储方案对比
当然,sharedObject
这个数据存储功能是electron
独家提供的,并不是网页的原有特性。如果考虑到网页自身的技术方案的话,渲染进程之间的通信方案还有很多。不过,网页原生的数据存储方案(cookie
/localstorage
等)就照顾不到主进程和渲染进程之间的通信了,对吧?
所以,对于electron
来说,sharedObject
的主要应用场景是主进程和渲染进程的通信。而渲染进程之间的通信,其实也是经过了主进程进行中转的。如果您选择localstorage
等其他方案的话,就是基于传统的网页技术了。
主进程定义sharedObject
不需要引入什么包,直接写就可以。唯一需要注意的是:在渲染进程中用到的key
都要先在主进程中定义好。否则,在渲染进程中直接使用的话,就会看到undefined
之类的字样。要点就一个:先定义好渲染进程所需要的key
。
main.js
:
global.sharedObject = {
argv: process.argv,
site:"newsn.net",
name:"苏南大叔"
}
那么,从上面可以看到,sharedObject
里面有三个值,分别是:argv
/site
/name
。那么这三个键值就是在渲染进程里面可以使用的key
了。
在主进程中,直接添加新的key
也是可以的。比如:
//global.sharedObject = {};
global.sharedObject.extra="附加值";
但是在渲染进程中,做类似的直接定义新的key
操作的话,虽然不会报错,但是并不会生效。
渲染进程读取或修改
读取数据:
var remote = require('electron').remote;
var arguments = remote.getGlobal('sharedObject').argv;
console.log(arguments);
修改数据:
var remote = require('electron').remote;
remote.getGlobal('sharedObject').site="www.newsn.net";
那么对于两个及以上,渲染进程交换数据来说,就是一个渲染进程修改,另外一个渲染进程去读取了,套路和上面是一样的。
注意事项一
如果所操纵的key
在主进程中,没有被定义的话,并不会报错。但是试图读取的时候,就会读取到个undefined
。
在渲染进程中,读取sharedObject
的时候,如果读取到了undefined
。那么,请检查在主进程中的相关定义数据。
注意事项二
正确的使用范例:
mainWindow = new BrowserWindow({
webPreferences:{
nodeIntegration:true
}
})
如果主进程中,把渲染进程的node
能力给禁用掉的话,本文所说的80%内容都没有用了。所以,如果想正常使用sharedObject
。那么,请开启nodeIntegration
。
错误的范例:
mainWindow = new BrowserWindow({
webPreferences:{
nodeIntegration:false
}
})
否则,您可能会看到如下错误提示:
index.html:22 Uncaught ReferenceError: require is not defined
index.html:86 Uncaught ReferenceError: process is not defined
相关文章
总结
sharedObject
,还是比较好用的。在多个页面之间可以相互交换数据。当然,最重要的是,可以用于主进程和渲染进程交换数据。看起来,挺方便的吧?
更多electron
的相关经验文章,请点击苏南大叔的博客:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
主进程和渲染进程之间如何共享 数组数据呢? sharedObject=[{a:1,b:2}] ,这种数据 渲染进程修改无效的哦