当前位置: 首页 > news >正文

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 组件)

<template>
    <div class="content-layout" >     
        <webview ref="webviewRef" :src="url" style="width: 100%; height: 100%;"
        @dom-ready="onDomReady"></webview>
    </div>
</template>

<script lang="ts" setup >

    import { ref, onMounted } from 'vue';

    const url = ref('https://www.baidu.com');

    const webviewRef = ref<Electron.WebviewTag | null>(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!');
    };

</script>

<style scoped>
    .content-layout {
        width: 100%;
        background-color: var(--color-background-content);

    }
</style>

主进程 (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);
});

在这里插入图片描述

相关文章:

  • Android Glide 框架线程管理模块原理的源码级别深入分析
  • 第七次CCF-CSP认证(含C++源码)
  • 微前端最佳实践:Module Federation 的使用步骤详解
  • OmniParser技术分析(一)
  • c++ constraints与concepts使用笔记
  • 搜广推校招面经四十三
  • 使用 React 和 Ant Design 处理 Excel 和 CSV 文件
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(27)混元幡遮天机 - 第一个错误版本(二分边界)
  • Java 学习记录:基础到进阶之路(一)
  • 如何实现pinia的持久化存储
  • 前端项目 Node.js 与 node-sass 版本兼容问题
  • Linux rpcbind漏洞
  • FlinkCDC3.3 使用 Mysql 8.4 报错
  • C# 委托中 Invoke/BeginInvoke/EndInvoke和DynamicInvoke 方法
  • 机器学习中的梯度下降是什么意思?
  • 数据结构 -并查集
  • makefile详解
  • SpringBoot加载配置文件的优先级
  • Windows编程----结束进程
  • echarts使用记录
  • 准85后青海海北州副州长、州公安局局长李贤荣挂职临沂市副市长
  • 比黄油年糕热量还高,这个火爆全网的甜品劝你慎吃
  • 莫名的硝烟|“我们最好记住1931年9月18日这个日子”
  • 山西太原小区爆炸事故已造成17人受伤
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM
  • 绿地控股:今年一季度营业收入356亿元,中高层管理人员带头降薪