翻译 | 《JavaScript Everywhere》第18章 带Electron的桌面应用程序
翻译 | 《JavaScript Everywhere》第18章 带Electron的桌面应用程序
写在最前面
大家好呀,我是毛小悠,是一位前端开发工程师。正在翻译一本英文技术书籍。
为了提高大家的阅读体验,对语句的结构和内容略有调整。如果发现本文中有存在瑕疵的地方,或者你有任何意见或者建议,可以在评论区留言,或者加我的微信:code\_maomao
,欢迎相互沟通交流学习。
(σ゚∀゚)σ..:*☆哎哟不错哦
第18章 带Electron的桌面应用程序
我第一次接触个人计算机是在一个充满Apple II
机器的学校实验室中进行的。
每周一次,我和我的同学被老师带进教室,给了一些软盘,并给出了有关如何加载应用程序(通常是Oregon Trail
)的粗略说明。在这些课程上,除了记得自己发呆之外,我对其他事情记不清了。自1980
年代中期以来,个人计算机已经走了很长一段路,但是我们仍然需要依靠桌面应用程序来执行许多任务。
通常,我可能会访问电子邮件客户端、文本编辑器、聊天客户端、电子表格软件、音乐流服务以及其他多个桌面应用程序。一般,这些应用程序具有与Web
应用程序等效的功能,但是桌面应用程序的便利性和集成性可以为用户带来很多好处。但是,多年来,创建这些应用程序的能力一直非常缺乏。值得庆幸的是,今天,我们能够使用网络技术来构建功能全面的桌面应用程序,而且学习曲线很小。
我们正在构建什么
在接下来的几章中,我们将为Notedly
的社交笔记应用程序构建一个桌面客户端。我们的目标是使用JavaScript
和Web
技术来开发桌面应用程序,用户可以下载并安装在计算机上。目前,该应用程序将是一个简单的实现,它将我们的Web
应用程序包装在桌面应用程序shell
中。以这种方式开发我们的应用程序将使我们能够快速将桌面应用程序发送给感兴趣的用户,同时为我们提供了以后为桌面用户引入自定义应用程序的灵活性。
我们将如何构建它
要构建我们的应用程序,我们将使用Electron
,它是一个开放源代码的框架,用于使用Web
技术构建跨平台的桌面应用程序。它可以利用Node.js
和Chrome
的基础浏览器引擎Chromium
来工作。
这意味着作为开发人员,我们可以使用浏览器、Node.js
和特定于操作系统的功能,而这些功能通常在Web
环境中不可用。Electron
最初是由GitHub
为Atom
文本编辑器开发的,但此后一直用作大小应用程序的平台,包括Slack
,VS Code
,Discord
和WordPress Desktop
。
入门
在开始开发之前,我们需要将项目启动程序文件复制到我们的电脑上。
项目的源代码包含了开发应用程序所需的所有脚本和对第三方库的引用。
要将代码克隆到我们的本地计算机,请打开终端,切换到保存项目的目录,然后git clone
项目存储库。如果你已经研究过API
和Web
章节,则可能已经创建了一个 notedly
目录来保持项目代码的有条理:
$ cd Projects $ # type the `mkdir notedly` command if you don't yet have a notedly directory $ cd notedly $ git clone git@github.com:javascripteverywhere/desktop.git $ cd desktop $ npm install
安装第三方依赖项
通过制作本书的入门代码的副本,并在目录中运行npm install
,你无需为任何第三方依赖项再次运行npm install
。
该代码的结构如下:
-
/
src
这是你随书一起进行开发的目录。
-
/
solutions
该目录包含每章的解决方案。 如果你卡住了,这些可以供你参考。
-
/
final
该目录包含最终的工作项目。
创建项目目录并安装依赖项之后,我们就可以开始开发了。
我们的第一个电子应用程序
将我们的代码存储库克隆到我们的电脑后,让我们开发我们的第一个Electron
应用程序。如果你在src
目录中查找,则会看到其中有一些文件。index.html
文件包含了HTML
标记。目前,该文件将用作Electron
的“渲染器过程”,这意味着它将是我们Electron
应用程序显示为窗口的网页。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Notedly Desktop</title> </head> <body> <h1>Hello World!</h1> </body> </html>
我们将在index.js
文件中设置我们的Electron
应用程序。在我们的应用程序中,该文件将包含Electron
所谓的“主进程”,它定义了应用程序shell
。主要过程通过在Electron
中创建一个BrowserWindow
实例来工作,该实例用作应用程序shell
。
index.js与main.js
在我们的案例应用中的其他部分都是用的index.js
命名,但是通常在软件开发中命名main.js
来命名“主程序”。让我们设置主要过程以显示包含HTML
页面的浏览器窗口。首先,导入Electron
的应用程序,然后写src/index
.js中的browserWindow
功能:
const { app, BrowserWindow } = require('electron');
现在,我们可以定义应用程序的browserWindow
并定义应用程序将加载的文件。在src/index
.js中,添加以下内容:
const { app, BrowserWindow } = require('electron'); // to avoid garbage collection, declare the window as a variable let window; // specify the details of the browser window function createWindow() { window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }); // load the HTML file window.loadFile('index.html'); // when the window is closed, reset the window object window.on('closed', () => { window = null; }); } // when electron is ready, create the application window app.on('ready', createWindow);
有了这个,我们开始准备在本地运行我们的桌面应用程序。在终端应用程序中,从项目目录中运行以下命令:
$ npm start
该命令将运行电子src/index
.js,启动我们应用程序的开发环境版本(请参阅图18-1
)。
图18-1
。运行启动命令将启动我们的“ Hello World
” Electron
应用程序
macOS应用程序窗口详细信息
macOS
处理应用程序窗口的方式与Windows
不同。当用户单击“关闭窗口”按钮时,应用程序窗口将关闭,但应用程序本身不会退出。单击macOS
扩展坞中的应用程序图标将重新打开应用程序窗口。Electron
允许我们实现此功能。将以下内容添加到src/index
.js文件的底部:
// quit when all windows are closed. app.on('window-all-closed', () => { // On macOS only quit when a user explicitly quits the application if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { // on macOS, re-create the window when the icon is clicked in the dock if (window === null) { createWindow(); } });
添加此功能后,你可以通过退出应用程序并使用npm start
命令重新运行它来查看这些更改。现在,如果用户正在使用macOS
访问我们的应用程序,则他们在关闭窗口时将看到预期的行为。
开发者工具
由于Electron
基于Chromium
浏览器引擎(Chrome
,Microsoft Edge
,Opera
和许多其他浏览器),它还使我们能够使用Chromium
的开发人员工具。这使我们能够执行与浏览器环境中相同的所有的JavaScript
调试。让我们检查我们的应用程序是否处于开发模式,如果是,请在应用程序启动时自动打开开发工具。
要执行此检查,我们将使用electronic-util
库。这是一小部分的实用程序,可让我们轻松检查系统条件并简化常见Electron的样式代码。
现在,我们将使用is
模块,这将使我们能够检查我们的应用程序是否处于开发模式。
在我们的src/index
.js文件的顶部,导入模块:
const { is } = require('electron-util');
现在,在我们的应用程序代码中,我们可以在window.loadFile
(*index.html
*) 加载我们的HTML
文件,当应用程序处于开发环境中时,它将打开开发工具(图18-2
):
// if in development mode, open the browser dev tools if (is.development) { window.webContents.openDevTools(); }
图18-2
。现在,当我们在开发过程中打开应用程序时,浏览器开发工具将自动打开。
Electron安全警告
你可能会注意到,当前我们的Electron
应用程序显示了与不安全的内容安全策略(CSP
)相关的安全警告。我们将在下一章中解决此警告。
通过轻松访问浏览器开发工具,我们为开发客户端应用程序做好了充分的准备。
Electron API
桌面开发的优点之一是,通过Electron API
,我们可以访问操作系统级别的功能,而这些功能在Web
浏览器环境中是不可用的,其中包括:
-
通知事项
-
本机文件拖放
-
macOS
暗模式 -
自定义菜单
-
健壮的键盘快捷键
-
系统对话框
-
应用托盘
-
系统信息
你可以想象,这些选项使我们能够为桌面客户端添加一些独特的功能并改善用户体验。我们不会在简单的示例应用程序中使用它们,但是你需要熟悉它们。Electron
的文档提供了每个Electron API
的详细示例。此外,Electron
团队还创建了electron-api-demos
,这是一个功能齐全的Electron
应用程序,演示了Electron API
的许多独特功能。
结论
在本章中,我们探讨了使用Electron
通过Web
技术构建桌面应用程序的基础。Electron
环境为我们(作为开发人员)提供了一个向用户提供跨平台桌面体验的机会,而无需学习多种编程语言和操作系统的复杂性。借助我们在本章中探索的简单设置以及Web
开发的知识,我们为构建健壮的桌面应用程序做好了充分的准备。在下一章中,我们将研究如何将现有的Web
应用程序合并到Electron Shell
中。
如果有理解不到位的地方,欢迎大家纠错。如果觉得还可以,麻烦你点赞收藏或者分享一下,希望可以帮到更多人。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Redis深度系统学习之RDB与AOF持久化
前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题;然后详细介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案;在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时介绍持久化实现的一些原理细节及需要注意的问题。最后,介绍在实际使用中,持久化方案的选择,以及经常遇到的问题等。 目录 一、Redis高可用概述 二、Redis持久化概述 三、RDB持久化 1. 触发条件 2. 执行流程 3. RDB文件 4. 启动时加载 5.RDB常用配置总结 四、AOF持久化 1. 开启AOF 2. 执行流程 3. 启动时加载 4.AOF常用配置总结 五、方案选择与常见问题 1.RDB和AOF的优缺点 2. 持久化策略选择 3.fork阻塞:CPU的阻塞 4.AOF追加阻塞:硬盘的阻塞 5.info命令与持久化 六、总结 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道...
- 下一篇
看看人家接口写得,那叫一个优雅!
点击上方java项目开发,选择设为星标 优质文章,及时送达 -- 来源:https://zhuanlan.zhihu.com/p/265318078 在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。 一般系统的大致整体架构图如下: 需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。因为老顾这篇主要介绍的是API接口,所以我们聚焦点,其他的模块小伙伴们自行去补充。 接口交互 前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端。 针对URL路径的restful风格,以及传入参数的公共请求头的要求(如:app_version,api_version,device等),老顾这里就不介绍了,小伙伴们可以自行去了解,也比较简单。 着重介绍一下后端服务器如何实现...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7