electron+vue+webview内嵌网页并注入js
vue内嵌网页可以使用iframe实现内嵌网页,但是只能通过postMessage间接通信,在electron环境下,vue可以直接使用webview来内嵌网页,支持 executeJavaScript、postMessage、send 等丰富的通信机制。
使用 webview的优势
性能更佳:独立进程,适合加载复杂网页或 Web App。
更强的 API 控制:支持 executeJavaScript、postMessage、send 等丰富的通信机制。
更强的安全性:启用 contextIsolation、sandbox 等参数可大幅降低攻击面。
使用 iframe的优势
轻量快捷:无需额外配置,简单加载外部网页或静态内容。
兼容性更好:更接近标准 Web 技术,适用于更广泛的项目场景。
注:官方更推荐WebContentsView,webview已经不推荐,但还是能够使用
前端代码 (Vue 3 组件)
import { ref, onMounted } from 'vue'; const url = ref('https://www.baidu.com'); const webviewRef = ref(null); onMounted(() => { if (webviewRef.value) { webviewRef.value.addEventListener('dom-ready', () => { webviewRef.value!.executeJavaScript(` console.log("Injected JavaScript: Hello from Electron!"); document.body.style.backgroundColor = 'lightblue'; `); }); } }); function onDomReady () { console.log('Webview DOM Ready!'); }; .content-layout { width: 100%; background-color: var(--color-background-content); }
主进程 (main.js)
在 Electron 主进程中,需要配置 webview 的权限。
const { app, BrowserWindow } = require('electron'); let mainWindow; app.whenReady().then(() => { mainWindow = new BrowserWindow({ width: 1000, height: 800, webPreferences: { preload: `${__dirname}/preload.js`, // 为 webview 提供安全预加载脚本 webviewTag: true, // 启用 webview 标签 contextIsolation: true, // 提高安全性 enableRemoteModule: false // 禁止远程模块,减少安全风险 } }); // HMR for renderer base on electron-vite cli. // Load the remote URL for development or the local html file for production. if (is.dev && process.env['ELECTRON_RENDERER_URL']) { mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) } else { mainWindow.loadFile(join(__dirname, '../renderer/index.html')) } });
预加载脚本 (preload.js)
预加载脚本用于在 webview 和 主进程 之间安全地通信
const { contextBridge, ipcRenderer } = require('electron'); // 暴露安全 API 给 Webview contextBridge.exposeInMainWorld('electronAPI', { sendMessage: (message) => ipcRenderer.send('message', message) }); // 监听来自主进程的消息 ipcRenderer.on('reply', (event, response) => { console.log('Received from main process:', response); });
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。