You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为Electron应用设置全局代理以覆盖所有请求?

给Electron应用配置全局代理的完整方案

嘿,这个问题我熟!要让Electron里所有请求(包括那些没给代理选项的npm模块)都走全局代理,得从两个层面入手——Chromium内核的请求和Node.js环境的请求,毕竟Electron是双环境架构。下面给你几种靠谱的方案,按需组合就行:

1. 给Chromium内核设置全局代理(覆盖渲染进程/Chromium发起的请求)

Electron基于Chromium,所以可以通过命令行参数或者session模块来配置Chromium的代理,搞定fetch、XMLHttpRequest、以及用Electron网络API发起的请求。

方法1:用命令行参数(启动时生效,简单直接)

在Electron的app ready事件之前添加命令行参数,这是最直接的方式,适合不需要动态修改代理的场景:

const { app } = require('electron');

// 必须在app ready之前设置,因为命令行参数是启动时加载的
app.on('ready', () => {
  // 设置HTTP/HTTPS代理地址
  app.commandLine.appendSwitch('proxy-server', 'http://your-proxy-host:port');
  
  // 可选:设置不需要代理的地址(比如本地服务、特定域名)
  app.commandLine.appendSwitch('proxy-bypass-list', '<local>;*.your-internal-domain.com');
  
  // 如果代理需要账号密码认证,添加这条
  app.commandLine.appendSwitch('proxy-auth', 'your-username:your-password');
});

注意:<local>是Chromium的内置规则,代表所有本地地址(比如localhost、127.0.0.1)。

方法2:用Session模块(支持动态修改,更灵活)

如果需要在运行时动态调整代理,或者更细粒度控制,用Electron的session模块:

const { app, session } = require('electron');

app.whenReady().then(async () => {
  const defaultSession = session.defaultSession;
  
  // 设置代理规则
  await defaultSession.setProxy({
    proxyRules: 'http://your-proxy-host:port',
    bypassRules: '<local>;*.your-internal-domain.com'
  });

  // 如果代理需要认证,通过webRequest拦截设置头部
  defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
    const auth = Buffer.from('your-username:your-password').toString('base64');
    details.requestHeaders['Proxy-Authorization'] = `Basic ${auth}`;
    callback({ requestHeaders: details.requestHeaders });
  });

  console.log('Chromium代理设置完成');
});

2. 给Node.js环境设置全局代理(覆盖npm模块的请求)

很多npm模块会用Node.js原生的http/https模块发起请求,这时候Chromium的代理设置不会生效,得单独配置Node环境的代理:

方法1:设置环境变量(全局生效,无需修改代码)

你可以在启动Electron的时候提前设置环境变量,或者在主进程代码里直接设置:

// 在主进程最顶部设置,对所有Node.js请求生效
process.env.HTTP_PROXY = 'http://your-proxy-host:port';
process.env.HTTPS_PROXY = 'http://your-proxy-host:port';
process.env.NO_PROXY = 'localhost,127.0.0.1,*.your-internal-domain.com';

注意:环境变量的优先级高,如果你的系统已经设置了代理,这里的设置会覆盖系统的。

方法2:覆盖全局Agent(更灵活,支持自定义配置)

如果需要更精细的控制(比如代理认证、超时设置),可以用https-proxy-agent包覆盖Node.js的全局Agent:
首先安装依赖:

npm install https-proxy-agent

然后在主进程里配置:

const http = require('http');
const https = require('https');
const HttpsProxyAgent = require('https-proxy-agent');

// 创建代理Agent实例
const proxyAgent = new HttpsProxyAgent({
  host: 'your-proxy-host',
  port: 'your-proxy-port',
  auth: 'your-username:your-password' // 可选,需要认证时添加
});

// 覆盖http和https模块的全局Agent
http.globalAgent = proxyAgent;
https.globalAgent = proxyAgent;

这个方法会让所有使用全局Agent的npm模块请求自动走代理,大部分主流模块都会用全局Agent,所以基本能覆盖所有场景。

3. 推荐组合方案

既然你的场景是要覆盖所有请求,建议同时配置Chromium代理+Node.js代理

  • app.commandLine.appendSwitch或者session.setProxy搞定Chromium层面的请求;
  • 用环境变量或者https-proxy-agent搞定Node.js层面的npm模块请求。

这样就能确保不管是渲染进程的请求,还是后台npm模块的请求,都会乖乖走你的全局代理啦!

内容的提问来源于stack exchange,提问作者Johne Doe

火山引擎 最新活动