在Electron中最快速预加载脚本
背景
在Electron打开新窗口的时候,提前加载一段JavaScript脚本,以此内置一些属性或接口给被打开的页面。之所以要以注入方式,而不是页面自己引用,原因是不想麻烦页面自行引用,不想修改旧有的业务逻辑。
方法一
一开始是想在打开BrowserWindow后,执行executeJavaScript方法来给相应的窗口注入脚本。
不过这个方法虽然可以在相应的窗口注入脚本,但是它的执行的顺序太后,无法在页面加载时加载到,就导致了如果页面的在加载时使用了注入接口,就会有调用不到问题。
所以这个方法不可行。
PS:executeJavaScript方法,https://electronjs.org/docs/api/web-contents
方法二
后来我在new BrowserWindow([options])方法,也就是新建窗口的方法找到了一个preload参数。
const { BrowserWindow } = require('electron') const path = require('path') const renderProcessApi = path.join(__dirname, './inject.js') let win = new BrowserWindow({ webPreferences: { preload: renderProcessApi } })
这个脚本文件,会在页面加载资源前就加载执行,保证了页面无论是在什么地方、什么时候调用注入接口都能调用到。
特别注意
如果窗口是在主进程创建的,估计有人就会发现注入的脚本文件会在主进程和对应的渲染进程各执行了一遍(我也不清楚为什么会有这样的效果)。
这时有可能会导致打开窗口失败,因为注入脚本中使用的对象或方法是主进程没有的,例如window对象。
解决办法是得判断脚本是在渲染进程时,才执行脚本内容。
inject.js文件:
if (require('electron').remote) { window.hello = function(){ console.log(‘world') } }
可以通过require('electron').remote,来判断是否在渲染进程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2014-07-09 Mysql一些复杂的语句