项目的开启
原生项目的构建
# 创建文件夹并进入文件夹
mkdir demo && cd demo
# 初始化项目
yarn init -y
# 安装 electron
yarn add --dev electron
#
...
"main": "main.js", //入口文件
"scripts": {
"start": "electron ." //启动命令
},
const { app, BrowserWindow ,Menu} = require('electron')
const path = require('path') // 路径模块
// 设置自定义菜单
const template=[]
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
// 创建窗口函数
const createWindow = () => {
const win = new BrowserWindow({
width: 800,
height: 600,
resizable: false, //禁止缩放
show:false, //配合优化渲染
backgroundColor: '#fff', //背景颜色
webPreferences: {
// __dirname 字符串指向当前正在执行脚本的路径 (在本例中,它指向你的项目的根文件夹)
preload: path.join(__dirname, 'preload.js')
}
})
//开启调试模式 => 模式:`right` `left` `bottom` `detach`
win.webContents.openDevTools({mode:'detach'})
// 加载渲染html文件,也可以指定URL
win.loadFile('index.html')
// 优化渲染:第一次完成绘制时,如果窗口还没有被显示,渲染进程会发出 ready-to-show 事件
win.once('ready-to-show', () => {
win.show()
})
}
// 只有在app模块的ready事件被激发后才能创建浏览器窗口
app.whenReady().then(() => {
createWindow() //通过调用createWindow
app.on('activate', () => { // 兼容:在macOS上,当单击图标,并没有其他窗口打开
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
// 监听关闭窗口,在所有窗口关闭后,退出
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit()
})
preload 预加载脚本,将不同类型的进程桥接在一起,通过 versions 这一全局变量,将 Electron 的 process.versions 对象暴露给渲染器
const { contextBridge } = require('electron');
// 预加载脚本,将不同类型的进程桥接在一起
contextBridge.exposeInMainWorld('versions', {
node: () => process.versions.node,
chrome: () => process.versions.chrome,
electron: () => process.versions.electron,
});
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="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>.
<p id="info"></p>
<!-- 执行脚本,可以添加其他的执行脚本 -->
<script src="./renderer.js"></script>
</body>
</html>
//通过renderer.js读取各个模块的版本号并显示
const information = document.getElementById('info');
information.innerText = `This app is using Chrome (v${versions.chrome()}), Node.js (v${versions.node()}), and Electron (v${versions.electron()})`;
Vue项目的构建
目前市面上大多采用了 electron-vue
(已废弃) 和 vue-cli-plugin-electron-builder
来实习vue开发Electron的方法。
vue-cli-plugin-electron-builder
项目的调试
数据持久存储
electron-store
专门给electron设置的存储数据库, 保存和加载用户首选项,应用程序状态,缓存等
yarn add electron-store || npm install electron-store
// main.js
const { app,ipcMain} = require('electron')
const Store = require('electron-store');
const store = new Store();
// 定义ipcRenderer监听事件
ipcMain.on('setStore', (_, key, value) => {
store.set(key, value)
})
ipcMain.on('getStore', (_, key) => {
let value = store.get(key)
_.returnValue = value || ""
})
// preload.js
const { contextBridge,ipcRenderer } = require('electron');
// 主进程和渲染进程进行通信,并暴露接口
const electronHandler = {
ipcRenderer: {
setStoreValue: (key, value) => {
ipcRenderer.send("setStore", key, value)
},
getStoreValue(key) {
const resp = ipcRenderer.sendSync("getStore", key)
return resp
},
}
}
contextBridge.exposeInMainWorld('electron', electronHandler);
//存储及读取
electron.ipcRenderer.setStoreValue('token', '123456');
console.log(electron.ipcRenderer.getStoreValue('token'))
项目的打包
Electron Forge
安装 Electron Forge
,通过这个打包成无需安装的免安装版,也可以打包成exe安装软件,但是这个太拉了,不用这个,考虑 Inno Setup。
yarn add --dev @electron-forge/cli
npx electron-forge import
{
"name": "my-app",
"version": "0.0.1",
"config": {
"forge": {
"packagerConfig": {},
"makers": [
{
"name": "@electron-forge/maker-zip"
}
]
}
}
}
- 命令集合
// 打包命令,打包成为免安装版,输出目录默认为 out/
yarn package
// 打包命令,打包成为exe安装执行文件
yarn make
Inno Setup
打包软件,官方没有中文版本IDE,需要使用可以通过网络进行收集,中文版InnoSetup
如果需要打包成中文安装包,需要将配置文件修改为中文版本的,复制安装目录下的 Default.isl
文件,黏贴在 Languages
目录文件下,重命名为 Chinese
,然后修改里面的内容为下列; 注意格式需要为 UTF-8 with BOM
否则会出现乱码。
或者直接下载,然后将其放入 Languages
目录文件下 下载文件