electron 学习笔记(一)

最近稍稍试了一下electron体验了一波简易开发桌面应用,将之前写的一个create-react-app改造成electron 应用,同时希望在学习electron的时候进一步加深对nodejs的了解
关于如何将一个create-react-app改造成一个electron-create-react-app
参考此文🌰
关于将electron热启加入到其中 我的例子

关于electron 目录组织的方式参考
关于electron的安全性问题

开发者能抵御这种逆向分析的手段也很有限——仅有混淆一途,而且效果也不佳,只要逆向者肯花点时间去分析,还是能够轻松逆向出源码。这也就注定了Electron只适合开源生态的程序的开发,并不适合对技术及知识产权的保护有强需求的企业和个人。
来源52破解

electron主要由两部分构成,一部分是chrome的环境,另外一部分就是集成的v8node环境。chrome环境最核心为electron提供了view的功能,就是展示网页,以及浏览器环境的api。而node提供了与电脑系统交互的环境,包括使用fs模块由或者是调用http。
关于node这里使用了一下深入nodejs的图片

15008583474714.jpg

再进一步看,包括解析javascript语法,以及调用libuv进行io操作等等

了解electron工作模式

 在源码阅读的发现充满着大量的观察者模式的运用,需要稍微了解一下什么是观察者模式下的订阅与发布。

从窗体打开到窗体通讯原理

在electron中,整体依托的是main进程,通过执行main进程打开窗体,在执行main进程的时候,我的理解是就跟打开一个新的进程.

//main.js
function createWindow () {
  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 500,
    'web-preferences': {'web-security': false}
  })

  /*log pid*/
  console.log(`Pid is ${process.pid}`)

  // dev mode load the localhost and pro load the build folder file
  const startUrl = process.env.ELECTRON_START_URL || url.format({
            pathname: path.join(__dirname, '/../build/index.html'),
            protocol: 'file:',
            slashes: true
    });
    mainWindow.loadURL(startUrl);

  // Open the DevTools.
  // mainWindow.webContents.openDevTools()

  // Emitted when the window is closed.
  mainWindow.on('closed', function () {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null
  })
}
app.on('ready', ()=>{
  //main window
  createWindow()
})
/*
browser-window:
https://github.com/electron/electron/blob/master/lib/browser/api/browser-window.js
*/

const {BrowserWindow} = process.atomBinding('window') 

...
 // Make new windows requested by links behave like "window.open"
  this.webContents.on('-new-window', (event, url, frameName,
    disposition, additionalFeatures,
    postData) => {
    const options = {
      show: true,
      width: 800,
      height: 600
    }
    ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN',
      event, url, frameName, disposition,
      options, additionalFeatures, postData)
  })

  this.webContents.on('-web-contents-created', (event, webContents, url,
    frameName) => {
    v8Util.setHiddenValue(webContents, 'url-framename', {
      url,
      frameName
    })
  })

  // Create a new browser window for the native implementation of
  // "window.open", used in sandbox and nativeWindowOpen mode
  this.webContents.on('-add-new-contents', (event, webContents, disposition,
    userGesture, left, top, width,
    height) => {
    let urlFrameName = v8Util.getHiddenValue(webContents, 'url-framename')
    if ((disposition !== 'foreground-tab' && disposition !== 'new-window') ||
      !urlFrameName) {
      return
    }

    let {
      url,
      frameName
    } = urlFrameName
    v8Util.deleteHiddenValue(webContents, 'url-framename')
    const options = {
      show: true,
      x: left,
      y: top,
      width: width || 800,
      height: height || 600,
      webContents: webContents
    }
    ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN',
      event, url, frameName, disposition, options)
  })
  ...

与新窗口的通信就是进程之间通信了,可以了解到不同窗口之间的通信就是要借助进程进行通信了.process对象对应的就是当前进程。在electron中是接触ipcMain与ipcRender进行渲染进程和主进程之间的通信,ipcMain与ipcRender.回到nodejs中进程通信是父子进程在(ipc)(Inter-process communication)上进行通信
所以先看一下process的文档中

process.send(message[, sendHandle[, options]][, callback])
/*If Node.js is spawned with an IPC channel, 
the process.send() method can be used to send messages 
to the parent process. Messages will be received as a 'message' 
event on the parent's ChildProcess object.
*/
//接受信息
process.on('message', function(args){
  
});

再结合nodejs进程通信🌰官方例子
这样就不难懂
ipcRender 中发送信息(直接理解成其是一个子进程与父进程Main通信)

//electron封装后的ipc api
ipcRenderer.send(channel[, arg1][, arg2][, ...])//异步信息发送
ipcRenderer.on(channel, listener)//监听信息
ipcRenderer.on(message,function(event,args){
   //...
})
ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])//同步信息发送

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

推荐阅读更多精彩内容