欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Webpack实战之构建 Electron 应用

程序员文章站 2022-11-29 20:32:46
electron 可以让你使用开发 web 的技术去开发跨平台的桌面端应用,由 github 主导和开源,大家熟悉的 atom 和 vscode 编辑器就是使用 elect...

electron 可以让你使用开发 web 的技术去开发跨平台的桌面端应用,由 github 主导和开源,大家熟悉的 atom 和 vscode 编辑器就是使用 electron 开发的。

electron 是 node.js 和 chromium 浏览器的结合体,用 chromium 浏览器显示出的 web 页面作为应用的 gui,通过 node.js 去和操作系统交互。 当你在 electron 应用中的一个窗口操作时,实际上是在操作一个网页。当你的操作需要通过操作系统去完成时,网页会通过 node.js 去和操作系统交互。

采用这种方式开发桌面端应用的优点有:

  1. 降低开发门槛,只需掌握网页开发技术和 node.js 即可,大量的 web 开发技术和现成库可以复用于 electron;
  2. 由于 chromium 浏览器和 node.js 都是跨平台的,electron 能做到写一份代码在不同的操作系统运行。

在运行 electron 应用时,会从启动一个主进程开始。主进程的启动是通过 node.js 去执行一个入口 javascript 文件实现的,这个入口文件 main.js 内容如下:

const { app, browserwindow } = require('electron')
// 保持一个对于 window 对象的全局引用,如果你不这样做,
// 当 javascript 对象被垃圾回收, window 会被自动地关闭
let win
// 打开主窗口
function createwindow() {
 // 创建浏览器窗口
 win = new browserwindow({ width: 800, height: 600 })
 // 加载应用的 index.html
 const indexpageurl = `file://${__dirname}/dist/index.html`;
 win.loadurl(indexpageurl);
 // 当 window 被关闭,这个事件会被触发
 win.on('closed', () => {
  // 取消引用 window 对象
  win = null
 })
}

// electron 会在创建浏览器窗口时调用这个函数。
app.on('ready', createwindow)

// 当全部窗口关闭时退出
app.on('window-all-closed', () => {
 // 在 macos 上,除非用户用 cmd + q 确定地退出
 // 否则绝大部分应用会保持激活
 if (process.platform !== 'darwin') {
  app.quit()
 }
})

主进程启动后会一直驻留在后台运行,你眼睛所看得的和操作的窗口并不是主进程,而是由主进程新启动的窗口子进程。

应用从启动到退出有一系列生命周期事件,通过 electron.app.on() 函数去监听生命周期事件,在特定的时刻做出反应。 例如在 app.on('ready') 事件中通过 browserwindow 去展示应用的主窗口。

启动的窗口其实是一个网页,启动时会去加载在 loadurl 中传入的网页地址。 每个窗口都是一个单独的网页进程,窗口之间的通信需要借助主进程传递消息。

详解Webpack实战之构建 Electron 应用

总体来说开发 electron 应用和开发 web 应用很相似,区别在于 electron 的运行环境同时内置了浏览器和 node.js 的 api,在开发网页时除了可以使用浏览器提供的 api 外,还可以使用 node.js 提供的 api。

接入 webpack

接下来做一个简单的 electron 应用,要求为应用启动后显示一个主窗口,在主窗口里有一个按钮,点击这个按钮后新显示一个窗口,且使用 react 开发网页。

由于 electron 应用中的每一个窗口对应一个网页,所以需要开发2个网页,分别是主窗口的 index.html 和新打开的窗口 login.html 。 也就是说项目由2个单页应用组成,这和3-10管理多个单页应用 中的项目非常相似,让我们来把它改造成一个 electron 应用。

需要改动的地方如下:

在项目根目录下新建主进程的入口文件 main.js ,内容和上面提到的一致;

主窗口网页的代码如下:

import react, { component } from 'react';
import { render } from 'react-dom';
import { remote } from 'electron';
import path from 'path';
import './index.css';
class app extends component {
 // 在按钮被点击时
 handlebtnclick() {
  // 新窗口对应的页面的 uri 地址
  const modalpath = path.join('file://', remote.app.getapppath(), 'dist/login.html');
  // 新窗口的大小
  let win = new remote.browserwindow({ width: 400, height: 320 })
  win.on('close', function () {
   // 窗口被关闭时清空资源
   win = null
  })
  // 加载网页
  win.loadurl(modalpath)
  // 显示窗口
  win.show()
 }
 render() {
  return (
   <div>
    <h1>page index</h1>
    <button onclick={this.handlebtnclick}>open page login</button>
   </div>
  )
 }
}
render(<app/>, window.document.getelementbyid('app'));

其中最关键的部分在于在按钮点击事件里通过 electron 库里提供的 api 去新打开一个窗口,并加载网页文件所在的地址。

页面部分的代码已经修改完成,接下来修改构建方面的代码。 这里构建需要做到以下几点:

构建出2个可在浏览器里运行的网页,分别对应2个窗口的界面;

  1. 由于在网页的 javascript 代码里可能会有调用 node.js 原生模块或者 electron 模块,也就是输出的代码依赖这些模块。但由于这些模块都是内置支持的,构建出的代码不能把这些模块打包进去。
  2. 要完成以上要求非常简单,因为 webpack 内置了对 electron 的支持。 只需要给 webpack 配置文件加上一行代码即可,如下:
target: 'electron-renderer',

这句配置曾在2-7其它配置项-target中提到,意思是指让 webpack 构建出用于 electron 渲染进程用的 javascript 代码,也就是这2个窗口需要的网页代码。

以上修改都完成后重新执行 webpack 构建,对应的网页需要的代码都输出到了项目根目录下的 dist 目录里。

为了以 electron 应用的形式运行,还需要安装新依赖:

# 安装 electron 执行环境到项目中
npm i -d electron

安装成功后在项目目录下执行 electron . 你就能成功看到启动的桌面应用了,效果如图:

详解Webpack实战之构建 Electron 应用

本实例提供项目完整代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。