Я просто потратил несколько часов, разбираясь с этим. Судя по некоторым темам, которые я видел на Stack Overflow, я не единственный, у кого есть эта проблема. Некоторые из ответов привели меня в нужное место, чтобы решить эту проблему, но ни один из ответов не был полным — по крайней мере, в версии 22 Электрона.

В нескольких решениях упоминался протокол, но ни одно из них не сработало для меня в том виде, в каком они были представлены.

Оказывается, решением является этопротокол, а не просто одна функция протокола. Он включает в себя protocol.registerSchemesAsPrivilegedиprotocol.registerFileProtocol.

registerSchemesAsPrivileged должен предшествовать событию ready для приложения, а registerFileProtocol должен вызываться после срабатывания события ready.

Итак, без лишних слов, вот мой функциональный код. Он находится в файле main.js (или его эквиваленте), который вызывается из свойства main в вашем файле package.js.

const protocolName = "my-scheme-name";
protocol.registerSchemesAsPrivileged([
  { scheme: protocolName, privileges: { bypassCSP: true } },
]);

app.whenReady().then(() => {
  protocol.registerFileProtocol(protocolName, (request, callback) => {
    const url = request.url.replace(`${protocolName}://`, "");
    try {
      return callback(decodeURIComponent(url));
    } catch (error) {
      // Handle the error as needed
      console.error(error);
    }
  });

...

});

my-scheme-name может быть любым.

Теперь вы можете использовать эту привилегированную схему в процессе визуализации следующим образом:

<img src="my-scheme-name:///user/name/desktop/image-file.jpeg" />

Он должен отобразить ваш локальный файл ресурсов, как и ожидалось, потому что my-scheme-name теперь является привилегированным и обходит политику безопасности контента.