前言
electron分了主进程和渲染进程, 如果在主进程中执行的时间过长会导致页面卡顿,因为主进程管理者渲染器进程,为了优化,做了很多的一个方案:
1. 再开一个BrowserWindow 窗口来处理这些逻辑,设置这个窗口隐藏,然后通过electron内置的ipc进行消息的通讯
2. 利用webWorker来处理这些复杂的逻辑
3. 使用golang等处理业务,打包成exe,使用node的child_process启动exe,通过socket处理
4. 通过的node的fork启动一个node服务来处理逻辑
...
像1、3、4这种本质上是要开多一个进程去处理,那么进程之间的通信就很重要了,比如socket,ipcRender,ipcMain。
我有个项目就用了socket做了通信,不过用socket做通信可能会遇到端口占用的情况,就是你先跑了socket,然后端口被其他应用占掉,这时注意重新拉起。
命名管道通信
回归正题,现在做一个使用net模块实现electron主进程和node进程的命名管道通信,功能比较简单,就是获取文件夹下所有的文件和文件夹。
这边读取文件夹下所有文件和文件夹作为Server,electron主进程是client
fileDirRead.js:
const net = require("net");
const pipeFile =
process.platform === "win32" ? "\\\\.\\pipe\\rfpip" : "/tmp/rfpip.sock";
const fs = require("fs");
const path = require("path");
const readDir = (dirPath, arr) => {
const dirs = [];
const files = fs.readdirSync(dirPath);
files.forEach((file) => {
const localPath = path.join(dirPath, file);
if (fs.statSync(localPath).isDirectory()) {
dirs.push(localPath);
}
arr.push(localPath);
});
while (dirs.length > 0) {
const dir = dirs.shift();
const parent = dir;
const files = fs.readdirSync(dir);
files.forEach((file) => {
const localPath = path.