Electron 是一个跨平台的、基于 Web 前端技术的桌面 GUI 应用程序开发框架。
使用 Web 前端技术来开发一个桌面 GUI 程序是一件多么炫酷的事情,你可以使用 HTML、CSS 来绘制界面和控制布局,使用 JavaScript 来控制用户行为和业务逻辑,使用 Node.js 来通信、处理音频视频等,几乎所有的 Web 前端技术和框架(jQuery、Vue、React、Angular 等)都可以应用到桌面 GUI 开发中。
至此,JavaScript 这门神奇的语言除了能开发 Web 前端、Web 后台(基于 Node.js)、手机 APP(基于 React),也能开发桌面 GUI 程序了。
经济学中的“有需求就有市场”在技术领域也适用,Electron 就是应需求而生的。Electron 面世之后,不仅满足了大部分现有的开发需求,还创造了大量的新需求,开辟了一个新的生态。
官网地址:官网地址
# 创建工程
npm init
# 安装electron
npm install electron --save -g # 全局安装
# 检查安装是否成功
npx electron -v
./node_modules/.bin/electron -v
# 引入remote
npm install --save @electron/remote
大概分为以下步骤:
index.html
页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h3 id="hello">helloWorld</h3>
<button id="button-one">按钮</button>
<h3>打开新窗口</h3>
<button id="button-two">按钮</button>
<h3>按钮</h3>
<button id="button-three">按钮</button>
<h3>打开超链接</h3>
<a id="button-four" href="http://www.baidu.com">按钮</a>
</body>
<script src="js/button.js"></script> <!--在js目录下准备一个js文件后续有用-->
</html>
main.js
var electron = require('electron');
var app = electron.app; //引用app
var BrowserWindow = electron.BrowserWindow; // 窗口引用
var mainWindow = null; // 声明打开的主窗口
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 1000,
height: 700,
title: "helloWorld",
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
enableRemoteModule: true
}
});
mainWindow.webContents.openDevTools() // 默认打开调试模式
require('@electron/remote/main').initialize(); //v14 版本 引入 remote需要以下两步
require('@electron/remote/main').enable(mainWindow.webContents);
mainWindow.loadFile('src/index.html');// 加载html页面
mainWindow.on('closed', () => {
mainWindow = null; // 页面关闭需要设置为null防止内存溢出
});
})
在package.json
引入
测试运行
electron . #启动
在js目录下准备一个button.js文件,在之前的index.html引入
const buttontTow = document.getElementById("button-two");
const {BrowserWindow} = require('@electron/remote')
var newWin = null;
window.onload = function () {
buttontTow.onclick = function () {
newWin = new BrowserWindow({
width: 1000,
height: 700,
title: "第二个页面"
})
newWin.loadFile("src/index2.html");
newWin.on('closed', function () {
newWin = null; // 页面关闭需要设置为null防止内存溢出
});
}
}
}
测试运行
默认的超链接是会在窗口中打开,类似如下
我们可能需要的是 点击超链接时,在浏览器中打开网页
在button.js
中编写如下
// 超链接 在浏览器中打开
var {shell} = require('electron');
const buttonFour = document.getElementById('button-four');
buttonFour.onclick = function (e) {
e.preventDefault(); // 阻止默认行为
var href = this.getAttribute('href');
shell.openExternal(href); //在默认浏览器中打开超链接
}
我们可以自定义顶部菜单
在main.js
中进行如下编写
// 客户端顶部菜单
const {Menu} = require('electron');
const template = [
{
label: '金足印象',
submenu: [
{
label: '金品SPA',
accelerator: 'ctrl+n', // 绑定快捷键
click: () => { // 菜单事件
var win = new BrowserWindow({
width: 1000,
height: 700,
title: "第二个页面"
});
win.loadFile("src/index2.html");
win.on('closed', function () {
win = null;
});
}
},
{label: '泰式按摩'}
]
},
{
label: '斗鱼网咖',
submenu: [
{label: '网费充值'}
]
}
]
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
由于我们是在index.html
页面中鼠标右键打开菜单,所以需要在button.js
中进行编写
// 鼠标右键打开菜单
const remote = require('@electron/remote')
const m = [
{
label: '粘贴'
},
{
label: '复制'
}
]
const mm = remote.Menu.buildFromTemplate(m);
// 鼠标右击事件
window.addEventListener('contextmenu', function (e) {
e.preventDefault(); // 阻止默认行为
mm.popup({window: remote.getCurrentWindow()})
});
打开第二个页面的时候嵌入网页
在button.js
中编写
const buttontTow = document.getElementById("button-two");
const {BrowserWindow, BrowserView} = require('@electron/remote')
var newWin = null;
window.onload = function () {
buttontTow.onclick = function () {
newWin = new BrowserWindow({
width: 1000,
height: 700,
title: "第二个页面"
})
newWin.loadFile("src/index2.html");
// 嵌入网页
var view = new BrowserView();
newWin.setBrowserView(view);
view.setBounds({
x: 0,
y: 120,
width: 1000,
height: 680
});
view.webContents.loadURL('https://www.baidu.com')
newWin.on('closed', function () {
newWin = null;
});
}
}
}