我想提供主应用程序和子电子应用程序之间的数据交换(GUI可以从控制台启动)。
下面的源代码是TypeScript。
import Path from "path";
import ChildProcess, { ChildProcess as ChildProcess__type } from "child_process";
import Chalk from "chalk";
export default abstract class ProjectInitializer {
private static readonly ELECTRON_EXECUTE_FILE_ABSOLUTE_PATH: string = Path.resolve(
__dirname, "node_modules", ".bin", "electron.cmd"
);
private static readonly ELECTRON_MAIN_PROCESS_FILE_ABSOLUTE_PATH: string = Path.resolve(
__dirname, "ProjectInitializer__ElectronMainProcess.js"
);
public static startInitializeProjectGUI(): void {
console.log(Chalk.cyanBright("GUI is starting ..."));
const electronApplicationChildProcess: ChildProcess__type = ChildProcess.spawn(
ProjectInitializer.ELECTRON_EXECUTE_FILE_ABSOLUTE_PATH,
[
ProjectInitializer.ELECTRON_MAIN_PROCESS_FILE_ABSOLUTE_PATH,
"--color", "always"
]
);
// No TypeScript error but error occurs in compiled JavaScript
electronApplicationChildProcess.send({ foo: "alpha" });
electronApplicationChildProcess.on("message", (message: unknown) => {
console.log(message);
});
}
}
JavaScript错误消息是:
TypeError: electronApplicationChildProcess.send is not a function
at Function.ProjectInitializer.startInitializeProjectGUI (webpack:///./ProjectInitializer/ProjectInitializer.ts?:24:41)
at Function.HikariAutomation.interpretConsoleCommandAndExecute
子过程(但在电子术语中,它是“电子主过程”)
import URL from "url";
import Path from "path";
import {
app as electronApplication,
App as ElectronApplication,
BrowserWindow,
} from "electron";
import enableElectronDebug from "electron-debug";
class ProjectInitializerGUI {
private electronApplication: ElectronApplication;
private mainWindow: BrowserWindow | null = null;
private static MAIN_WINDOW_MARKUP__FILE_NAME_WITH_EXTENSION: string = 'ProjectInitializer.html';
private constructor() {
this.electronApplication = electronApplication;
enableElectronDebug();
this.electronApplication.on('ready', this.onApplicationReadyEventHandler.bind(this));
}
public static start(): void {
new ProjectInitializerGUI();
}
private onApplicationReadyEventHandler(): void {
this.mainWindow = new BrowserWindow({
width: 1280,
height: 800,
useContentSize: true,
center: true,
resizable: false,
fullscreenable: false,
titleBarStyle: 'hidden',
webPreferences: {
nodeIntegration: true
}
});
this.mainWindow.loadURL(URL.format({
pathname: Path.join(
__dirname,
ProjectInitializerGUI.MAIN_WINDOW_MARKUP__FILE_NAME_WITH_EXTENSION
),
protocol: 'file:',
slashes: true
}));
this.mainWindow.setMenu(null);
}
}
(function executeApplication(): void {
ProjectInitializerGUI.start();
process.on("message", (message: unknown) => {
console.log(message);
});
// TypeScript forces to check send method on existence ...
if (process.send) {
// but because it's undefined, code in this scope in unreachable
process.send("Just message");
process.send({ foo: "alpha", bar: "bravo" })
}
})();
以下是的类型定义
process.send
. 如您所见,它是可选属性:
interface Process extends EventEmitter {
// ...
send?(message: any, sendHandle?: any, options?: { swallowErrors?: boolean}, callback?: (error: Error | null) => void): boolean;
// ...
定义
child_process
send
方法始终存在于子进程的类型定义中
子进程
发送
属性是必需的:
declare module "child_process" {
// ...
interface ChildProcess extends events.EventEmitter {
// ...
send(message: any, callback?: (error: Error | null) => void): boolean;
}
}