我有一个普通的电子应用程序,带有一个加载文件的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”。并且路径指向一个有效的可读文件。
1条答案
按热度按时间bvjxkvbb1#
好的,我知道了。我忘了我是用
protocol.interceptFileProtocol
拦截file:
协议的。我的应用程序名称中有一个空格,所以当我调用callback
函数,并且没有用实际的空格替换%20
时,它找不到文件。希望这能帮助一些人。