如何为基于Electron的Windows/macOS桌面应用构建预装私有扩展的自定义Chromium浏览器
解决方案:Electron应用预装私有Chromium扩展
我之前折腾过类似的需求,给你几个亲测有效的方案,完全适配新版Electron和Chromium,不需要依赖Chrome商店:
方案一:用Electron Session API直接加载本地扩展(最推荐)
这是最简单且不需要编译源码的方法,Electron原生支持加载本地扩展,不管是不是商店里的。
操作步骤:
- 准备好你的扩展目录:可以是开发阶段的未打包扩展文件夹,或者把CRX文件解压后的目录(确保
manifest.json在根目录) - 在Electron主进程中,针对目标窗口的Session加载扩展:
- 如果要给所有窗口预装,用默认Session:
const { app, session } = require('electron'); const path = require('path'); app.whenReady().then(async () => { try { // 加载本地扩展,替换为你的扩展路径 const extensionInfo = await session.defaultSession.loadExtension( path.join(__dirname, '../extensions/my-private-extension') ); console.log(`扩展已加载:${extensionInfo.name}`); } catch (err) { console.error('加载扩展失败:', err); } }); - 如果要给特定窗口单独加载,创建自定义Session:
const { BrowserWindow, session } = require('electron'); const customSession = session.fromPartition('my-custom-session'); // 先加载扩展,再创建窗口 customSession.loadExtension('/path/to/extension').then(() => { const win = new BrowserWindow({ webPreferences: { session: customSession } }); });
- 如果要给所有窗口预装,用默认Session:
注意事项:
- 确保你的扩展Manifest版本和Electron对应的Chromium版本兼容(比如Electron 28+支持Manifest V3)
- 打包应用时,要把扩展目录包含到应用资源中,用相对路径避免路径问题
方案二:修改Electron源码,把扩展内置为“预装”扩展(深度定制)
如果你需要像官方预装扩展那样,用户无法轻易卸载,可以修改Electron源码后重新编译,把私有扩展打包进Electron二进制里。
操作步骤:
- 克隆Electron源码到本地,切换到你使用的Electron版本分支
- 把你的扩展打包成CRX文件(可以用Chrome开发者工具打包,或者第三方工具)
- 在Electron源码中找到扩展预装配置:
- 打开
chrome/common/extensions/extension_constants.h,添加你的扩展ID到kPreinstalledExtensions数组 - 把CRX文件放到
chrome/common/extensions/preinstalled目录下
- 打开
- 按照Electron官方编译文档重新编译Electron
- 在你的应用中使用编译后的自定义Electron版本
注意事项:
- 编译Electron需要配置好编译环境(比如Windows需要VS,macOS需要Xcode),过程比较耗时
- 升级Electron版本时需要重新修改源码编译
方案三:用Chromium命令行参数加载扩展(快速验证)
如果只是快速测试或者简单场景,可以在启动BrowserWindow时添加--load-extension参数:
const { BrowserWindow } = require('electron'); const path = require('path'); const win = new BrowserWindow({ webPreferences: { additionalArguments: [ `--load-extension=${path.join(__dirname, '../extensions/my-extension')}` ] } });
注意事项:
- 这个方法的扩展性不如Session API,且用户如果能修改启动参数可能会绕过,但适合快速验证需求
内容的提问来源于stack exchange,提问作者BrnKhn
相关产品推荐
相关产品推荐

