放眼全网居然找不到Electron自定义DNS解析的任何文章,问了ChatGP也是在一顿操作猛如虎。索性我今天就和大家分享一下Electron下的域名解析及其原理,把踩过的坑总结一下
hello,各位看官大家好, 今天和大家分享一下在 Electron下的域名解析及原理。 最近项目产品提了一个变态的需求,无感自动切换域名解析IP。通俗点讲就是一个域名多个IP,且多个IP自动切换。
刨根问底
1.--host-rules
--host-rules是 Chrome 浏览器(以及 Electron,因为 Electron 基于 Chromium 构建)的一个命令行选项,用于实现高级的域名规则控制,特别是用于测试和开发目的。通过这个选项,您可以根据域名规则来控制网络请求的行为,包括重定向、阻止、修改请求头等。
优缺点: app.commandLine.appendSwitch('--host-rules',`MAP *{https://192.168.0.1}`),只在主进程中初始化调用一次,官方文档没有说明(建议在测试的时候可用)
2.session.setProxy (可动态切换)
在 Electron 中,session.setProxy 方法的实现原理涉及底层的 Chromium 网络层和 Electron 的网络模块。以下是大致的实现原理:Chromium 基础: Electron 是基于 Chromium 构建的,因此它继承了 Chromium 浏览器的大部分底层功能。Chromium 使用了网络层来处理网络请求和响应。
NetworkService:Chromium 中的网络层被称为 NetworkService,它负责处理网络请求、处理代理和连接管理。session.setProxy 实际上是 Electron 对 Chromium NetworkService 的封装,提供了一个更高级的接口来配置代理。
session.defaultSession.setProxy({
proxyRules: `http=${ip}:80`, // 使用解析得到的 IP 地址作为代理地址
proxyBypassRules: '<-loopback>', // 可选,绕过本地地址
pacScript: 'file:///path/to/proxy.pac'
});
优缺点: 可动态切换ip, 如果是https 需要导入 ca 证书,因为HTTPS请求时,通常会使用HTTPCONNECT方法来建立隧道,以确保端到端的加密连接。
3.代理服务器 (可动态切换)
// 使用前需要安装 yarn add http-proxy
const proxy = httpProxy.createProxyServer({});
const server = https.createServer(function (req:any, res:any) {
proxy.web(req, res, {
target: 'https://192.168.21.16:443',
secure: false
});
});
server.listen(8000, () => {
// main.webContents.session.setProxy({ proxyRules: 'http://localhost:8000'});
console.log('Proxy server listening on port 8080');
});
优缺点: 需要自己导入ca 证书
为了让大家少踩坑,特此总结了以上几种方法。大家感兴趣关注一下,持续为分享踩坑情况,后续有时间可以用Electron 写个代理服务器,可以全局系统代理。