作者:钟离,酷家乐PC客户端负责人

原文地址:webfe.kujiale.com/electron-ku…

酷家乐客户端:下载地址 www.kujiale.com/activity/13…

文章背景:在酷家乐客户端在V12改版成功后,我们积累了许多的宝贵的经验和最佳实践。前端社区里关于Electron知识相对较少,因此希望将这些内容以系列文章的形式分享出来。

系列文章:

  • 【Electron】酷家乐客户端开发实践分享 — 入坑篇
  • 【Electron】酷家乐客户端开发实践分享 — 软件自动更新
  • 【Electron】酷家乐客户端开发实践分享 — 浏览器启动客户端
  • 不定期更新...

本文的初衷

Electron所使用的技术栈(JavaScript、NodeJs、HTML、CSS)和web前端工程师完美契合。于是,越来越多的前端工程师,用Electron来开发桌面客户端的开发,我也是其中的一员。

虽然Electron技术栈对前端工程师比较友好,但是概念较多,和web前端开发还是有很大差别的,写个入坑指南希望能帮助读者快速上手Electron。

了解客户端

首先抛出一个问题,web应用是桌面客户端吗?显然不是。那么,问题来了,什么样的软件才是桌面客户端呢?我们既然要从web前端转到客户端开发,那么就需要了解客户端,就像我们当初了解web应用一样。

回到刚刚那个问题,桌面客户端有两个重要的特点:

  1. 独立运行于操作系统上(桌面客户端只是PC,那么限定windows、MacOS、linux这几个主流PC操作系统)
  2. 有自己的GUI(用户图形界面 graphical user interface)

web应用有自己的GUI,必须在浏览器中执行,因此不是桌面客户端。

浏览器能直接运行在操作系统上,而且有自己的GUI,因此浏览器是桌面客户端。

Electron的能力

在刚刚接触Electorn的时候,文档看的我是眼花缭乱。在某个加班的深夜,我不禁对天长叹:这个东西到底能干啥?

这东西能干啥?在经历了Electron的反复摩擦之后,我总结了Electron的几个关键能力:

  1. NodeJs全部能力,与操作系统交互

    • operation system 与操作系统相关的操作
    • HTTP(s)、HTTP2
    • process、child process 进程相关
    • file system 文件系统
    • ...省略
  2. Electron提供的基础模块,主要与操作系统交互
    • app 主进程声明周期管理,控制MacOS任务栏dock、windows任务栏taskbar
    • BrowserWindow 控制窗口,在MacOS和windows中窗口非常重要!
    • screen 操作用户显示器
    • globalShortcut 系统级别快捷键
    • ...省略
  3. Chromium提供的能力,主要提供GUI图形界面
    • 解析HTML、CSS、JS
    • ajax请求
    • cookie、localstorage
    • ...省略

能力越大,责任越大

如果用户安装了我们的桌面客户端,那么我们的软件在用户电脑上运行时,就有了非常大的权利,这是把双刃剑。

用户选择了我们的软件,我们也要对用户的电脑负责。能力越大,责任也就越大:

1.注意内存的占用,特别是chromium,简直是内存怪兽。可以通过os来获取用户电脑的配置,然后根据电脑的配置和可用资源,来制定合理的策略。

  1. 为软件增加代码签名,提升安全性
  2. 谨慎操作注册表、用户敏感目录

一旦被贴上【流氓软件】、【不好用】的标签,就很难再改变用户的印象了。

主进程、渲染进程

生命周期

主进程:从整个应用启动到结束,该进程一直存在。主进程只有一个

渲染进程:主进程可用创建/销毁渲染进程,因此渲染进程的生命周期是不固定的。渲染进程可以有多个。

执行环境

在Electron的API文档中,会在文档顶部标识该模块在哪个进程可用,例如:ipcRenderer

职责划分

主进程 渲染进程
控制app的生命周期,为app注册关键事件 解析HTML,渲染窗口内容
阻止一些默认行为,例如webContents的跳转、download事件的默认行为等等(在渲染进程无法做到) 处理窗口的交互逻辑
创建BrowserWindow,也就是渲染进程。合理设置窗口的参数,控制窗口的生命周期(例如何时销毁窗口),决定BrowserWindow加载何处的HTML 与主进程通信,实现高级交互

窗口、前端资源

我们回顾一下刚刚讲到的执行流程,其中有一个有趣的点,就是Electron的窗口会加载一个HTML来渲染窗口的内容。

