Para mi aplicación de electrones, me gustaría abrir otra ventana Svelte (o cargar diferentes ventanas/componentes dependiendo de las variables de inicio).
Entonces, digamos que usé este tutorial para configurar una estructura básica, con mi App.svelte luciendo así:
<script> const openLauncher = () => { window.api.openWindow("launcher"); }; </script> <button on:click={openLauncher}>Open Launcher</button> Como puede ver, agregué una función IPC para abrir una nueva ventana. El index.js correspondiente:
const { app, BrowserWindow, ipcMain } = require("electron"); const { join } = require("path"); app.on("ready", () => { const mainWindow = new BrowserWindow({ webPreferences: { preload: join(__dirname, "./preload.js"), } }); mainWindow.loadFile(join(__dirname, "../public/index.html")); }); ipcMain.on("openLauncher", (event, args) => { const launcher = new BrowserWindow({ webPreferences: { preload: join(__dirname, "./preload.js"), } }); launcher.loadFile(join(__dirname, "../public/launcher.html")); }); preload.js :
const { contextBridge, ipcRenderer } = require("electron"); const API = { openWindow: (obj) => ipcRenderer.send("openLauncher", obj), } contextBridge.exposeInMainWorld("api", API); Esto funciona y abre una nueva ventana con launcher.html , pero no puedo entender cómo hacer que los componentes de Svelte funcionen en ese nuevo archivo.
Una idea que tuve fue modificar el archivo main.js para que el componente del cuerpo cambie, así:
import App from './App.svelte'; import LauncherApp from './LauncherApp.svelte'; const bodyID = document.getElementsByTagName('body')[0].id; const app = {}; if (bodyID == "index") { app = new App({ target: document.body, }); } else if (bodyID == "launcher") { app = new LauncherApp({ target: document.body, }); } export default app;Esto funciona para la ventana principal (es decir, si cambio las ID, carga el componente correcto al inicio), pero como no carga ningún Svelte al abrir la nueva ventana, esto no funciona.
¡Así que realmente agradecería cualquier idea sobre cómo hacer que Svelte se cargue para ventanas/archivos html nuevos/diferentes! Y si hay una manera de hacer esto con SvelteKit, ¡aún mejor!
¡Gracias de antemano!
La solución rápida obvia que veo es usar un bloque #if en bodyID en App.svelte que contiene dos componentes, MainApp (contenido de App.svelte ) y LauncherApp, y luego simplemente cambiar bodyID según el modo en que se encuentre.
Al usar sveltekit, creo que tendría sentido tratar a LauncherApp como una ruta separada (creo que esta es la única forma de tener páginas "separadas" con sveltekit, aunque no estoy al 100%). Entonces, al abrir una nueva ventana, navega la nueva instancia de su aplicación a la ruta LauncherApp. Si no desea el mismo diseño base que en la aplicación principal, puede agregar un archivo __layout.reset.svelte .
No sé por qué tu solución no funcionó, fue bastante elegante.