织巢鸟项目介绍
一.如何同步开发?
1.渲染进程使用react+typsectipt 同步开发渲染进程和web端
2.electron使用loadFile模式
3.渲染进程通过自定义的checkEnv方法判断是否在electron中,通过navigator.userAgent中是否有 electron/ 有则在electron中,来区分当前部署在electron环境还是web环境
4.如何同时兼顾web代码和electron代码?
通过配置web路由和渲染进程路由来进入不同的路由页面,通过checkEnv方法来重定向到规定页面 通常情况下在主进程中将node暴露到渲染进程中使用ipcRenderer可以进行通信,但是这种情况在浏览器端会报错。 所以我使用了preload文件,使用contextBridge可以向渲染进程的window对象暴露window.electronAPI 变量。这个变量上可以 直接调用我们在主进程维护的方法,且能通过参数传递数据。这种通信方式解决了打包到web环境中报错到问题。
二.electron环境和web环境下的一些区别
1.electron中的localStorage不能持久化存储数据,写了一个localStorage工具类来区分,electron中使用'electron-store',web中正常使用localStorage
2.electron中不能直接操作cookie,需要使用 electron的session模块来存储cookie
三.不同系统的兼容问题,win Mac linux
首先通过process.platform来判断当前操作系统,不同系统的安装目录不一样
1.比如做license的时候需要为安装的电脑生成唯一的productId,需要读取cpu信息,网卡mac地址,以及操作系统信息。需要区分操作系统。
2.启动java服务,预先把不同系统的jre下载好放到指定目录,打包后不同系统的java的jre存放路径也不一样,需要区别路径来通过jre启动jar包.
四.项目中遇到的难点
1.解决模型文件过大上传和下载过慢问题
由于模型文件的数据量特别大,假如使用json的格式来储存,体积很大。使用csv文件的形式存储文件体积减小了很多
下载: 前端发起下载请求,后端创建一个任务,前端持续轮训任务状态,完成时,下载后端压缩成zip的csv文件。 Js-zip包解压缩zip成csv文件流,然后通过文件流转成csv blob的格式,通过papaparse解析csv blob得到json文件
上传: json通过papaparse转成csv文件流,通过jszip转成zip文件流,在通过创建FormData将文件通过接口传到后端。
2.如何在electron启动java服务
使用nodejs的spawn启动一个子进程,事先下好不同环境的jre,通过process.platform读取当前环境运行对应的jre,并启动java代码
3.自动更新electron程序
使用electron-updater库:将打包产物和.yml文件上传的服务器上,通过对比服务器的yml文件和package.json中的version字段来判断服务器版本是否新版本,有新版本则弹窗提示更新,使用autoUpdater.downloadUpdate()下载服务器上的安装包,autoUpdater.on('download-progress')监听下载进度可获取下载信息。下载完成后调用autoUpdater.quitAndInstall();即可退出程序安装新版本
4.区分本地java服务和服务器
使用config.dev设置一个环境变量为开发环境。
维护一个方法判断当前是开发还是生产环境,开发环境则走对应后端的本地服务,生产环境则掉本地接口。
使用proxy本地代理的形式进行代理,设置两个代理,通过接口前缀来区分对应的服务器。
5.实现切换知识库功能 electron中的localstorage无效(关闭后就会被清除),cookie无效(无法存取)。使用electron-store 需要实现在前端运行时可配置服务器地址,实现不同服务器的切换,请求不同服务器的接口。 将需要切换的连接数据库的配置使用 electron-store 来持久化存储配置数据。 使用umi的request的requestInterceptors或者axios中的nterceptors做统一的请求拦截,获取electron-store请求配置来调对应接口
6.实现一套代码同时运行在浏览器和electron 刚开始开启了nodeIntegration,在渲染进程中操作主进程api,在浏览器运行报错,因为浏览器中没有相关api。通过查阅技术文档将它关闭然后使用在preload.js处理方案解决了这个问题
1.BrowserWindow中可以配置 nodeIntegration: false,来禁止在渲染进程中使用node,而是使用preload.js来进行通信。
2.在preload.js中使用contextBridge和ipcRenderer来向渲染进程暴露electron的事件处理api,渲染进程在window对象可以调用这些方法,类似写入文件,读取文件.
3.隔绝环境不报错,判断react当前是否在electron中来区分事件处理函数。