图书前言

前  言

《Electron跨平台开发实战》的主要目标是帮助你快速着手创建Electron应用。通过将各种基础概念体现于实践代码之中,我们可以更好地学习这些概念。这《Electron跨平台开发实战》不仅介绍Electron的基础知识,还会提供创建新应用的灵感和点子。

《Electron跨平台开发实战》读者对象

《Electron跨平台开发实战》适用于这样一些受众:想要创建功能远远超出浏览器功能的桌面应用的人;想要为自己创建一款满足个人需要的桌面应用,但又不希望重新学习一门新的编程语言或框架的人;想要突破自身能力,使用同一份代码创建运行于多个操作系统之上应用的小型团队。而在笔者的内心深处,《Electron跨平台开发实战》既适用于想要为命令行应用创建GUI界面的人,也适用于希望无须在计算机上安装Node.js即可运行应用程序或工具的人。

《Electron跨平台开发实战》假设读者已经熟练掌握了JavaScript,但是由于读者的技术背景各不相同,有些读者可能只对某个领域比较有经验,所以如果书中讲到了读者可能不熟悉的Web或Node.js知识点,我会对它们进行讲解。

《Electron跨平台开发实战》的组织结构:路线图

《Electron跨平台开发实战》分为16章。各章的内容都前后衔接、循序渐进。如果只想了解如何在你的应用中实现某个特定功能,也可以直接跳到相关章节进行阅读。

第1章将讲述Electron是什么。我们可以看到一些Electron能够做到,而浏览器和Node.js无法独自做到的事情。

第2章将开始创建一个简单的Electron应用。该章的目标是通过亲自动手实践,让读者了解使用Electron创建一个应用是多么容易。

第3章将介绍《Electron跨平台开发实战》中的一个主要应用—— Fire Sale,这是一个让用户可以打开文件系统中的Markdown文件并对它们进行编辑的应用。

第4章将介绍如何使用原生系统对话框和警示框,用户可以使用对话框从文件系统中选择一个文件并在Fire Sale中编辑它。Fire Sale应用会模糊DOM与Node标准库之间的界线,协调两者以实现对话框功能。

第5章将向应用添加多窗口支持,多窗口会引出一系列单浏览器窗口应用和无窗口Node.js应用不会遇到的问题。

第6章将引入更多的原生操作系统集成功能。我们将把Fire Sale中打开的文档添加到操作系统的最近打开文件列表中,创建一个检查当前打开的文件是否已被其他应用修改的监听器,并根据当前文件是否有未保存的更改,更新窗口标题栏中显示的文本。

第7章将探讨如何创建原生应用菜单和上下文菜单,前者被一个应用的所有窗口共享,后者会在用户右击鼠标时弹出。

第8章将讲解如何基于应用的状态更新应用菜单,包括启用或禁用指定的菜单项。

第9章将创建一种驻留在macOS的菜单栏中或Windows的系统托盘区域的新型应用。Web应用是无法将自己驻留在这些区域的。你在该章会创建Clipmaster应用,这是一个精简的剪贴板管理器,可以从系统剪贴板读取和写入内容,响应全局快捷键,并在完成操作时向用户显示通知。

第10章将使用第三方库,创建一个像Fire Sale那样有UI界面的新版Clipmaster应用。这个新版本的名称是Clipmaster 9000,它可以访问GitHub的Gist API,并且可以通过快捷键把保存的剪贴项发布到另一个Web系统。

之前我们一直在使用标准JavaScript语言实现Electron应用的功能。在第11章,将展示如何在应用中使用Babel、TypeScript和CoffeeScript等可转译为JavaScript的语言,以及Sass和Less等可转译为CSS的语言。你在该章会使用React创建一个名为Jetsetter的旅行打包列表应用。

第12章将介绍如何将数据保存到数据库,将演示在客户端代码中,如何使用SQLite数据库实现数据读写操作。除了SQLite之外,还会演示使用基于浏览器的IndexedDB数据库。

第13章将介绍Spectron这个测试工具,它让开发者可以为Electron应用编写Selenium测试代码。我们将为前面章节创建的Clipmaster 9000应用编写一组测试。

第14章将介绍对应用进行打包的工具。使用工具打包应用之后,可以将它们分发给不想仅通过命令行启动应用的用户。其实不光是用户,很多开发者也不太喜欢使用命令行启动应用。

第15章涵盖如何为macOS应用签名,如何创建Windows安装程序,以及如何创建用于收集错误日志和崩溃报告的简单服务器。

第16章将讲解如何把应用发布到Mac App Store。如果你更喜欢自己分发应用,就不必把应用发布到Mac App Store。但是,如果你确实想那样做但又对流程不熟悉,那么该章对你会非常有帮助。

关于代码

《Electron跨平台开发实战》包含许多源代码示例,一些以单独的代码清单形式出现,另一些则直接插入正文。有时,代码会以粗体标出,以表示它们相对于当前章节的前面部分已经发生变化,这通常是由于向原有代码添加新功能导致的。

在许多场景中,原始代码都被重新格式化,我们做了折行处理,并重新规划了缩进,以满足排版需求。在极少的情况下,即使重新格式化代码也仍然不够,所以会用到行连续符号(?),表示书页上的两行实际上是连续的单行代码。此外,使用文本对代码进行说明时,通常会从代码清单中将注释删除。许多代码清单都带有额外的文字标注,以突出代码里面重要的概念。

《Electron跨平台开发实战》所有代码都可以在出版社网站(www.manning.com/books/electron-in-action)和GitHub(https://github.com/electron-in-action)上找到,也可通过扫描封底的二维码下载。大部分情况下,每一章都会有一个对应的分支。《Electron跨平台开发实战》后半部分的一些章会使用前面某章创建的应用,因此会在那一章开始的时候提供一个起始分支,在那一章结束的时候再提供一个结束分支。如果某章结束时的最终代码比较短,则将它直接列在那一章的结尾。如果某章结束时的最终代码比较长,则将完整代码放在附录中。2018年5月,GitHub发布了一个Web服务和一个npm包,通过GitHub发布的开源Electron应用可以利用它们轻松实现自动升级(https://electronjs.org/blog/autoupdating-electron-apps)。如果你的应用符合那些条件,可以考虑使用GitHub提供的update-electron-app库。如果你的应用并不符合条件,或者你不想使用update-electron-app库,第15章将讲述如何自己实现自动升级功能。

在《Electron跨平台开发实战》撰写过程中,最让笔者心惊肉跳的事是Electron、Node.js或Chromium发布了新版本(即使只是小的版本),导致书中的某个代码示例无法工作。这种事已经发生过不止一次。

我承诺将不断更新《Electron跨平台开发实战》代码,保持它们有效,并在每章分支的README.md文件中提供勘误。如果书中的代码不能正常工作,请务必查看《Electron跨平台开发实战》的GitHub代码库或图书论坛。

图书论坛

读者可以免费访问由Manning Publications运营的私人网络论坛,在论坛上发表评论、询问技术问题,并得到来自作者与其他用户的帮助。论坛位于https://forums.manning.com/forums/electron-in-action。有关Manning论坛和行为规则的更多信息,请访问https://forums.manning.com/forums/about。