电子在开发和构建应用程序中伪造静态资产

Electron forge static assets in dev and built app

我有一个准备打包的 electron forge 应用程序,但我的静态资产在构建版本中不起作用。例如,我正在尝试显示我们的徽标:

<img src='/assets/svgs/logo.svg' class='text'></img>

因为在开发中它启动了一个服务器,页面的 URL 是 http://localhost:3000/main_window。为了访问我的静态文件,我放置了一个“/”,它在从基本域加载时工作,而不是在 window 名称之外工作:

http://localhost:3000/assets/svg/logo.svg 

如果没有第一个“/”,它在此处看起来不起作用:

http://localhost:3000/main_window/assets/svgs/logo.svg

但是对于第一个“/”,构建的应用程序解释路径不同,因为它不再在开发服务器中:

file:///assets/svgs/logo.svg

如果我将 html 更改为以下内容,那么它可以在构建版本而不是开发版本中使用:

<img src='assets/svgs/logo.svg' class='text'></img>

file:///C:/Users/<USER>/projects/<PROJECT>/out/App-win32-x64/resources/app/.webpack/renderer/main_window/assets/svgs/logo.svg

我正在使用 WebpackCopyPlugin 将这些资源复制到 .webpack 文件夹中

  new CopyWebpackPlugin({
    patterns: [
      { from: path.resolve(__dirname, 'src/renderer/assets/'), to: 'assets' },
    ],
  })

然而,这是在 .webpack 文件夹中的两个位置复制资源。我在两个方面都看到了我的资产:

.webpack\renderer\assets
.webpack\renderer\main_window\assets

我不确定为什么要复制这些文件,但是对于 main_window 文件夹中的资产,我不明白为什么路径 http://localhost:3000/main_window/assets/svgs/logo.svg在开发环境中无法解决。我还发现它在开发服务器中看起来很奇怪,它查看基本资产文件夹,但在构建的应用程序中它查看 main_window\assets.

如何让这些静态资产在开发服务器和构建的应用程序中工作,而不必根据其 运行 所在的环境使用不同的路径?

编辑: 我确实发现了这个类似 post,但他们的答案是 运行 生产中的快速服务器,另一个解决方案是根据环境变量更改路径。 运行 prod 中的快速服务器用于一些图像听起来像是创可贴解决方案,并且必须使用环境变量来设置路径在原始 HTML 中不起作用。这方面的可维护性不是很好,因为您需要记住使用该路径,如果测试不当,仍然很容易导致生产代码损坏。

我在发布到 webpack 的问题中找到了解决方案,无需单独的服务器、文件协议处理程序或基于变量引用它:

在 CopyWebpackConfig 中,明确提供指向 .webpack/main_window 文件夹的路径作为目标:

  new CopyWebpackPlugin({
    patterns: [
      { 
        from: path.resolve(__dirname, 'src/renderer/assets/'), 
        to: path.resolve(__dirname, '.webpack/renderer/main_window/assets/') 
      },
    ]
  })

然后您可以在没有基本“/”的情况下访问您的文件:

<img src='assets/svgs/logo.svg'></img>

虽然我不确定是什么让它起作用 - 以前资产已经被复制到那里,所以从文件结构的角度来看它是相同的。它必须为 electron-forge 提供对该路径的引用,以便在开发环境中可以从他们的网络服务器访问它。