Electron初体验
背景
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。在制作的二进制安装包中,会嵌入了Chromium 和 Node.js 。
即使没有本地开发经验,只有JavaScript开发经验,也可以构建出一个跨平台的应用,可以在windows、macOS和Linux上使用。
初体验
环境准备
安装 node 和 npm
node -v
npm -v
windows下的安装包为
https://nodejs.org/dist/v16.13.0/node-v16.13.0-x64.msi
如果要打包的话,安装时需要选中安装必备工具。这些工具在开发的时候不需要,但是在打包的时候需要。此时会安装包管理器 Chocolatey,允许使用一行命令来安装软件。同时会安装很多别的包。
> node -v
v16.13.0
> npm -v
8.1.0
设置为淘宝镜像源
npm set registry https://registry.npmmirror.com
创建应用
mkdir -p my-electron-app
cd my-electron-app
npm init
生成一个示例 package.json
如下:
{
"name": "my-electron-app",
"version": "1.0.0",
"description": "Hello World!",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "flowaters",
"license": "MIT"
}
安装electron
包
npm install --save-dev electron --registry=https://registry.npmmirror.com
结果
added 86 packages in 26s
修改入口
{
"scripts": {
"start": "electron ."
}
}
运行
npm start
此时是会失败的,因为我们还没有编写APP。
编写代码
创建main.js
创建一个空白的main.js,再运行npm start
会发现,已经不报错了,但是什么也没有。
创建index.html
内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
We are using Node.js <span id="node-version"></span>,
Chromium <span id="chrome-version"></span>,
and Electron <span id="electron-version"></span>.
</body>
</html>
创建main.js
// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow } = require('electron')
const path = require('path')
function createWindow () {
// 创建浏览器窗口
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
// 加载 index.html
mainWindow.loadFile('index.html')
// 打开开发工具
// mainWindow.webContents.openDevTools()
}
// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
createWindow()
app.on('activate', function () {
// 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他
// 打开的窗口,那么程序会重新创建一个窗口。
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此,通常对程序和它们在
// 任务栏上的图标来说,应当保持活跃状态,直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})
// 在这个文件中,你可以包含应用程序剩余的所有部分的代码,
// 也可以拆分成几个文件,然后用 require 导入。
创建 preload.js
// 所有Node.js API都可以在预加载过程中使用。
// 它拥有与Chrome扩展一样的沙盒。
window.addEventListener('DOMContentLoaded', () => {
const replaceText = (selector, text) => {
const element = document.getElementById(selector)
if (element) element.innerText = text
}
for (const dependency of ['chrome', 'node', 'electron']) {
replaceText(`${dependency}-version`, process.versions[dependency])
}
})
试运行
npm run
打包应用
最快捷的打包方式是使用 Electron Forge。
环境准备
安装python3,这个在安装nodejs的时候,会自动附加上。
安装Electron Forge
npm install --save-dev @electron-forge/cli
结果
added 471 packages in 37s
3 packages are looking for funding
run `npm fund` for details
通过import设置Forge的脚手架。
npx electron-forge import
结果
√ Checking your system
√ Initializing Git Repository
√ Writing modified package.json file
√ Installing dependencies
√ Writing modified package.json file
√ Fixing .gitignore
We have ATTEMPTED to convert your app to be in a format that electron-forge understands.
Thanks for using "electron-forge"!!!
打包
使用 Forge 的 make
命令来创建可分发的应用程序:
>npm run make
> [email protected] make
> electron-forge make
√ Checking your system
√ Resolving Forge Config
We need to package your application before we can make it
√ Preparing to Package Application for arch: x64
√ Preparing native dependencies
√ Packaging Application
Making for the following targets: squirrel
× Making for target: squirrel - On platform: win32 - For arch: x64
还是失败了。
问题
安装electron包时卡住
使用taobao镜像源
镜像源管理:
sudo npm install -g nrm --registry=https://registry.npmmirror.com
结果
npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.cloud.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/
切换源
nrm use taobao
指定electron源
编辑文件 ~/.npmrc
,增加如下行:
electron_mirror="https://npm.taobao.org/mirrors/electron/"