使用预加载脚本时,如何从Electron的缓存中清除本Map像?

pxyaymoc  于 2022-12-08  发布在  Electron
关注(0)|答案(2)|浏览(284)

**编辑:**虽然我仍然不理解会话和webFrame缓存之间的区别,但可以简单地从预加载脚本中调用webFrame.clearCache()
问题

我有一个电子应用程序,它涉及到重命名和重新排序本地文件系统上的图像。这通常会导致文件交换他们的文件名,这导致缓存问题,直到窗口重新加载才能解决。我无法清除或禁用该高速缓存。

有效的方法(不满意)

  • 从渲染器进程中调用require("electron").webFrame.clearCache();。这不是一个令人满意的解决方案,因为它需要启用nodeIntegration。(主进程可用的WebFrameMain类没有clearCache方法)。
  • 从Chrome DevTools中检查“禁用缓存”。显然这不是生产的解决方案。
    不起作用的方法
  • 清除会话缓存。我注意到会话缓存大小始终为0。
mainWindow.webContents.session.clearCache();
  • 正在清除会话存储数据。
mainWindow.webContents.session.clearStorageData();
  • 将以下命令行开关添加到主进程。
app.commandLine.appendSwitch("disk-cache-size", "0");
app.commandLine.appendSwitch("disable-http-cache");
  • 创建窗口时提供禁用缓存的会话对象。
webPreferences: {
  preload: path.join(__dirname, "preload.js"),
  session: session.fromPartition("example", { cache: false })
}

缓存系统中显然有我不理解的组件。看起来会话缓存和webFrame缓存必须是两个不同的东西,我找不到从主进程或没有nodeIntegration访问后者的方法。
显示此问题的最小项目可在此处找到:https://github.com/jacob-c-bickel/electron-clear-cache-test。单击该按钮将交换两个图像的文件名,但在重新加载窗口之前不会发生任何可见的更改。
我使用的是电子13.1.4和Windows 10 2004。

nbnkbykc

nbnkbykc1#

您可以使用require("electron").webFrame.clearCache();创建一个clearCache函数,并将其附加到preLoad脚本中的windows对象,然后在独立渲染器中使用该函数。
Google“电子预加载”

iezvtpos

iezvtpos2#

是的--webFrame是要 * 在浏览器内部 * 使用的,所以这通常意味着preload.js。然后,您可以使用Electron's Inter-Process Communication(IPC)技术在window对象上全局公开该方法,允许在应用的其他地方使用!
这就像你在应用程序的每一个级别上开辟一条通往正确功能的道路。
总的来说,看起来像这样:
preload.js

import { contextBridge, webFrame } from 'electron';

export const RendererApi = {
  clearCache() {
    webFrame.clearCache()
  },
};

contextBridge.exposeInMainWorld("api", RendererApi);

然后在渲染过程中的任何地方:

window.api.clearCache();

相关问题