【问题标题】:How to make multiple Svelte windows in Electron?如何在 Electron 中制作多个 Svelte 窗口?
【发布时间】:2022-02-14 01:42:38
【问题描述】:

对于我的电子应用程序,我想打开另一个 Svelte 窗口(或根据启动变量加载不同的窗口/组件)。

假设我使用this tutorial 设置了一个基本结构,我的App.svelte 看起来像这样:

<script>
    const openLauncher = () => {
        window.api.openWindow("launcher");
    };
</script>

<button on:click={openLauncher}>Open Launcher</button>

如您所见,我添加了一个 IPC 功能来打开一个新窗口。对应的index.js

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);

这确实有效,并打开了一个带有 launcher.html 的新窗口,但我不知道如何让 Svelte 组件在该新文件中工作。

我的一个想法是修改 main.js 文件,以便 body 组件发生变化,如下所示:

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;

这适用于主窗口(即,如果我切换 ID,它会在启动时加载正确的组件)但由于它在打开新窗口时不加载任何 Svelte,所以这不起作用。

所以我非常感谢任何关于如何让 Svelte 为新的/不同的 windows/html 文件加载的想法!如果有办法使用 SvelteKit 做到这一点,那就更好了!

提前谢谢你!

【问题讨论】:

    标签: javascript electron svelte svelte-3 sveltekit


    【解决方案1】:

    我看到的明显的快速修复是在 App.svelte 中的 bodyID 上使用 #if 块,其中包含两个组件 MainApp(App.svelte 的内容)和 LauncherApp,然后根据您使用的模式简单地更改 bodyID是。

    在使用 sveltekit 时,我认为将 LauncherApp 视为单独的路线是有意义的(我相信这是使用 sveltekit 实现“分离”页面的唯一方法,尽管我不是 100%)。因此,当打开一个新窗口时,您将应用程序的新实例导航到 LauncherApp 路由。如果您不想要与主应用中相同的基本布局,您可以添加一个__layout.reset.svelte 文件。

    我不知道为什么您的解决方案不起作用,它非常优雅。

    【讨论】:

    • 感谢您的回复!是的,在App.svelte 文件中使用#if 方法,但对我来说这似乎很“骇人听闻”。 Re:SvelteKit:可悲的是,我对 Svelte(Kit) 很陌生,不知道如何使用新路由打开一个新实例(然后来回传递数据)。
    • 不客气!这么多年过去了,很高兴回馈社会。我完全同意这种感觉。试试看!我不会说学习曲线比 svelte 高,它是一个线性斜率。我认为您只需要以编程方式导航(sveltekit 中的标准功能)到该路线并且路线有据可查。
    猜你喜欢
    • 2021-02-12
    • 2021-06-30
    • 2021-04-23
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2019-08-23
    • 2019-05-01
    相关资源
    最近更新 更多