uni-app与electron搭配开发桌面应用

如果个人开发一些中小型应用,uni-app是一个不错的选择,如果对性能要求不是很高,还可以考虑使用uniCloud代替后端开发。突发奇想,是否可以使用uni-app+uniCloud来开发桌面应用?经过测试,完全可行!

一、创建 uni-app 项目

采取 cli 方式创建 uni-app 项目(这样的方式与纯粹vue开发更加类似),引入 uniCloud,测试正常——具体不再赘述,请自行百度。

注意:在 uni-app 项目 manifest.json配置 中的“Web 配置项”中的“运行的基础路径”项,必须填“./”,启用 http 协议不要选。否则打包的页面是空白的。

 二、打包 uni-app 项目

打包成功后,会在根目录下生成 dist/build/web 文件,文件下有 assets、static、index.html 三个文件。这些是 electron 应用所需的文件。

 三、创建 electron 项目:以下的操作都在 electron 文件夹下进行

  • 在 dist 目录下,创建一个名为 electron 的文件夹,将 dist/build/web 下的三个文件拷贝到 electron 文件夹下。在 electron 下新建 main.js 文件。
// main.js

// 引入electron
const { BrowserWindow, app } = require("electron");

// 实例化窗口
const createWindow = () => {
    // 创建浏览器窗口
    const win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        },

    });

    // 加载index.html文件
    win.loadFile("./index.html");
};

// 创建应用
app.whenReady().then(() => {
    createWindow();

    // 监听所有窗口关闭事件
    app.on("window-all-closed", () => {
        // 在 macOS 上,除非用户通过 Cmd + Q 明确退出,否则应用程序不会关闭
        if (process.platform !== "darwin") {
            app.quit();
        }
    });

    // 当用户点击 dock 图标时,显示应用程序窗口
    app.on("activate", () => {
        if (BrowserWindow.getAllWindows().length === 0) {
            createWindow();
        }

    });

});

  • 在electron目录下打开终端,首先运行 npm init 创建 package.json,然后安装 electron electron-packager

npm i electron electron-packager --save
  • 运行 electron 应用

    在 package.json 中添加启动项

 "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "electron ."//添加这行
    },

   // ```

运行 npm start 启动项目

经过测试,成功加载 index.html 文件,且 uniCloud 使用正常。

四、打包 electron 应用

在 package.json 中添加打包项

"scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "electron .",
         "build": "electron-packager ./  律师助手 --plantform=win32 --arch=x64 --out 律师助手 --overwrite --icon=./static/favicon.ico"
},

打包命令解释:

1. " ./ " 表示打包所需的文件路径,这里表示 electron 打包所需的文件就是与 package.json 同一个目录

2. " 律师助手" 表示打包后在目录下创建文件名为“律师助手”,后一个“--out 律师助手”表示打包后的文件名为 律师助手.exe

3. "--plantform=win32" 表示打包的是 Windows 程序

4. "--arch=x64" 表示程序架构为 64 位

5. "--overwrite" 表示覆盖已存在的文件

6. "--icon=./static/favicon.ico" 表示程序图标的位置路径

运行 npm run build 打包项目,打包成功后,增加了一个名为 律师助手的文件夹。

经过测试,成功打包出 律师助手.exe 文件,且运行正常。

五、应用开发 

以上是一个项目创建与打包生成桌面应用的全过程,接下来我简单介绍如何进行electron与uni-app的联合开发。

1、只能用Hbuildx来启动uni-app

 如果不使用uniCloud(如果不用uniCloud,干嘛还要用uni-app来开发桌面应用)则跳过!

  • 由于cli创建的应用必须用Hbuildx来启动,所以,在开发过程中必须使用Hbuildx来启动uni-app。启动成功后,查看uni-app项目的h5页面地址为http://localhost:5173。
  • 用vscode打开项目,进入electron目录,打开终端输入npm start运行electron程序。此时打开的页面是编译好的index.html,修改electron加载的页面:

// 实例化窗口
const createWindow = () => {
	// 创建浏览器窗口
	const mainWindow = new BrowserWindow({
		width: 800,
		height: 600,
		webPreferences: {
			preload: path.join(__dirname, "./preload/index.js"),
			contextIsolation: false,
		},
	});

	// 加载index.html文件
	// win.loadFile("./index.html");//打包时用这个
	mainWindow.loadURL("http://localhost:5173"); //开发调试用这个
	// 窗口加载完成后,最大化窗口并显示控制台
	mainWindow.maximize();
	mainWindow.webContents.openDevTools();
};

保存后重新启动electron,此时加载的页面就是已经运行的uni-app的页面,尝试修改uni-app的页面,你会发现electron窗口中的页面也随着发生改变,证实了electron加载的就是之前运行的uni-app的页面。

2、nodemon 库实现热重载

安装nodemon库

npm i nodemon --save

修改package.json中的启动项

"scripts": {
	"test": "echo \"Error: no test specified\" && exit 1",
	"start": "nodemon --watch main.js --exec electron .",
	"build": "electron-packager ./  律师助手 --plantform=win32 --arch=x64 --out 律师助手 --overwrite --icon=./static/favicon.ico"
},

这样就可以实现electron的热重载。

3、配置ipc通讯

  • 在electron目录下添加preload文件夹,文件夹内增加index.js
const { contextBridge, ipcRenderer } = require("electron/renderer");
window.ipcRenderer = ipcRenderer;
  • main.js中添加代码如下
// 引入electron
const { BrowserWindow, app, ipcMain } = require("electron");
const path = require("path");

// 实例化窗口
const createWindow = () => {
	// 创建浏览器窗口
	const mainWindow = new BrowserWindow({
		width: 800,
		height: 600,
		webPreferences: {
			preload: path.join(__dirname, "./preload/index.js"),//指定预加载脚本
			contextIsolation: false,
		},
	});
};

如此,则可以使用ipc通讯实现主进程与渲染进程之间的通讯了,如:

主进程中:

// 监听通讯
ipcMain.on("mainRenderer", (event, arg) => {
	console.log(event, arg);
	event.sender.send("mainRenderer", "这是回复");
});

 渲染进程中:

function mainRanderer() {
	window.ipcRenderer.send("mainRenderer", "hello world");
	// 同时开启监听
	window.ipcRenderer.on("mainRenderer", (event, arg) => {
		console.log(arg); // prints "pong"
	});
}

以上就是electron结合uni-app开发桌面应用的简单示例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值