8.预加载脚本通用调用方法
-- 未经授权禁止转载 --
preload.mjs
	import os from 'os'
	import { contextBridge, ipcRenderer } from "electron"

	//console.log("preload.mjs")

	contextBridge.exposeInMainWorld('DRAPI',{
	    url:"dengruicode.com",
	    version:os.version(),
	    /*
	    sendDataToMain: async data => {
	        //向主进程发起一个名为 sendDataToMain 的异步调用, 并携带 data 数据
	        return await ipcRenderer.invoke('sendDataToMain',data)
	    },
	    toggleTheme: () => { //切换主题
	        return ipcRenderer.invoke('toggleTheme')
	    }
	    */
	    invokeWithData: async (channel, data) => {
	        return await ipcRenderer.invoke(channel, data) //发送者通过指定的 channel 发送数据
	    },
	    invoke: async channel => {
	        return await ipcRenderer.invoke(channel)
	    },   
	})

index.js
	//console.log("index.js", "dengruicode.com")
	//console.log("index.js", window)

	/*
	//渲染进程向主进程发送数据并获取返回值
	DRAPI.sendDataToMain("dengruicode.com").then(data => {
	    console.log("data:", data)
	}).catch(err => {
	    console.log("err:", err)
	})

	//切换主题
	document.querySelector('#toggleTheme').addEventListener('click', async () => {
	    let theme = await DRAPI.toggleTheme()
	    console.log(theme)
	})
	*/
	DRAPI.invokeWithData("sendDataToMain","dengruicode.com").then(data => {
	    console.log("data:", data)
	}).catch(err => {
	    console.log("err:", err)
	})

	document.querySelector('#toggleTheme').addEventListener('click', async () => {
	    //let theme = await DRAPI.toggleTheme()
	    let theme = await DRAPI.invoke("toggleTheme")
	    console.log(theme)
	})