HTML,以及HTML加载的css、js文件,统称为前端资源

如果不加载HTML的,客户端还能用吗?不妨来试试

    // main processconst win1 = new BrowserWindow();const win2 = new BrowserWindow();
复制代码

上述代码在主进程中执行,创建了两个窗口,窗口并没加载HTML文件。但是窗口却是真实存在的,带有系统标准的控制栏,可拖动,是货真价实的系统窗口!

我们可以发现,前端资源和窗口是分离的。由主进程创建的的窗口(BrowserWindow),既是一个系统原生窗口,同时也是一个加载&渲染前端资源的容器

窗口通常会通过file协议和http(s)协议来加载前端资源,接下来我们看看这两种方式的区别。

通过file协议加载HTML

在Electron的官方入门例子中,就是通过file协议来加载HTML的

通过file协议加载HTML,无论有没有网络,都可以加载到HTML文件,这是file协议核心优势。缺点也比较明显:

  1. 如果页面资源要更新,那么只能通过发版来解决(如果你用webview,那么webview的内容就可以自动更新,不过webview也需要有网络才能加载)
  2. 在file协议下,无法通过ajax来请求数据(协议不同),只能通过NodeJs的http(s)模块来发起网络请求

通过http协议加载HTML

通过http协议加载HTML,优点是可以随时通过web页面的部署,更新渲染进程的资源,并且在https协议下,你可以在页面中使用前端熟悉的ajax请求来获取数据。

当然,缺点也比较明显:

  1. 没有网络,并且在你没有做HTML的缓存时,你的窗口内容无法加载
  2. 必须通过https来加载,保证页面内容的安全性

代码示例

方便读者更好理解上文的内容,写了一个小demo,源代码地址 github.com/littlecold2…,例子有以下特点:

  • 创建主窗口,阻止关闭主窗口关闭的默认事件,不销毁窗口。(大部分客户端的主窗口,关闭主窗口的时候,实际上是隐藏了该窗口,例如QQ、微信)

  • 应用退出时,会尝试关闭所有窗口,再退出应用。如果主窗口的关闭行为默认事件被阻止,那么会导致主窗口无法关闭,整个应用无法退出。因此使用forceQuit这个变量来控制。

  • 使用http或者file协议加载窗口前端资源(例子中,默认加载的是微信)


