electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)
窗口间通信的问题
electron窗口通信比nwjs要麻烦的多
electron分主进程和渲染进程,渲染进程又分主窗口的渲染进程和子窗口的渲染进程
主窗口的渲染进程给子窗口的渲染进程发消息
subWin.webContents.on('dom-ready', () => {
subWin.webContents.send('message', {
title: self.$root.a[self.$root.aIndex].title,
content: window.UE.instants.ueditorInstant0.getContent(),
id: self.$root.a[self.$root.aIndex].id,
winId: item.winId,
siteId: item.id,
url,
type
});
});
子窗口的渲染进程接收消息的代码
ipcRenderer.on('message', (event, article) => {
console.log(article);
})
注意,应该dom-ready了之后再发,要不然你的子窗口进程有可能接收不到消息
子窗口的渲染进程给主窗口的渲染进程发消息比较麻烦
子窗口要先把消息发送给主进程,再由主进程中转给主窗口
const { ipcRenderer} = require('electron');
ipcRenderer.send('articleRefreshMain', {
siteId:'cnblogs',
url: url
});
主进程接收消息后中转给主窗口渲染进程的代码
import { app, BrowserWindow,ipcMain } from 'electron'
ipcMain.on('articleRefreshMain', (event, message) => {
mainWindow.webContents.send('contentRefreshRenderer', message);
});
主窗口渲染进程接收消息的代码
ipcRenderer.on('articleRefreshRenderer', (e, message) => {
self.$root.a[self.$root.aIndex][message.siteId] = {
url: message.url
}
self.$root.needSave.a = true;
});
监听编辑器内图片删除的事件
通过黏贴或者拖拽进编辑器的图片,我把它复制到了文章的目录(用户本地目录)
如果用户在编辑文章的过程中,又删了这个图片,那么我应该在目录中也删除这个图片
这就需要监控文章编辑器的图片变化
我用的是H5的MutationObserver对象,理论上,用这个东西可以监控任何DOM的变化
var editorDocument = document.getElementById("ueditor_0").contentWindow.document;
var observer = new MutationObserver(records => {
self.$root.needSave.c = true;
records.forEach((item, index) => {
if (item.removedNodes.length > 0 && item.removedNodes[0].tagName == "IMG") {
var path = decodeURI(item.removedNodes[0].src.substr(7));
fs.unlink(path, err => {
if (err) console.log(err);
});
}
});
});
observer.observe(editorDocument, {
childList: true,
subtree: true
});
electron-vue获取app版本号的hack代码
本来electron获取app版本号很简单,只要如下即可(以下代码运行在main进程中)
import { app, BrowserWindow,ipcMain } from 'electron'
var versionStr = app.getVersion();
getVersion: 如果应用程序的 package. json 文件中找不到版本号, 则返回当前包或者可执行文件的版本(就是electron的版本号)。
因为我用的electron-vue,他又两种模式,生产模式和开发模式
在生产模式下没任何问题
在开发模式下,它其实是起了一个webserver,让electron加载一个localhost的地址
这样做主要是为了使用vue的hotload的优势
但这样的话,electron就找不到 package. json 文件中的版本号了
怎么办呢?
我们在应用启动的时候,先在主进程中把版本号拿出来
if (process.env.NODE_ENV !== 'development') {
global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
winURL = `file://${__dirname}/index.html`;
}else{
app.getVersion = ()=> curVersion;
winURL = `http://localhost:9080`;
}
注意,我们通过app.getVersion = ()=> curVersion;把getVersion方法给hack了
把文章内容填入特殊的网站编辑器中
在处理文章提交到知乎的过程中
发现知乎用了一个特殊的编辑器,
(一个基于reactjs的编辑器,github上有开源的,忘记地址了)
怎么搞都搞不定,他甚至不支持设置HTML的内容
最后用了electron的操作剪切板的能力才搞定的
先把文章内容放到剪贴板,再focus知乎的编辑器,再执行黏贴事件
代码如下:
const {
clipboard,
ipcRenderer,
remote
} = require('electron');
var win = remote.BrowserWindow.fromId(this.winId);
win.focus();
setTimeout(function () {
document.getElementsByClassName("WriteIndex-titleInput")[0].children[0].focus();
clipboard.writeText(this.title);
win.webContents.paste();
setTimeout(function () {
document.getElementsByClassName("public-DraftEditor-content")[0].click();
clipboard.writeHTML(this.doc.body.innerHTML);
win.webContents.paste();
ipcRenderer.send('articleRefreshMain', {
siteId: 'zhihu',
url: window.location.href
});
}.bind(this), 800)
}.bind(this), 800)
注意,如果要黏贴两个地方,最好间隔个几百毫秒
要不然网页还没反应过来,你就focus另一个地方了,会导致黏贴不成功。
开源说明
源码地址:https://github.com/xland/xiangxuema(界面截屏也在这里)
支持平台:win x64、mac x64、linux x64(打包编译脚本都在)
编译好的应用程序,我放到了阿里云的CDN里,下载速度超赞,大家可以下载来用用看
有什么问题,请不吝提交issue,有issue必回!
electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)的更多相关文章
- 看github上有18万star的第一开源项目如何教你学前端编程的
作为 Github | star 第一开源项目,已经超过18万 star:比之前最火的bootstrap的10万star还要多出8w,freeCodeCamp 越来越受关注,建站两年时间不到已经近40 ...
- 使用electron开发一个h5的客户端应用创建http服务模拟后台接口mock
使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock 在上一篇<electron快速开始>里讲述了如何快速的开始一个electron的应用程序,既然electr ...
- 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- Vue 全家桶 + Electron 开发的一个跨三端的应用
代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- Android开发周报:Flyme OS开源、经典开源项目解析
Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...
- 桌面应用之electron开发与转换
桌面应用之electron开发与转换 一,介绍与需求 1.1,介绍 1. Electron简介 Electron是用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Ele ...
随机推荐
- BZOJ_1861_[Zjoi2006]Book 书架_splay
BZOJ_1861_[Zjoi2006]Book 书架_splay 题意: 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在 ...
- 【Canal源码分析】Sink及Store工作过程
一.序列图 二.源码分析 2.1 Sink Sink阶段所做的事情,就是根据一定的规则,对binlog数据进行一定的过滤.我们之前跟踪过parser过程的代码,发现在parser完成后,会把数据放到一 ...
- Ubuntu 18 安装chrome
1.下载chrome文件 32位使用如下命令 wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb ...
- visual studio2015中开发python
之前下载了visual studio2017但是发现很不好用,不如使用matlab与visual studio混合编程就根本找不到visual studio,只有下了visual studio2015 ...
- Java 11 新功能来了!
关键时刻,第一时间送达! 目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出 ...
- djiango的模板语言(template)
老师的博客:http://www.cnblogs.com/liwenzhou/p/7931828.html 官方文档:https://docs.djangoproject.com/en/1.11/re ...
- Mysql存储过程历史表备份
应用背景 SCADA采集系统需要将实时数据存入历史表.问题1:如何更简单的添加历史数据?2.海量历史数据,比如年数据,如何快速筛选 画曲线? 利用mysql的事件,每小时存一次采集数据: 每月备份历史 ...
- Windows中使用Mysql-Proxy实现Mysql读写分离
1.简介 读写分离:当业务量上来时,往往一台单机的mysql数据库不能满足性能需求,这时候就需要配置主从库读写分离来解决性能瓶颈.简单的来说,就是原先一台数据库既读又写,现在改成一台写和1台以上读. ...
- web scraper 抓取网页数据的几个常见问题
如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据. 相关文章: 最简单的数据抓取教程,人人都用得上 web scraper 进阶教程,人人都用得上 如果你在使用 web s ...
- Android SQLite 数据库学习
SQLite 数据库简介 SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本.它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需 ...