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_2938_[Poi2000]病毒_AC自动机
BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...
- Error【0002】:YUM本地源配置问题
1.1 问题背景 通过VMware workstation创建虚拟机,在虚拟机的CDROM设备中,装载操作系统镜像.然后通过mount -o loop的方式,将CDROM设备挂载到系统的/mnt/cd ...
- ./configure、make、make install
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤 一.基本信息 1../configure 是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不 ...
- SAP GUI个性化设置
大概从GUI730开始,GUI品牌化一直不被默认支持,在GUI设置选项里处于灰色状态,如下图: 不过用户还是可以修改注册表的方式来进行修改,让它可以设置! 首先运行Regedit,在目录:HKEY_L ...
- Exp6 信息搜集与漏洞扫描 20164312 马孝涛
1.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(以自己主机为目标) (4)漏洞扫描:会扫, ...
- 『性能』测试一下 MSSqlHelper 的性能
本文没啥技术含量,就是测试一下 MSSqlHelper 在 使用反射.不使用反射 的性能对比. 之后,不要问为什么不用 ORM 这类的东西 —— 会有另外的文章 介绍 自己这些年 自己的ORM 升级历 ...
- Python调用ansible API系列(一)获取资产信息
你想让ansible工作首先就需要设置资产信息,那么我们如何通过使用Python调取Ansible的API来获取资产信息呢? 要提前准备一个hosts文件 获取组或者主机 #!/usr/bin/env ...
- Git操作GitHub时的Proxy配置
无论是使用Android Studio中,VCS >> Git >> Clone, 还是直接Git Clone命令,clone GitHub项目时,出现错误提示:LibreSS ...
- netcore编程之后面对不习惯的xshell黑屏部署,是时候使用jenkins自动化发布工具了
在很久之前net还只能在windows上部署的时候,或许很多创业公司的朋友发布项目还都是人肉部署,反正windows都是可视化的界面,拖拖拉拉,开开关关还不 是特别麻烦...现如今你的项目需要在li ...
- 一起学Android之Dialog
概述 对话框(Dialog)是一个小窗口,在Android系统开发中经常会用到,它提示用户做决定或者输入一些东西,对话框并不填充屏幕,是一个模态(Modal)窗口.Dialog类是所有对话框的基类,应 ...