const { app, BrowserWindow } = require('electron')async function main () {await app.whenReady();let forceQuit = false;const majorWindow = new BrowserWindow({title: '主窗口',width: 1000,height: 750,minWidth: 1000,minHeight: 750,backgroundColor: '#f2f2f2',}); // 主窗口// 阻止标题更新majorWindow.on('page-title-updated', (e) => {e.preventDefault();});majorWindow.on('close', (e) => {// 用户希望退出的时候,不作处理,默认会销毁这个窗口if (forceQuit) return;e.preventDefault();// macOS全屏的处理if (majorWindow.isFullScreen()) {majorWindow.once('leave-full-screen', () => {majorWindow.hide();});majorWindow.setFullScreen(false);} else {majorWindow.hide();  // 隐藏窗口}});// 点击dock打开主窗口app.on('activate', () => {majorWindow.show();});// 用户使用cmd + Q、代码中调用app.quit等情况// 此时用户希望能够退出应用,因此将forceQuit改为trueapp.on('before-quit', () => {forceQuit = true;});app.dock.setIcon('./img/icon.png'); // 在app打包后,这一句代码其实是不需要的majorWindow.loadURL('https://wx.qq.com'); // http协议加载前端资源,随便加载一个微信试试// majorWindow.loadURL('file://index.html'); // file协议加载前端资源}main();复制代码

在本地跑一下这个例子

最后

欢迎大家在评论区讨论,技术交流 & 内推 -> zhongli@qunhemail.com

转载于:https://juejin.im/post/5cfb6a49f265da1ba84a82d0

【Electron】酷家乐客户端开发实践分享 — 入坑篇相关推荐

  1. 酷家乐java开发,【Electron】酷家乐客户端开发实践分享 — 入坑篇

    本文的初衷 Electron所使用的技术栈(JavaScript.NodeJs.HTML.CSS)和web前端工程师完美契合.于是,越来越多的前端工程师,用Electron来开发桌面客户端的开发,我也 ...

  2. 【Electron】酷家乐客户端开发实践分享 — 下载管理器

    作者:钟离,酷家乐PC客户端负责人 原文地址:webfe.kujiale.com/electron-ku- 酷家乐客户端:下载地址 www.kujiale.com/activity/13- 文章背景: ...

  3. 【Electron】酷家乐客户端开发实践分享 — 软件自动更新

    作者:钟离,酷家乐PC客户端负责人 原文地址:webfe.kujiale.com/electron-au- 酷家乐客户端:下载地址 www.kujiale.com/activity/13- 文章背景: ...

  4. 【Electron】酷家乐客户端开发实践分享 — 进程通信

    作者:钟离,酷家乐PC客户端负责人 原文地址:webfe.kujiale.com/electron-ku- 酷家乐客户端:下载地址 www.kujiale.com/activity/13- 文章背景: ...

  5. 【Electron】酷家乐客户端开发实践分享 — 浏览器启动客户端

    作者:钟离,酷家乐PC客户端负责人 原文地址:webfe.kujiale.com/browser-to-- 酷家乐客户端:下载地址 www.kujiale.com/activity/13- 文章背景: ...

  6. 酷家乐 java面经_酷家乐内部教练案例分享

    素材中台主营两部分业务:模型.材质,模型材质数据是酷家乐的关键资源,对内承载着对业务团队的数据支持,对外负责了酷家乐渲染图的表现效果. 所以团队成员承接的工作除了中台能力建设之外,还有很多日常很多前台 ...

  7. 酷家乐前端开发工程师一面

    写在前面 周五面试酷家乐 面试官上来直接五道算法题把我给整懵了 记录一下吧 算法题还是要多刷多刷! 解法一 排序 不赘述了 解法二 利用map集合 var majorrityElement=funct ...

  8. 酷家乐如何使用 Istio 解决新服务治理系统(Serverless)接入已有成熟自研 Java 服务治理体系...

    本文来自酷家乐先进技术工程团队,作者罗宁,酷家乐资深开发工程师. 公司背景 酷家乐 [1] 公司以分布式并行计算和多媒体数据挖掘为技术核心,推出的家居云设计平台,致力于云渲染.云设计.BIM.VR.A ...

  9. 酷家乐 Serverless FaaS 产品落地实践

    K8s已经成为一线大厂分布式平台的标配技术.你是不是还在惆怅怎么掌握它?来这里,大型互联网公司一线工程师亲授,不来虚的,直接上手实战,3天时间带你搭建K8s平台,快速学会K8s,点击下方图片可了解培训 ...

最新文章

  1. 程序员在未来会变成廉价劳动力(农民工)吗?
  2. SQL求解两个时间差
  3. 当面试官问我————为什么String是final的?
  4. Lintcode 729. 阶乘除法的最后一位数
  5. django 1.8 官方文档翻译: 2-4-3 模式编辑器
  6. DFS和BFS算法介绍
  7. 正在经历变革的 Linux 系统管理员技能
  8. css四种定位及相关知识总结(附实例、图解)
  9. python库-密码学库pynacl
  10. 有限状态机 Finite State Machine(FSM)
  11. apache commons-beanutils中BeanUtils和PropertyUtils区别
  12. vivado sata ip (phy)配置
  13. 李宏毅2020机器学习笔记2——CXK
  14. Linux开发心得总结5 - Linux下OOM Killer机制详解
  15. 会计做什么副业好?分享几个适合会计的副业
  16. 南加大计算机游戏专业,南加州大学计算机科学理科硕士(游戏发展)入学条件及实习就业...
  17. 最新版IDEA设置打开IDEA弹出新窗体
  18. 电脑中出现共享打印机连接错误问题(错误0x0000000a)--解决方法
  19. 直播用的计算机配置,直播电脑配置需要什么样的
  20. Centos Nvidia连接失败 NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver 解决方案

热门文章

  1. 游戏素材下载地址收藏
  2. 数据挖掘实践(金融风控-贷款违约预测)(五):模型融合
  3. 解析法多元线性回归的实现
  4. 《TensorFlow语音识别实战》简介
  5. Andersen Global与税务公司合作拓展毛里塔尼亚平台
  6. matlab程序实例光频梳,一种基于光频梳和频谱整形的任意波形发生装置及方法与流程...
  7. spring boot在vscode运行弹出“no such file or directory”
  8. 云环境 Open代理 server 快速搭建指南
  9. 一款好看的新网站发布导航页源码
  10. Python 获取windows上用户的全名