要在Electron中使用 electron-trpc 进行事件订阅和触发,你需要分别在主进程和渲染进程中进行适当的配置。下面是具体的步骤和代码示例,帮助你实现事件的订阅和触发。

1. 在主进程中使用(订阅和触发)

在主进程中,你可以通过调用RPC API来触发事件,并通过 EventEmitter 来监听事件。

// main.js (主进程)

import { app, BrowserWindow } from 'electron';

import { createTRPCServer } from '@trpc/server';

import { inferAsyncReturnType, initTRPC } from '@trpc/server';

import { router } from './path/to/api'; // 把你的 api.ts 文件路径替换为实际路径

const createContext = ({}) => ({});

const t = initTRPC.create({ isServer: true });

const startServer = () => {

const server = createTRPCServer({

router,

createContext,

});

return server;

};

app.on('ready', () => {

const mainWindow = new BrowserWindow({

webPreferences: {

nodeIntegration: true,

contextIsolation: false,

},

});

const server = startServer();

// 触发事件

server.call('greeting', { name: 'World' }).then((response) => {

console.log(response.text);

});

});

2. 在渲染进程中使用(订阅和触发)

在渲染进程中,你可以使用 tRPC 客户端来订阅事件,并通过该客户端发送请求来触发事件。

// renderer.js (渲染进程)

import { createTRPCProxyClient, httpLink } from '@trpc/client';

import { AppRouter } from './path/to/api'; // 把你的 api.ts 文件路径替换为实际路径

const trpc = createTRPCProxyClient({

links: [

httpLink({

url: 'http://localhost:4000/trpc', // 确保这里的URL与你的Electron进程设置一致

}),

],

});

// 订阅事件

const unsubscribe = trpc.subscription('subscription').subscribe({

next: (data) => {

console.log('Received: ', data.text);

},

});

// 发送触发事件

const triggerGreeting = async (name) => {

const response = await trpc.greeting.query({ name });

console.log(response.text);

};

// 示例触发

triggerGreeting('John');

// 记得在适当的时候取消订阅

// unsubscribe();

说明

主进程:

调用 greeting 来触发事件并传递参数。

greeting 事件会通过 EventEmitter 触发,所有监听了这个事件的订阅都会收到通知。

渲染进程:

使用 trpc.subscription 创建一个订阅,以接收主进程发送的事件。

使用 trpc.greeting.query 触发事件并获取响应。

确保在不需要订阅时调用 unsubscribe() 来取消订阅,以避免内存泄漏。

注意事项:

确保在 Electron 的所有相关进程中正确配置 TRPC。

根据具体的项目结构调整引入路径。

这样,你就可以在主进程和渲染进程中完成事件的订阅与触发了。如果你还有任何疑问或者需要进一步的帮助,请随时告诉我!