【发布时间】:2020-07-05 10:54:35
【问题描述】:
我无法始终如一地在 Electron 中加载图像。我正在使用 Electron Forge 和 webpack 模板 https://www.electronforge.io/templates/webpack-template
我的 src 目录如下所示:
├── images
│ └── black.png
├── index.css
├── index.html
├── index.js
├── main.js
└── renderer.js
我的 HTML 代码如下所示:
<img src="images/black.png">
我正在使用copy-webpack-plugin 复制images 目录。
在开发中运行时 (npm run start),开发服务器的根目录是 .webpack/renderer,因此图像会加载。在生产环境 (npm run package) 中运行时,HTML 文件正在从文件系统打开,因此图像标签试图访问 .webpack/renderer/main_window/images,这是错误的位置并且它不会加载。
我已经通过以下方式让它在开发和生产中工作:
<img src="../images/black.png">
这是一种 hacky 方式,并且与文件存储在 src 目录中的方式不正确。这应该很简单,但我花了好几个小时试图弄清楚,但还没有真正的解决方案。
我已经在这些链接中看到了一个解决方案,但是如果不将“../”放在路径前面,我无法让它在开发和生产中工作。
https://github.com/electron-userland/electron-forge/issues/1196
https://github.com/electron-userland/electron-forge/issues/941
我能想出几个办法来解决这个问题:
- webpack 配置需要通过某种环境变量或标志知道它是在开发还是生产中运行,并更改 copy-webpack-plugin 的“to”路径。
- 将开发服务器更改为运行,使其根为
.webpack/renderer/main_window
我看到了将图像导入renderer.js 的建议,但我有几千张图像。我应该这样做吗?
import './images/1.png';
import './images/2.png';
import './images/3.png';
// ...
import './images/1000.png';
有没有办法以编程方式导入?比如:
let imageMap = {};
for (let i of Iter.range(1, 1001)) {
let image = import(`./images/${i}.png`);
imageMap[i] = image;
}
那我该如何在 HTML 中引用它呢?不用DOM编辑代码也能做到吗?
我不想将我的图像导入我的 JavaScript 文件并通过 webpack 加载器运行它们。我只想以一种在开发和生产中都可以使用的方式从我的 HTML 代码中引用静态文件。
我还有一个 5MB 的 JSON 文件,我需要使用 fetch() 访问它。我尝试通过加载器导入它,但构建过程花费了 5 分钟以上,我将其杀死。
加载静态文件是制作网页的基本部分,应该是项目模板的一部分,除非我遗漏了一些非常明显的东西。
【问题讨论】:
-
我遇到了类似的问题......并且刚刚放弃了 webpack。这解决了很多问题,就我而言,我不需要其中的 webpack 部分。只会引起问题。对于前端,可能会使用 React 或 Angular 等单页技术,然后根据他们的平台工具对它们进行 webpack。 Webpack + Node.js 似乎总是解决难以解决的大问题。
-
Webpack 不是问题的原因。之所以会出现这个问题,是因为制作 electron forge 的人在开发模式下设置了 webpack 开发服务器,而在生产模式下根本没有服务器,只有静态文件。 electron forge 本身提供的配置是错误的。