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 ...
随机推荐
- Django之META与前后端交互
Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...
- Windows上安装配置SSH教程(7)——几种方式对比
服务端:Windows XP 客户端:Windows 10 由于Cygwin也可以安装OpenSSH,所以客户端其实可以直接使用Cygwin安装OpenSSH,那么在Windows下使用SCP(安全拷 ...
- web service 的跨语言特性
1.用java语言创建一个的服务(Myservice) ①编写一个Imyservice接口(注解不能少) @WebService public interface Imyservice { publi ...
- Vue 进阶之路(七)
之前的文章我们对 vue 的列表输出做了介绍,本章我们来看一下 vue 的组件 component. <!DOCTYPE html> <html lang="en" ...
- .NETCore 基于 dbfirst 体验快速开发项目
简介 今天出场是进化了多年的生成器工具,根据数据库结构(表.视图.存储过程.外键.各种类型.备注)快速生成一个项目,并自带后台管理系统.篇幅有限本文只讲解快速开发的使用过程,具体开发中的细节日后有空再 ...
- 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...
- openlayers4 入门开发系列之台风轨迹篇
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- SQL 高效运行注意事项(二)
SQL Server高效运行总的来说有两种方式: 一. 扩容,提高服务器性能,显著提高CPU.内存,解决磁盘I/O瓶颈.硬件的提升是立竿见影的,而且是风险小,在硬件更新换代非常快的年代, 当SQLSe ...
- 初识Djiango
老师的博客:点我 内容主要是看老师的博客 下面是自己的写的某些自己当时不太懂的. 关于Django的版本的问题 Django官网下载页面 在官网上显示lts的是表示支持长期版本.所以最好下载1.11版 ...
- 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...