文章图片
Electron 允许你使用 HTML、CSS 和 JavaScript 构建桌面应用程序。互联网上有很多反对 Electron 的争论,其中之一是它的性能和许多低质量的应用程序,但不要责怪框架;Electron 功能强大且性能卓越。如今,许多流行的应用程序都运行在 Electron 之上,例如 VS Code、Slack、Skype、Discord 等。
但是,为什么那么多人反对它呢?问题始于应用程序和人们使用 Electron 的方式。对于许多人来说,将 Web 应用程序移植到 Electron 意味着按原样保留现有代码并将其嵌入到 Electron 容器中。这是一件可怕的事情吗?也许不是,但你并没有充分利用 Electron 的强大功能。你只是更改独立应用程序的浏览器选项卡。
我们可以改进什么?Electron如何构建桌面应用程序?在本文中,我们将探索 Electron 的基础知识,并构建一个示例应用程序来展示 Electron 的一些方法。
Electron是如何工作的?Electron 建立在 3 个主要组件之上:
- Chromium:负责网页内容
- NodeJS:用于与操作系统交互
- 自定义APIs:解决与操作系统打交道时的常见问题
文章图片
- Main Process:负责窗口管理以及与操作系统的所有交互。这就是一切的开始,它可以创建和管理多个渲染器进程
- 渲染器进程:可能有一个或多个,每个都将托管一个 Chromium 实例并负责 Web 内容。
许多典型的 Electron 应用程序会使用主进程来创建一个渲染器进程并加载它们的 Web 应用程序。今天,我们将向前迈出一步。
必备部分:Hello World!Electron如何构建桌面应用程序?接下来,我们将构建一个“hello world!” 应用。我们不会使用任何不必要的框架或库来专注于 Electron 代码。
让我们开始吧。
设置Electron
Electron构建桌面应用程序示例介绍 - 构建应用程序的第一步是创建一个项目并安装Electron库,所以从使用 NPM 创建项目开始:
npm init
并设置你的应用程序详细信息。作为应用程序的起点,我喜欢使用 main.js,但你可以使用任何你想要的文件名。
接下来,安装Electron。
npm install -D electron@latest
Electron构建桌面应用程序教程:构建屏幕
对于我们的微型 hello world 示例,我们需要两个文件,
main.js
以及hello-world.html
.
main.js
是我们的主要流程;我们将创建第一个渲染器进程来加载我们的hello-world.html
.这是启动代码
main.js
const { app, BrowserWindow } = require('electron');
/**
* Creates the main window
*/
function createMainWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
});
win.loadFile('hello-world.html');
win.webContents.openDevTools()
}app.whenReady().then(createMainWindow);
// When all windows are closed exit the app, except in macOS.
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
});
// When the application gets activated create the main window if one does not exist
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createMainWindow()
}
});
初学者工具包将处理运行应用程序的最少操作,创建第一个渲染器
new BrowserWindow
并main.html
在其上加载。它还将解决一些退出应用程序并在需要时重新启动主窗口的情况。Electron构建桌面应用程序示例:至于我们,
main.html
我们将使用以下内容:<
!DOCTYPE html>
<
html>
<
head>
<
meta charset="UTF-8">
<
title>Hello World!<
/title>
<
meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';
" />
<
/head>
<
body>
<
h1>Hello World!<
/h1>
We are using node <
script>document.write(process.versions.node)<
/script>,
Chrome <
script>document.write(process.versions.chrome)<
/script>,
and Electron <
script>document.write(process.versions.electron)<
/script>.
<
/body>
<
/html>
Electron如何构建桌面应用程序?它只是一个简单的 HTML,公开了我们的应用程序使用的 node、chrome 和 Electron 的当前版本。
最后,我们需要运行我们的应用程序;首先,你需要更改
package.json
并添加启动脚本。"scripts": {
"start": "electron .",
"test": "echo \"Error: no test specified\" &
&
exit 1"
},
你的“脚本”部分现在应该是这样的。
是时候测试一下了!在终端运行
npm start
如果一切顺利,你应该会看到如下窗口:
文章图片
我不是这些样板的忠实粉丝,因为它们通常带有许多我不需要的库和添加项。但它们是让你入门的好地方。
以下是一些流行的:
- Electron Forge
- Electron Builder
- Electron React Boilerplate
- Electron Vue
这里有一些提示:
永远不要阻塞主进程
主要过程是一切开始的地方。它是应用程序所有进程的父进程。它主要与操作系统通信,处理所有窗口和它们之间的通信,并运行 UI 线程。
阻止此进程意味着应用程序将停止响应,直到操作完成。在任何情况下,都不要在此处运行占用大量 CPU 并需要很长时间才能完成的代码。
以下是一些建议:
- 对于 CPU 密集型操作,将这些功能委托给工作线程、渲染器进程,或者甚至生成一个专用进程来执行该任务(但请确保你知道自己在为最后一个做什么)。
- 尽量避免使用
remote
模块。使用remote
模块在不知不觉中阻塞 UI 线程太容易了。 - 避免在主线程上使用阻塞 I/O 操作;如果需要,请使用 NodeJS 提供的异步等效项。
并不真地。也许后果不会像阻塞主进程那样有害,但是阻塞渲染器是有代价的。你的 Windows 可能会变得迟钝或无响应,并且整体用户体验会很糟糕。
我们在使用网络时,习惯了一些网络应用突然变慢、不流畅,我们都可以接受;但是,对于桌面应用程序,我们的标准更高。请注意这一点,因为用户期望很重要。
我该怎么做才能使我的应用程序响应更快?几乎可以在我们的网络应用程序上做同样的事情;毕竟,在渲染器过程中,我们只是在谈论 Chromium。
- requestIdleCallback:允许在浏览器空闲时间排队执行 JavaScript 的 API,无论是在帧结束时还是在用户不活动时。
- Web Worker:通过将它们分配给新线程来在 Web 浏览器上运行昂贵计算的最佳工具。
在 web 开发过程中,使用 polyfills 来支持不同的浏览器是非常典型的。在构建 Electron 应用程序时,你不需要任何这些。如果它在 Chromium 上运行,它就在 Electron 上运行,并且不需要支持任何其他浏览器。通过不加载这些额外的模块,减少你的包,并让一切变得更快。
捆绑所有代码
在 Web 开发中,我们有时会从服务器加载脚本或页面,例如 CDN,它们与我们的应用程序分开提供,这很好。毕竟,对于网络,我们总是需要下载这些资产来运行应用程序。
对于桌面应用程序,这是不同的。通过捆绑应用程序中的所有静态资产、脚本和内容来避免任何不必要的网络请求。这将使你的应用程序可以做两件事,离线工作,并加快加载过程,因为读取磁盘比访问互联网便宜。
Electron构建桌面应用程序教程结论Electron如何构建桌面应用程序?下次你需要构建跨平台的桌面应用程序时,我建议你尝试使用 Electron,特别是如果你来自 JavaScript,并且你已经拥有一些可以重用的代码。
请注意,如果使用得当,Electron 会很棒。请记住,尽管它看起来像 Web,但并不完全准确,因此你需要进行一些特殊考虑才能使其正常工作。
【如何使用Electron构建桌面应用程序(分步指南)】谢谢阅读!
推荐阅读
- Node如何使用Elasticsearch(构建搜索引擎示例)
- 如何使用NodeJS和AWS Lambda实现无服务器()
- Puppeteer和NodeJS如何将网页转换为PDF()
- Windows 8.1专业版降低硬盘读写频率的多种技巧
- windows 8系统下注册微软账户的技巧
- Windows 8.1系统调整系统服务保护磁盘读写次数
- Windows 8.1专业版系统下完成开机自动登录的技巧
- Windows 8.1系统打开主题失败的修好办法
- Windows 10系统退回Win8.1后磁贴出错的处理技巧