Electron - 不允许加载本地资源
Electron - Not allowed to load local resource
晚上,
我正在考虑使用 electron 来打包现有的 angular2 版本。我以为我有一个干燥的 运行 工作,但实际的包装似乎失败了(见下面的最后一步),我想知道为什么。这就是我正在做的...
创建项目
使用angular-cli开始一个新项目ng new electron-ng2-cli --style=scss
安装电子和electron-builder
编辑package.json
进行以下添加...
"main": "main.js"
"build":
{
"appId": "com.electrontest.testapp",
"mac": {
"category": "your.app.category.type"
}
}
并将以下内容添加到 scripts
...
"pack": "build --dir",
"dist": "build",
"electron": "electron main.js",
"postinstall": "install-app-deps"
创建main.js
我刚刚从electron quick start复制了代码。我所做的唯一更改是将 index.html
的位置设置为 /dist/index.html
修改基础
在index.html
中将<base="/">
改为<base="./">
包码
运行ng build
。这会将所有打包代码放入 /dist
测试运行
运行npm run electron
。这很好用。一个 Electron 应用程序启动了,我在其中看到 angular 内容 运行ning。
创建用于分发的应用程序
运行 npm run pack
创建打包的应用程序。包装似乎没问题 - 我收到有关缺少图标的警告和我的代码未签名的警告,但我猜它们不应该是致命的?
问题是,当我现在 运行 通过双击 Finder
应用程序时,我在控制台中收到一条错误消息:Not allowed to load local resource: file:///Users/<username>/Documents/development/electron-ng2-cli/dist/mac/electron-ng2-cli.app/Contents/Resources/app.asar/dist/index.html
那么,谁能解释一下失败的打包应用程序和我使用 npm run electron
时 运行 正常的应用程序之间的区别?
如何解决此问题并正确获取应用 运行ning?
感谢您坚持到最后。这比我想要的要长,但我希望我能解释清楚。如果您能提供帮助或提供任何建议,那就太好了 - 在您的总体方向上会想到很多好的共鸣:)
大家干杯
经过多次试验和错误,但我成功了。这里有很多我不完全理解的东西,很多东西可能是毫无意义的或不好的做法,它们可能会在下一步中全部失败,但如果像我一样,你只是想克服第一个障碍,那么也许我找到的东西会对你有所帮助。
我通过 electron-builder
生成的 app.asar
文件发现了问题。它没有包含我的 dist
文件夹中的捆绑代码,而是包含所有项目代码(*.ts *.scss
等)。问题只是打包功能打包了错误的东西。
将正确的源代码放入最终应用程序的步骤很简单,但我的天哪,他们没有半途而废!从我在最初的问题中离开的地方开始,我做了以下...
记住我的项目结构是默认的angular-cli
设置的
Electron 特定文件
我将 main.js
向下移动到 src
并将其名称更改为 electron-main.js
只是为了停止与已经存在的 main.ts
混淆。我还将它引用的路径改回 /index.html
。
接下来我也在 src
中创建了一个新的应用程序级别 package.json
并为其提供了以下内容:
{
"name": "application-name",
"description": "CLI app",
"author": "Me me me",
"version": "0.0.1",
"main": "electron-main.js"
}
angular-cli.json
我把outDir
改成了build
纯粹是因为electron好像默认输出到 dist
,我想在这个阶段进行一些分离。然后我将 package.json
和 electron-main.js
添加到 assets
数组。
Main package.json
我删除了 "main":"main.js"
,因为这里显然不再需要它。在 scripts
中,我将测试命令更改为 electron build
以将其指向捆绑代码所在的构建文件夹。
最后,我转到 build
字段并添加以下内容:
"directories": {
"buildResources": "build",
"app": "build"
}
现在看起来很明显了。这只是告诉编译器在哪里寻找将构成最终应用程序的资产。它默认为工作目录,这是我的问题。
使用此设置,我现在可以 运行 ng build
将我的项目与 electron-main.js
和 package.json
一起捆绑到 build
文件夹中。
完成后我可以 运行 npm run electron
快速启动测试应用程序或 npm run pack
构建可从 Finder
.
启动的应用程序
繁荣。任务完成。十分钟后我会带着另一个烦人的问题回到这里。这些天我爱上了开发者:)
我遇到了同样的问题。这对我有用
// and load the index.html of the app.
window.loadURL(url.format({
pathname: path.join(__dirname, 'dist/index.html'), // important
protocol: 'file:',
slashes: true,
// baseUrl: 'dist'
}));
只需更改 BrowserWindow 的选项:
new BrowserWindow({
webPreferences: {
webSecurity: false
}
})
如果 window 的 url 指向远程资源,例如 http://...,浏览器将不允许加载本地资源,除非您设置上面的选项。
问题可能是main.js
中的路径无效,如有必要请更正
万一这对任何人都有帮助,我遇到的问题是我使用 process.cwd():
设置了路径
win.loadURL(`file://${process.cwd()}/dist/index.html`);
打包时不正确,因为 main.js 文件不再位于根目录中。更改为 __dirname:
win.loadURL(`file://${__dirname}/dist/index.html`);
为我解决了这个问题。
我有同样的问题,我的错误是 win.loadURL
不正确(loadURL 试图加载一个不存在的文件)。
确保你的 url 是正确的,否则你会得到一个错误。
这适用于我 linux
newWindow.loadFile(`${__dirname}/index.html`);
您可以添加它以查看您的 main.js 的目录,并从那里导航到 index.html。
console.log(__dirname)
您只是在这里漏了一个 '.'
。你只需要放相对路径而不是绝对路径。
win.loadFile('./dist/index.html');
当我尝试使用 electron-builder...
构建我的应用程序时,我遇到了确切的问题
对我有用的是
在 package.json 文件中我用 ng build 构建然后运行 electron-builder
"scripts": {
...
"build-installer": "ng build --prod && electron-builder"
},
并在 index.html 中将 base href 更改为
<base href="">
By Changing "private": true, to "private": false in pakage.json. works for me good luck.
{
"name": "dashboard",
"version": "0.0.0",
"main": "main.js",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"electron": "ng build && electron .",
"pack":"electron-packager ."
},
"private": false,
"dependencies": {
"@angular/animations": "~10.2.0",
"@angular/cdk": "^8.2.3",
"@angular/common": "~10.2.0",
"@angular/compiler": "~10.2.0",
"@angular/core": "~10.2.0",
"@angular/flex-layout": "^9.0.0-beta.29",
"@angular/forms": "~10.2.0",
"@angular/material": "^8.2.3",
"@angular/platform-browser": "~10.2.0",
"@angular/platform-browser-dynamic": "~10.2.0",
"@angular/router": "~10.2.0",
"hammerjs": "^2.0.8",
"highcharts": "^7.2.2",
"highcharts-angular": "^2.4.0",
"rxjs": "~6.6.3",
"tslib": "^1.14.1",
"zone.js": "~0.10.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "^0.1002.0",
"@angular/cli": "^10.2.0",
"@angular/compiler-cli": "~10.2.0",
"@angular/language-service": "~10.2.0",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "^5.0.0",
"electron": "^10.1.5",
"electron-packager": "^15.1.0",
"jasmine-core": "~3.4.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "^5.2.3",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.0",
"protractor": "^7.0.0",
"ts-node": "~7.0.0",
"tslint": "~5.15.0",
"typescript": "~4.0.5"
}
}
我有同样的问题,我通过寻找路径解决了它。
例如我的错误信息是
file:///C:/Users/username/Desktop/fetni%20mohamed/electron/app/elctronapp/dist/electron-app/index.html
在 dist 文件夹中,我找到了一个名为 electronapp 的文件夹,但在路径中它是 electron-app,因此通过更改文件夹名称它起作用了。
您可以更改 angular.json 中的输出路径,并指定与错误中显示的路径相同的名称
当index.html不存在时也可以抛出。
在我的例子中,我的构建文件夹“dist”被 electron-builder 忽略并且没有正确打包到 /app 中。
我目前 运行 Angular12+,这个简单的解决方案对我有用:
"build": {
//config
"directories": {"output": "release/"},
//more config
}
至此,带有安装程序的打包应用程序现在已在 release/ 文件夹中创建,现在我可以安装它了。 dist/ 文件夹保留,因为那是 Angular 构建应用程序的地方。
晚上,
我正在考虑使用 electron 来打包现有的 angular2 版本。我以为我有一个干燥的 运行 工作,但实际的包装似乎失败了(见下面的最后一步),我想知道为什么。这就是我正在做的...
创建项目
使用angular-cli开始一个新项目ng new electron-ng2-cli --style=scss
安装电子和electron-builder
编辑package.json
进行以下添加...
"main": "main.js"
"build":
{
"appId": "com.electrontest.testapp",
"mac": {
"category": "your.app.category.type"
}
}
并将以下内容添加到 scripts
...
"pack": "build --dir",
"dist": "build",
"electron": "electron main.js",
"postinstall": "install-app-deps"
创建main.js
我刚刚从electron quick start复制了代码。我所做的唯一更改是将 index.html
的位置设置为 /dist/index.html
修改基础
在index.html
中将<base="/">
改为<base="./">
包码
运行ng build
。这会将所有打包代码放入 /dist
测试运行
运行npm run electron
。这很好用。一个 Electron 应用程序启动了,我在其中看到 angular 内容 运行ning。
创建用于分发的应用程序
运行 npm run pack
创建打包的应用程序。包装似乎没问题 - 我收到有关缺少图标的警告和我的代码未签名的警告,但我猜它们不应该是致命的?
问题是,当我现在 运行 通过双击 Finder
应用程序时,我在控制台中收到一条错误消息:Not allowed to load local resource: file:///Users/<username>/Documents/development/electron-ng2-cli/dist/mac/electron-ng2-cli.app/Contents/Resources/app.asar/dist/index.html
那么,谁能解释一下失败的打包应用程序和我使用
npm run electron
时 运行 正常的应用程序之间的区别?
如何解决此问题并正确获取应用 运行ning?
感谢您坚持到最后。这比我想要的要长,但我希望我能解释清楚。如果您能提供帮助或提供任何建议,那就太好了 - 在您的总体方向上会想到很多好的共鸣:)
大家干杯
经过多次试验和错误,但我成功了。这里有很多我不完全理解的东西,很多东西可能是毫无意义的或不好的做法,它们可能会在下一步中全部失败,但如果像我一样,你只是想克服第一个障碍,那么也许我找到的东西会对你有所帮助。
我通过 electron-builder
生成的 app.asar
文件发现了问题。它没有包含我的 dist
文件夹中的捆绑代码,而是包含所有项目代码(*.ts *.scss
等)。问题只是打包功能打包了错误的东西。
将正确的源代码放入最终应用程序的步骤很简单,但我的天哪,他们没有半途而废!从我在最初的问题中离开的地方开始,我做了以下...
记住我的项目结构是默认的angular-cli
设置的Electron 特定文件
我将 main.js
向下移动到 src
并将其名称更改为 electron-main.js
只是为了停止与已经存在的 main.ts
混淆。我还将它引用的路径改回 /index.html
。
接下来我也在 src
中创建了一个新的应用程序级别 package.json
并为其提供了以下内容:
{
"name": "application-name",
"description": "CLI app",
"author": "Me me me",
"version": "0.0.1",
"main": "electron-main.js"
}
angular-cli.json
我把outDir
改成了build
纯粹是因为electron好像默认输出到 dist
,我想在这个阶段进行一些分离。然后我将 package.json
和 electron-main.js
添加到 assets
数组。
Main package.json
我删除了 "main":"main.js"
,因为这里显然不再需要它。在 scripts
中,我将测试命令更改为 electron build
以将其指向捆绑代码所在的构建文件夹。
最后,我转到 build
字段并添加以下内容:
"directories": {
"buildResources": "build",
"app": "build"
}
现在看起来很明显了。这只是告诉编译器在哪里寻找将构成最终应用程序的资产。它默认为工作目录,这是我的问题。
使用此设置,我现在可以 运行 ng build
将我的项目与 electron-main.js
和 package.json
一起捆绑到 build
文件夹中。
完成后我可以 运行 npm run electron
快速启动测试应用程序或 npm run pack
构建可从 Finder
.
繁荣。任务完成。十分钟后我会带着另一个烦人的问题回到这里。这些天我爱上了开发者:)
我遇到了同样的问题。这对我有用
// and load the index.html of the app.
window.loadURL(url.format({
pathname: path.join(__dirname, 'dist/index.html'), // important
protocol: 'file:',
slashes: true,
// baseUrl: 'dist'
}));
只需更改 BrowserWindow 的选项:
new BrowserWindow({
webPreferences: {
webSecurity: false
}
})
如果 window 的 url 指向远程资源,例如 http://...,浏览器将不允许加载本地资源,除非您设置上面的选项。
问题可能是main.js
中的路径无效,如有必要请更正
万一这对任何人都有帮助,我遇到的问题是我使用 process.cwd():
设置了路径win.loadURL(`file://${process.cwd()}/dist/index.html`);
打包时不正确,因为 main.js 文件不再位于根目录中。更改为 __dirname:
win.loadURL(`file://${__dirname}/dist/index.html`);
为我解决了这个问题。
我有同样的问题,我的错误是 win.loadURL
不正确(loadURL 试图加载一个不存在的文件)。
确保你的 url 是正确的,否则你会得到一个错误。
这适用于我 linux
newWindow.loadFile(`${__dirname}/index.html`);
您可以添加它以查看您的 main.js 的目录,并从那里导航到 index.html。
console.log(__dirname)
您只是在这里漏了一个 '.'
。你只需要放相对路径而不是绝对路径。
win.loadFile('./dist/index.html');
当我尝试使用 electron-builder...
构建我的应用程序时,我遇到了确切的问题对我有用的是 在 package.json 文件中我用 ng build 构建然后运行 electron-builder
"scripts": {
...
"build-installer": "ng build --prod && electron-builder"
},
并在 index.html 中将 base href 更改为
<base href="">
By Changing "private": true, to "private": false in pakage.json. works for me good luck.
{
"name": "dashboard",
"version": "0.0.0",
"main": "main.js",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"electron": "ng build && electron .",
"pack":"electron-packager ."
},
"private": false,
"dependencies": {
"@angular/animations": "~10.2.0",
"@angular/cdk": "^8.2.3",
"@angular/common": "~10.2.0",
"@angular/compiler": "~10.2.0",
"@angular/core": "~10.2.0",
"@angular/flex-layout": "^9.0.0-beta.29",
"@angular/forms": "~10.2.0",
"@angular/material": "^8.2.3",
"@angular/platform-browser": "~10.2.0",
"@angular/platform-browser-dynamic": "~10.2.0",
"@angular/router": "~10.2.0",
"hammerjs": "^2.0.8",
"highcharts": "^7.2.2",
"highcharts-angular": "^2.4.0",
"rxjs": "~6.6.3",
"tslib": "^1.14.1",
"zone.js": "~0.10.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "^0.1002.0",
"@angular/cli": "^10.2.0",
"@angular/compiler-cli": "~10.2.0",
"@angular/language-service": "~10.2.0",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "^5.0.0",
"electron": "^10.1.5",
"electron-packager": "^15.1.0",
"jasmine-core": "~3.4.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "^5.2.3",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.0",
"protractor": "^7.0.0",
"ts-node": "~7.0.0",
"tslint": "~5.15.0",
"typescript": "~4.0.5"
}
}
我有同样的问题,我通过寻找路径解决了它。
例如我的错误信息是
file:///C:/Users/username/Desktop/fetni%20mohamed/electron/app/elctronapp/dist/electron-app/index.html
在 dist 文件夹中,我找到了一个名为 electronapp 的文件夹,但在路径中它是 electron-app,因此通过更改文件夹名称它起作用了。
您可以更改 angular.json 中的输出路径,并指定与错误中显示的路径相同的名称
当index.html不存在时也可以抛出。
在我的例子中,我的构建文件夹“dist”被 electron-builder 忽略并且没有正确打包到 /app 中。
我目前 运行 Angular12+,这个简单的解决方案对我有用:
"build": {
//config
"directories": {"output": "release/"},
//more config
}
至此,带有安装程序的打包应用程序现在已在 release/ 文件夹中创建,现在我可以安装它了。 dist/ 文件夹保留,因为那是 Angular 构建应用程序的地方。