一介绍

electron分为主进程和渲染进程,主进程负责和原生交互,控制窗口等。

渲染进程就是普通网页。主进程和渲染进程可以通过ipcMain(主进程使用)及ipcRenderer(渲染进程用)通信

quick-start中main.js为主进程入口文件

index.html为渲染进程入口文件

另外很重要的一点使用electron没有跨域限制!!!

二 打包

1.快速运行quick-start(开发时启动)

git clone https://github.com/electron/electron-quick-start
cd electron-quick-start
npm install && npm start

2.打包为用户可用文件(mac为.app win.exe)使用 electron-packager

npm install electron-packager --save-dev
npm install electron-packager -g
打包命令(在项目跟目录中)
electron-packager ./ --platform=darwin --asar --arch=x64 --overwrite --icon=imgs/logo.icns --version=1.2.4
--platform=darwin(打包mac系统)
--asar(将代码压缩为二进制文件防止代码泄漏)
--overwrite(替换原来存在的包)
--icon=imgs/logo.icns(包的图标地址)
--ignore node_modules(忽略文件,不打到包内)
--version=1.2.4(打包electron为1.2.4版本的包)

3.打包为可安装文件(electron-builder)

全局安装electron-builder  在package.json中配置如下 执行build命令

{
"name": "macIm",
"version": "1.0.0",
"description": "A minimal Electron application",
"main": "main.js",
"scripts": {
"start": "electron --debug=5858 ./app",
"build": "build"
},
"repository": "https://github.com/electron/electron-quick-start",
"keywords": [
"Electron",
"quick",
"start",
"tutorial",
"demo"
],
"author": "GitHub",
"license": "CC0-1.0",
"build": {
"appId": "com.electron.awen.hello",
"copyright": "awen",
"productName": "macIm",
"asar":false,
"electronVersion":"1.2.4",
"dmg": {
"icon": "build/icon.icns",
"files":"**/*",
"contents": [{
"x": 130,
"y": 220
}, {
"x": 410,
"y": 220,
"type": "link",
"path": "/Applications"
}]
}
}, }

  

三.模块介绍

1.渲染进程与主进程通信

渲染进程引入ipcRenderer模块 主进程引入ipcMain模块,渲染进程通过自定义事件调用主进程的方法如下

//渲染进程
//其中create-folder是事件名,1111是传给主进程的数据
var ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.send('create-folder', '1111'); //渲染进程发送完事件后需要监听住进程回的事件
ipcRenderer.on('create-folder-result', function(event, data) {
console.log(data)//222
} //主进程
const { ipcMain} = require('electron');//es6结构赋值写法
//主进程监听事件
ipcMain.on('create-folder', function(event, data) {
...//主进程干的活
console.log(data)//1111
event.sender.send('create-folder-result','222');//主进程干完活后告诉渲染进程
});

2.菜单 

首先制定菜单模版

let template = [{
label: '编辑',
submenu: [{
label: '撤销',
accelerator: 'CmdOrCtrl+Z',
role: 'undo'
}, {
label: '剪切',
accelerator: 'CmdOrCtrl+X',
role: 'cut'
}, {
label: '复制',
accelerator: 'CmdOrCtrl+C',
role: 'copy'
}, {
label: '粘贴',
accelerator: 'CmdOrCtrl+V',
role: 'paste'
}]
}, {
label: '显示',
submenu: [{
label: '进入全屏幕',
accelerator: (function() {
if (process.platform === 'darwin') {
return 'Ctrl+Command+F'
} else {
return 'F11'
}
})(),
click: function(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.setFullScreen(!focusedWindow.isFullScreen())
}
}
}, {
label: '开发者工具',
accelerator: (function() {
if (process.platform === 'darwin') {
return 'Alt+Command+I'
} else {
return 'Ctrl+Shift+I'
}
})(),
click: function(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.toggleDevTools()
}
}
}, {
type: 'separator'
}]
}, {
label: '窗口',
role: 'window',
submenu: [{
label: '最小化',
accelerator: 'CmdOrCtrl+M',
role: 'minimize'
} ]
} ] //然后在ready中调用以下两个api app.on('ready', function() {
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
})

  

3.和c++混用

由于js调用系统的功能有限,electron也不可能封装所有我们需要的组件,所以我们采用和c++混合开发的方式。将c++代码编译为.node二进制文件提供一些调用系统功能的能力。node自带模块addons可以将c++转为.node,但是版本兼容性不好。我们采用nan包来编译c++代码。遇到以下两个问题。

1.将c++编译为.node文件的电脑node版本需要和electron版本对应。但是有时候node版本和electron的版本相同也会报不匹配。我用了electron两个版本(0.37.8对应node 5.10.0,1.2.4对应node 6.9.0)

2.c++代码出错会将electron进程干死,electron直接白屏。实践证明此类问题都是因为c++出错导致的。

四.坑

在mac上关系窗口后点击软件图片重新打开窗口

