Electron 跨域问题
用于记录内容,方便查询。
记录在开发时遇到的跨域问题
什么是跨域
详细可以看 跨域配置。
在 Electron 开发中为什么会遇到跨域问题?
使用 Electron 打开页面时,显示形式有两种:访问本地文件和开启本地服务,下面列出两种方式的优缺点。
访问本地文件
javascript
// 伪代码
const pageUrl = new URL('../renderer/dist/index.html', 'file://' + __dirname).toString();
browserWindow.loadURL(pageUrl);
直接打开本地文件,这时候浏览器的 URL 就是:file:///xxxx/renderer/dist/index.html
这种格式,相当于我们在 chrome 浏览器打开本地 .html
文件。
优点:
- 直接打开本地文件,无需其他操作
- 速度快
缺点:
- 无法使用 Cookie,原因请看 跨域配置.html#本地文件如何设置-cookie
- 需要解决请求跨域的问题
开启本地服务
javascript
// 伪代码
import Koa from 'koa';
import serve from 'koa-static';
const app = new Koa();
app.use(serve(join(__dirname, '../../')));
app.listen(13333,()=>{
console.log('启动成功');
});
await browserWindow.loadURL('http://localhost:13333/renderer/dist/index.html');
使用 NodeJS
开启一个本地服务。
优点:
- 可以使用 cookie
- 可以解决 http 跨域请求的问题,通过配置
NodeJS
的代理服务
缺点:
- 需要占用一个端口
- 相比直接访问本地文件,需要更多的内存开销
如何解决跨域
在不让业务端添加跨域头的情况下,解决跨域问题
通过主进程代理
在渲染进程发起一个请求:
javascript
axios('https://ddd.com/fe/test')
这时候浏览器会报跨域问题,但我们使用 NodeJS
开启服务进行访问的,可以进行代理操作。
渲染进程的请求代码改为:
javascript
aixos('/fe/test') // 请求当前域名下的 /fe/test 接口
主进程:
javascript
// 伪代码
import Koa from 'koa';
import createProxyMiddleware from 'koa-proxies';
const app = new Koa();
const middle = createProxyMiddleware('/fe/test', { target: 'https://ddd.com', changeOrigin: true });
app.use(middle);
然后在主进程进行一个代理操作,简单来说,请求的流程变成这样:
通过主进程的代理操作,解决跨域问题。同样 cookie 也是可以这样处理。
关闭安全模式
通过设置 webPreferences.webSecurity: false
关闭安全模式,可以允许网页进行跨域请求,并且服务端的 API 无需设置跨域头。
javascript
// 伪代码
new BrowserWindow({
webPreferences: {
webSecurity: false,
},
});
但这种设置,electron
官方文档不支持在生产模式使用:
禁用
webSecurity
将会禁止同源策略并且将allowRunningInsecureContent
属性置true
。 换句话说,这将使得来自其他站点的非安全代码被执行。