electron 电子构建“不允许加载本地资源”,但文件已存在

ogsagwnx  于 2022-12-08  发布在  Electron
关注(0)|答案(1)|浏览(397)

我有一个普通的电子应用程序,带有一个加载文件的BrowserWindow:

win = new BrowserWindow(...);
win.loadURL(url.format({
    pathname: path.resolve(__dirname, 'main.html'),
    protocol: "file:",
    slashes: true
}));

我使用electron-build来打包应用程序。大多数情况下,这个方法都能正常工作。但偶尔当我为Mac和Windows构建应用程序时,BrowserWindow无法加载文件,并在控制台中显示错误:

Not allowed to load local resource: file:///path/to/MyApp.app/Contents/Resources/app.asar/dist/main.html

在开发者工具的“网络”面板中,“状态”下显示为(blocked:other)
但与这里的许多类似问题不同的是,文件存在(在asar存档中)。我可以在打开窗口后立即执行此操作:

console.log(fs.readFileSync(path.resolve(__dirname, 'main.html'), { encoding: 'utf-8' }));

并打印文件的内容。
我可以在asar中看到该文件,路径为:

$ asar list /path/to/MyApp.app/Contents/Resources/app.asar | grep main.html
/dist/main.html

那么为什么它不读取文件呢?我该如何调试呢?
不管怎样,我的代码在myproject/dist中,在myproject/package.json中,我有:

"build": {
    "directories": {
      "output": "out"
    },
    "files": [
      "dist"
    ],
    ...
  }

我现在使用的是最新版本的electron和electron-builder,但我在早期版本中遇到过这个问题。
我尝试使用文件路径而不是URL:

win.loadFile(path.resolve(__dirname, 'main.html'));

但得到了相同的结果。
我也尝试使用"asar": false。我得到了同样的错误,只是在路径中使用“app”而不是“app.asar”。并且路径指向一个有效的可读文件。

bvjxkvbb

bvjxkvbb1#

好的,我知道了。我忘了我是用protocol.interceptFileProtocol拦截file:协议的。我的应用程序名称中有一个空格,所以当我调用callback函数,并且没有用实际的空格替换%20时,它找不到文件。希望这能帮助一些人。

相关问题