如果在app.on('activate')中重新创建窗口会重新加载html,回退到了最初状态肯定不是我们想要的。

实现思路如下

//在窗口colse事件中阻止默认事件,并让窗口隐藏。
this[windowName].on('close', function(event) {
this.hide(windowName)//隐藏窗口
event.preventDefault()//阻止默认事件
}) //app.on('active')中让窗口显示
app.on('activate', () => {
chatWindow.show('chatWindow')
})

  

五.调试  

1.渲染进程调试

打开谷歌开发者工具,剩下的和谷歌调试一样一样的。

mainWindow.webContents.openDevTools(); 

2.主进程node调试

electron-inspector

1.npm install electron-rebuild --save-dev
2.npm install electron-inspector --save-dev
3.启动electron
electron --debug=5858 ./app(app路径)
4.根路径启动electron-inspector(注:第一次使用或更改electron 版本会先编译一下)
node_modules/.bin/electron-inspector(mac)
node_modules\\.bin\\electron-inspector(win) 启动完成后命令行中打印如下
Visit http://127.0.0.1:8080/?port=5858 to start debugging.
5.谷歌浏览器起中访问http://127.0.0.1:8080/?port=5858 就可以愉快的调试了

  

 未完待续。。。

Electron Angular 开发小记的更多相关文章

  1. Visual Studio Code作为Angular开发工具常用插件安装、json-server安装与使用、angular/cli安装失败问题

    前提准备: 搭建好Angular开发环境 1 安装Visual Studio Code 教程简单,不会的去问度娘 2 安装Chrome浏览器 教程简单,不会的趣闻度娘 3 Visual Studio ...

  2. Angular开发实践(一):环境准备及框架搭建

    引言 在工作中引入Angular框架将近一年了,在这一年中不断的踩坑和填坑,当然也学习和积累了很多的知识,包括MVVM框架.前后端分离.前端工程化.SPA优化等等.因此想通过Angular开发实践这系 ...

  3. Angular开发技巧

    由于之前有幸去参加了ngChina2018开发者大会,听了will保哥分享了Angular开发技巧,自己接触Angular也有差不多快一年的时间了,所以打算对Angular开发中的一些技巧做一个整理 ...

  4. NodeJS+Express+MySQL开发小记(2):服务器部署

    http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...

  5. angular开发控制器之间的通信

    一.指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式(单例模式) 二.基于scope继承的方式: 最简单的让控制器之间进行通信的方法 ...

  6. angular开发中的两大问题

    一.在我们的angular开发中,会请求数据但轮播图等...在请求过数据后他的事件和方法将不再执行: 看我们的解决方案一: app.controller("text",functi ...

  7. Angular开发实践(七): 跨平台操作DOM及渲染器Renderer2

    在<Angular开发实践(六):服务端渲染>这篇文章的最后,我们也提到了在服务端渲染中需要牢记的几件事件,其中就包括不要使用window. document. navigator等浏览器 ...

  8. angular开发中对请求数据层的封装

    代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...

  9. [转] electron实战开发详细流程

    [From] http://www.myk3.com/arc-8856.html 很久没有更新博客,人越来越懒了,唉 说好做的electron教程距离上次玩electron已经过去了好几个月了.. 这 ...

随机推荐

  1. Xamarin的不归路-使用Gorilla Player实时预览XAML

    搞了一天,才安装好,记录一下遇到的坑,为大家节约些时间. 一.下载软件 软件下载地址:http://gorillaplayer.com/ 没有FQ前用360极速浏览器和迅雷下载了好多次都失败了.用了蓝 ...

  2. 使用--gc-section编译选项减小程序体积

    本周在给程序添加功能的时候,突然发现,我只是写了几个函数,还没调用,size就变大了.这肯定是不行的嘛,没用的函数就应该不链接进来,占用我宝贵的空间. 这种功能,讲道理编译器肯定要支持的,于是搜了一下 ...

  3. java并发之volatile

    volatile是轻量级的synchronized,它在多处理器应用开发中保证了共享变量的“可见性”(可见性指当一个线程修改共享变量后,其它线程可以看到这个修改). volatile如果使用合理会比s ...

  4. HTML实践发现(标签<pre>)

    1. (1).第一种编辑: (2).浏览器中显示: 2. (1).第二种编辑 (2).浏览器中显示: 结果发现:使用标签<pre>,在浏览器中显示的结果与在<pre>下方编写的 ...

  5. 广州PostgreSQL用户会技术交流会小记 2015-9-19

    广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...

  6. MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...

  7. 基于 Jenkins 快速搭建持续集成环境

      什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火 ...

  8. ABP理论学习之依赖注入

    返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...

  9. 剑指Offer面试题:19.包含Min函数的栈

    一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...

  10. MySQL LIST分区

    200 ? "200px" : this.width)!important;} --> 介绍 LIST分区和RANGE分区非常的相似,主要区别在于LIST是枚举值列表的集合, ...