Electron

1.简介

先来段代码感受下~~

const electron = require('electron');

const app = electron.app;

const BrowserWindow = electron.BrowserWindow;

varwindow =null;

app.on('ready',function() {

window =newBrowserWindow({width: 800, height: 600});

window.loadURL('https://web.itiger.com');

});

看起来像个普通的nodejs脚本。

官网介绍:仅仅使用JavaScript,HTML,CSS搭建跨平台桌面应用。

使用Chromium和Node.js。相当于一个浏览器的壳,所以你能把它看作成一个被 JavaScript 控制的,精简版的 Chromium 浏览器。所以可以随意的使用JavaScript,HTML,CSS开发。

跨平台:Windows,OS X,Linux....

2.主进程和渲染进程

2.1 主进程

在 Electron 里,运行package.json里main脚本的进程被称为主进程。在主进程运行的脚本可以创建 web 页面的形式展示 GUI。

2.2 渲染进程

由于 Electron 使用 Chromium 来展示页面,所以 Chromium 的多进程结构也被充分利用。每个 Electron 的页面都在运行着自己的进程,这样的进程我们称之为渲染进程。

2.3 主进程与渲染进程的区别

主进程使用 BrowserWindow 实例创建网页。每个 BrowserWindow 实例都在自己的渲染进程里运行着一个网页。当一个 BrowserWindow 实例被销毁后,相应的渲染进程也会被终止。

主进程管理所有页面和与之对应的渲染进程。每个渲染进程都是相互独立的,并且只关心他们自己的网页。

由于在网页里管理原生 GUI 资源是非常危险而且容易造成资源泄露,所以在网页面调用 GUI 相关的 APIs 是不被允许的。如果你想在网页里使用 GUI 操作,其对应的渲染进程必须与主进程进行通讯,请求主进程进行相关的 GUI 操作。

2.4 主进程与渲染进程通信

使用IPC模块

一个例子,在主进程和渲染进程之间发送和处理消息:

//主进程

const ipcMain = require('electron').ipcMain;

ipcMain.on('asynchronous-message',function(event, arg) {

console.log(arg);//  "pilipala"

event.sender.send('asynchronous-reply','hahahhaha');

});

// 渲染进程

const ipcRenderer = require('electron').ipcRenderer;

console.log(ipcRenderer.sendSync('synchronous-message','pilipala'));

ipcRenderer.on('asynchronous-reply',function(event, arg) {

console.log(arg);// "hahahhaha"

});

3. Electron API介绍

有些模块在主进程使用,有的在渲染进程使用,有些在主进程和渲染进程都可以

主进程API模块

3.1Electron BrowserWindow 模块

来段代码感受下~

const BrowserWindow = require('electron').remote.BrowserWindow;

varwin =newBrowserWindow({ width: 800, height: 600, show:false});

win.on('closed',function() { win =null; });

win.loadURL('https://web.itiger.com');

win.show();

new BrowserWindow 时很多参数,设置窗口大小,位置,是否全屏,阴影。title。主题等

参数:https://electron.atom.io/docs/api/browser-window/#new-browserwindowoptions

事件https://electron.atom.io/docs/api/browser-window/#instance-events

3.2 Electron webContents 模块

它负责渲染并控制网页,也是BrowserWindow对象的属性.

来段代码:

const BrowserWindow = require('electron').BrowserWindow;

varwin =newBrowserWindow({width: 800, height: 1500});

win.loadURL("https://web.itiger.com");

varwebContents = win.webContents;

检测网页内容的事件:https://electron.atom.io/docs/api/web-contents/#instance-events

3.3Electron ipcMain 模块

ipcMain模块是类EventEmitter(node 事件监听类)的实例.当在主进程中使用它的时候,它控制着由渲染进程(web page)发送过来的异步或同步消息.从渲染进程发送过来的消息将触发事件.

3.4Electron dialog 模块

来段代码:

const {dialog} = require('electron')

dialog.showOpenDialog({

properties:

['openFile','openDirectory','multiSelections']

})

支持不同的弹窗

方法:https://electron.atom.io/docs/api/dialog/#methods

实现效果:

3.5Electron menu 模块

menu类可以用来创建原生菜单,它可用作应用菜单和context 菜单.

来段代码:

const { app, Menu } = require('electron')

const template = [{

label: app.getName(),

submenu: [{

role:'reload'

}, {

type:'separator'

}, {

role:'hide'

}, {

role:'hideothers'

}, {

type:'separator'

}, {

role:'quit'

}]

}]

const menu = Menu.buildFromTemplate(template)

Menu.setApplicationMenu(menu)

例子:

https://electron.atom.io/docs/api/menu/#examples

3.6Electron global-shortcut 模块

global-shortcut模块可以自定义操作的快捷键。注册的快捷键是系统全局的。

渲染进程模块

3.7 Electron ipcRenderer 模块

ipcRenderer模块是一个EventEmitter类的实例。你可以从渲染进程向主进程发送同步或异步消息. 也可以收到主进程的相应.

两个进程都可用的模块

3.8Electron crashReporter 模块

crash-reporter模块开启发送应用崩溃报告.

来段代码~~自动提交崩溃报告给服务器 :

const crashReporter = require('electron').crashReporter;

crashReporter.start({

productName:'YourName',

companyName:'YourCompany',

submitURL:'https://your-domain.com/url-to-submit',

autoSubmit:true});

4. tigertrade-desktop-app 项目介绍

4.1 目录结构

app ---  打包给用户的目录

build --- 构建目录 包括需要用到的证书,logo等

dist ----- 打包后

Two-Package Structure

两个package.json文件,原因:分离开发依赖和生成环境依赖

4.2 代码介绍

......

4.3 打包

electron-packager和electron-builder的选择

electron-builder是基于 electron-packager 实现的,并在此基础上做了 Two-Package.json Structure 的约定,以及自动更新等等功能。

扩展:

eletron和nw.js的区别

NW.js 原名 node-webkit

Electron 的原名是 Atom Shell

1. 应用的入口

在 NW.js 中,一个应用的主入口是一个页面。你在package.json中指定一个主页面,它会作为应用的主窗口被打开。

在 Electron 中,入口是一个 JavaScript 脚本。不同于直接提供一个URL,你需要手动创建一个浏览器窗口,然后通过 API 加载 HTML 文件。你还可以监听窗口事件,决定何时让应用退出。

2. Electron 的工作方式更像 Node.js 运行时。 Electron 的 APIs 更加底层

相关资源:

https://electron.atom.io/

https://electron.org.cn/

https://juejin.im/entry/5a0256a951882541157040d7

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

推荐阅读更多精彩内容