Electron - 工程开发Tips

1. 概述

本文介绍Electron项目开发的一些经验和坑,主要是基于Electron的IM项目。

2. 开发基础

2.1. Vue和React脚手架

2.2. Electron Store

2.3. Electron多窗口 + 托盘 + 截图

https://www.cnblogs.com/xiaoyan2017/p/14403820.html
https://github.com/nashaofu/dingtalk
https://www.cnblogs.com/xiaoyan2017/p/14454624.html
https://www.cnblogs.com/xiaoyan2017

2.4. Default Path

  • 自动升级的安装包下载路径
    C:\Users\Administrator\AppData\Local\foxchat-updater

  • electron-log的默认路径
    C:\Users\Administrator\AppData\Roaming\FoxChat\logs

3. Electron samples

3.1. fsharechat

商业项目,基于Vue的UI,看着不错
还有webrtc功能,做音视频时可以参考
https://github.com/fsharechat/vue-chat
https://github.com/han960619/Vue-chat
https://han960619.github.io/Vue-chat/#/chat

3.2. aermin

react的im,不错的项目,可以重点学习,有正在运行的实例
没有用第三方组件库,而是react原生的组件
https://github.com/aermin/ghChat
https://im.aermin.top

3.3. chat-react

可以跑起来,前端react,后端go,数据库用mysql
UI一般,没有太多参考的价值
后端用Go写的,有空可以学习下

go run .
yarn start

https://gitee.com/ltly/chat-react
https://gitee.com/ltly/chat-online

4. Feature

开发IM客户端时,实现Feature过程的思考

4.1. emoji feature

emoji-mart

https://github.com/missive/emoji-mart

优点:表情很丰富,功能也很全,支持自定义emoji

缺点:

  • 单个emoji的展示,需要自己完成
  • 加载很多emoji时候,很卡,尤其是第一次
  • emoji不会动,不美观

third party: rich editor

https://ant.design/docs/react/recommendation
https://github.com/zenoamaro/react-quill
https://github.com/margox/braft-editor
功能都挺全,用在IM里面有点重(不用支持表情和文本即可,不用加粗、斜体、字号等),所以暂且舍弃

react-contenteditable

https://github.com/lovasoa/react-contenteditable
https://codesandbox.io/s/l91xvkox9l
符合IM当前需求,可以自定义支持的tag,很赞~
渲染前,通知sanitize-html消一下毒
https://github.com/apostrophecms/sanitize-html
渲染时候,通过dangerouslySetInnerHTML渲染即可
https://www.pluralsight.com/guides/how-to-render-html-in-state-string

4.2. catch chat input focus

方法1,removeAllRanges之后,lastRange又回到了开始位置0,怀疑是引用导致,在失去焦点时候,改成document.getSelection().getRangeAt(0).cloneRange()也不行

if (this.state.lastRange) {
  selection.removeAllRanges()
  selection.addRange(this.state.lastRange)
}

但是,下面这个例子是work的。很奇怪,有时间再深入研究
https://segmentfault.com/a/1190000005869372

方法2,步骤和优缺点如下

  • 失去焦点onBlur时候,记录range.endOffset
const lr = document.getSelection().getRangeAt(0)
lastRangeEndOffset = lr.endOffset // number
  • 获取到焦点时候,设置光标位置
const obj = document.getElementById("inputbox")
selection?.collapse(obj, lastRangeEndOffset)

优缺点

  • 优点:记录input失去焦点是光标位置,下次获取焦点,能够成功插入,在两个场景上体验较好:input没有获取焦点时,点击表情面板并输入表情;input没有获取焦点时,键盘输入可见字符时。

  • 缺点:当text和emoji混合时,记录的光标位置,可能是基于Text的,也可能是基于整个nodeList的,所以,恢复焦点时,设置光标位置,就不能简单的如上操作。会导致光标位置不正确,或者js报错(当lastRangeEndOffset > nodeList.length时)

方法3,input非焦点时,点击输入emoji或者键盘输入可见字符时,直接插入到最后即可

var selection = document.getSelection()
const obj = document.getElementById("inputbox")
selection?.collapse(obj, obj.childNodes.length)

飞书的做法:只支持emoji输入到既定光标上。当键盘输入字符时,默认插入到最后,而且当输入中文时,第一个字母会丢失(原因是用于获取focus,上述3个方法同样存在)。

综合对比,采用方法3,逻辑清晰,体验还好。

5. 坑

5.1. change BrowserRouter to HashRouter

React assets图片,在build之后,经过react-route之后,会报错404,解决办法:

  • import
import { Image } from 'antd';
import imgUrl from '../../assets/images/coding.png'

<Image preview={false} src={imgUrl}/>
<img src={imgUrl}></img>

5.2. ipcMain.handle

同一个channel只能被ipcMain.handle只能注册一次,第二次注册会被block住(莫名其妙,还不错报个错),如果想第二次注册成功,需要先调用ipcMain.removeHandler
https://www.electronjs.org/docs/api/ipc-main#ipcmainremovehandlerchannel

5.3. auto-updater取错本地版本号

electron-updater自身的bug,会去取Electron的版本
解决方案: 修改electron-updater中appUpdater.js中isUpdateAvailable函数代码

const pkg=require('../../../package.json');
const isLatestVersionNewer = (0, _semver().gt)(latestVersion, pkg.version);

5.4. Proxy

Linux的proxy,只支持10.0.0.0/8,不支持10.*
Windows下,通过cygwin64,也应该如下配置no_proxy,否则通过yarn electron-builder --publish always,也会发布失败。例如:

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

推荐阅读更多精彩内容