03_Electron 主进程和渲染进程、点击(拖放)打开文件功能

news2024/12/28 5:47:38

Electron 主进程和渲染进程

  • 一、Electron 主进程和渲染进程
  • 二、Electron 主进程和渲染进程中使用 Nodejs 以及 Nodejs 第三方模块
    • 2.1、主进程中使用 Nodejs 模块
    • 2.2、渲染进程中 使用 Nodejs 模块
    • 2.3、BrowserWindow 中通过 preload加载的js 文件可以直接使用nodejs 模块
    • 2.4、渲染进程中直接使用 Nodejs 模块
    • 2.5 打开调试模式
    • 2.6、点击按钮展示 文件内容
  • 三、Electron 调用 h5 的拖放 api 结合 Nodejs fs 模块实现拖放打开文件功能
    • 1、H5 的拖放 api
    • 2、实现效果
    • 3、完整代码

一、Electron 主进程和渲染进程

主进程和渲染器进程
package.json 中定义的入口被称为 主进程。在主进程 中实例化 BrowserWindow 创建的 Web 页面被称为渲染进程,一个 Electron 应用只有一个主进程,但是可以有多个渲染进程,每个 Electron 中的 web 页面运行在它自己的渲染进程中
主进程使用 BrowserWindow 实例创建页面。每个 BrowserWindow 实例都在自己的渲染进程里运行页面。当一个 BrowserWindow 实例被销毁后,相应的渲染进程也会被终止。

进程(了解): 进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的调度的基本单位,是操作系统结构的基础。
线程(了解):在一个程序里的一个执行路线就叫做 线程(thread)。更准确的定义是:线程是 “一个进程内部的控制序列”。
线程和进程(了解):一个程序至少有一个进程,一个进程至少有一个线程。

我们 electron 启动以后就能够在 任务管理器中查看到主进程
在这里插入图片描述
创建另外一个 second.html 渲染进程,在 main.js 的 createWindow 中添加代码:

const createWindow = ()=>{
	const mainWindow = new BrowserWindow({
		width:800,
		height:600
	})
  // __dirname 表示获取我们当前目录, path.join 会将两个参数合并成 d://electrondemo/index.html
	mainWindow.loadFile(path.join(__dirname, 'index.html'))
  const secondWindow = new BrowserWindow({
		width:800,
		height:600,
    parent: mainWindow
	})
  // __dirname 表示获取我们当前目录, path.join 会将两个参数合并成 d://electrondemo/index.html
	secondWindow.loadFile(path.join(__dirname, 'second.html'))
}

运行结果如下
在这里插入图片描述

二、Electron 主进程和渲染进程中使用 Nodejs 以及 Nodejs 第三方模块

2.1、主进程中使用 Nodejs 模块

Electron 主进程中无需任何配置就可以使用 nodejs 模块。
在这里插入图片描述

2.2、渲染进程中 使用 Nodejs 模块

1、BrowserWindow 中通过 preload 加载 js 文件可以直接使用 nodejs 模块
2、如果不使用 preload 加载的 js ,Electron5.x 之后没法在渲染进程中直接使用 nodejs,

2.3、BrowserWindow 中通过 preload加载的js 文件可以直接使用nodejs 模块

在页面运行其他脚本之前预先加载指定的脚本, 无论页面是否集成 Node,此脚本都可以访问 所有 Node API 脚本路径为文件的绝对路径
main.js 主进程 代码:

const createWindow = ()=>{
	const mainWindow = new BrowserWindow({
		width:800,
		height:600,
    webPreferences: {
      preload: path.join(__dirname, 'render/preload.js')
    }
	})
  // __dirname 表示获取我们当前目录, path.join 会将两个参数合并成 d://electrondemo/index.html
	mainWindow.loadFile(path.join(__dirname, 'index.html'))
  fs.readFile("package.json",(err, data)=>{
    if(err) {
      console.log(err);
      return
    }else {
      console.log(data.toString())
    }
  })

}

2.4、渲染进程中直接使用 Nodejs 模块

如果不使用 preload 加载的 js ,Electron5.x 之后没法再渲染进程中直接使用 nodejs,如果我们想要再渲染进程中使用 nodejs 的话需要进行如下配置:
https://www.electronjs.org/docs/api/browser-window

const mainWindow = new BrowserWindow({
	width:800,
	height:600,
    webPreferences: {
     nodeIntegration: true,
     contextIsolation: false
   }
})

主进程:
在这里插入图片描述

2.5 打开调试模式

不需要手动点击下面的选项就可以直接展示 调试窗口
在这里插入图片描述

const createWindow = ()=>{
	const mainWindow = new BrowserWindow({
		width:800,
		height:600,
	    webPreferences: {
	      nodeIntegration: true,
	      contextIsolation: false
	    }
	})
  // __dirname 表示获取我们当前目录, path.join 会将两个参数合并成 d://electrondemo/index.html
	mainWindow.loadFile(path.join(__dirname, 'index.html'))
  // 打开调试模式
  mainWindow.webContents.openDevTools()
}

2.6、点击按钮展示 文件内容

目录结构:
在这里插入图片描述

preload.js 代码:

const fs = require('fs')
window.onload=()=>{
  let openFileDom = document.getElementById("btnFile")
  let contentDom = document.getElementById("content")
  openFileDom.onclick = ()=>{
    fs.readFile("package.json",(err, data)=>{
      if(err) {
        console.log(err);
        return
      }else {
        console.log(data.toString())
        contentDom.innerHTML = data.toString()
      }
    })

  }
}

在这里插入图片描述

index.html 代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #content {
        width: 300px;
        height: 300px;
        border: 1px solid red;
      }
    </style>
  </head>
  <body>
    <h1>这是一个 electron 的项目</h1>
    <button id="btnFile">打开</button>
    <div id="content"></div>
  </body>
  <script src="render/preload.js"></script>
</html>

三、Electron 调用 h5 的拖放 api 结合 Nodejs fs 模块实现拖放打开文件功能

1、H5 的拖放 api

https://www.w3cschool.cn/jsref/event-ondragover.html

ondragover 事件在可拖动元素或选取的文本正在拖动到放置目标时触发。
默认情况下,数据/元素不能放置到其他元素中。 如果要实现改功能,我们需要防止元素的默认处理方法。我们可以通过调用 event.preventDefault() 方法来实现 ondragover 事件

注意: 为了让元素可拖动,需要使用 HTML5draggable 属性。

提示: 链接和图片默认是可拖动的,不需要 draggable 属性。

在拖放的过程中会触发以下事件:

在拖动目标上触发事件 (源元素):
ondragstart - 用户开始拖动元素时触发
ondrag - 元素正在拖动时触发
ondragend - 用户完成元素拖动后触发

释放目标时触发的事件:
ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件
ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件
ondrop - 在一个拖动过程中,释放鼠标键时触发此事件
注意: 在拖动元素时,每隔 350 毫秒会触发 ondragover 事件。

2、实现效果

在这里插入图片描述

3、完整代码

目录结构:
在这里插入图片描述

main.js 中的代码:

const {app, BrowserWindow} = require('electron')
const path = require('path')

const createWindow = ()=>{
	const mainWindow = new BrowserWindow({
		width:800,
		height:600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
	})
  // __dirname 表示获取我们当前目录, path.join 会将两个参数合并成 d://electrondemo/index.html
	mainWindow.loadFile(path.join(__dirname, 'index.html'))
  // 打开调试模式
  mainWindow.webContents.openDevTools()
}
// 监听 electron ready 事件创建窗口
app.on('ready', createWindow);
// 监听窗口关闭的事件,关闭的时候退出应用, macOs 需要排除
app.on('window-all-closed', ()=>{
	if(process.platform !=='darwin') {
		app.quit();
	}
})

// Macos 中点击 dock 中的应用图标的时候重新创建窗口
app.on('activate', ()=>{
  if(BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})

index.html 代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #content {
        width: 100%;
        height: 400px;
        overflow-y: auto;
        background-color: orange;
      }
    </style>
  </head>
  <body>
    <h1>这是一个 electron 的项目</h1>
    <div id="content"></div>
  </body>
  <script src="render/preload.js"></script>
</html>

preload.js 代码

/**
 * ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件
ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件
ondrop - 在一个拖动过程中,释放鼠标键时触发此事件
 */
let fs = require("fs")
window.onload=()=>{
  let contentDom = document.getElementById("content")
  // 阻止默认行为
  contentDom.ondragenter = contentDom.ondragover= contentDom.ondragleave = function(){
    return false
  }
  contentDom.ondrop=(e)=>{
    let path = e.dataTransfer.files[0].path
    console.log(e,  e.dataTransfer.files[0].path)
    fs.readFile(path, (err, data)=>{
      if(err) {
        console.log(err)
        return false
      } 
      contentDom.innerHTML = data

    })
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大小仅为Rust四分之一!MoonBit 现已支持Wasm组件模型

使用 MoonBit 开发 Wasm 组件模型 Wasm组件 WebAssembly&#xff08;Wasm&#xff09;是一种新的低级虚拟指令集标准&#xff08;low-level virtual instruction set standard&#xff09;&#xff0c;用于沙箱模型。低级的&#xff0c;意味着它接近原生速度。虚拟的&#xff…

全网最最最全的LVS详解!!!

1 LVS-集群和分布式 1.1 集群 LVS&#xff08;Linux Virtual Server&#xff09;集群&#xff0c;即Linux虚拟服务器集群&#xff0c;是一个在Unix/Linux平台下实现负载均衡集群功能的系统。它由国人章文嵩博士在1998年开发&#xff0c;是中国国内最早出现的自由软件项目之一…

yolov8 剪枝 - DepGraph

2024年8月5 5000张图片&#xff0c;2个类别。 yolov8n 初始&#xff1a; 185 layers, 3151904 parameters, 31936 gradients, 8.7 GFLOPs 经过三次finetune后&#xff1a; 185 layers, 2327024 parameters, 31936 gradients, 6.6 GFLOPs 经过第四次fintune后&#xff1a; …

“write()” 与 “ tcp缓冲区 ” 之间的关系

write&#xff08;&#xff09;写入tcp缓冲区过程 write&#xff08;&#xff09;将该文本写入到tcp缓冲区中本质是数据的拷贝&#xff0c;当write()调用完&#xff0c;数据不一定发给tcp发送缓冲区中 因为&#xff1a; 有没有拷贝成功&#xff0c;都不由write&#xff08;&a…

史上最全Java初、中、高三级都适用的面试八股文(2024版含答案)

在Java编程的世界里&#xff0c;无论你是初出茅庐的新人&#xff0c;还是已经有一定经验的中级开发者&#xff0c;抑或是寻求突破的高级工程师&#xff0c;面试时总有一套通用的“八股文”知识点&#xff0c;就像是每位程序员的必备宝典。这套2024版的Java面试指南&#xff0c;…

mma.sync.aligned.m16n8k16.row.col.f16.f16.f16.f16测试

mma.sync.aligned.m16n8k16.row.col.f16.f16.f16.f16测试 1.参考文档2.numpy测试3.cuda kernel测试4.相关截图 本文演示了如何按PTX指令文档中的layout格式要求,加载数据,执行mma指令,并且跟numpy对比结果的一致性 1.参考文档 Matrix Fragments for mma.m16n8k16 with floatin…

MAVSDK添加自定义消息与函数实现云台(Gimbal)调整功能

1.找到action.proto文件并添加如下消息 2. 定义RPC方法AdjustGimbal方法如下: 3.运行generate_from_protos.sh重新根据.proto生成.cpp与.h文件 生成过程 生成完成 4. .proto生成的.h文件,成功包含同步与异步方法声明

零基础转行网络安全真的好就业吗?

网络安全作为近两年兴起的热门行业&#xff0c;成了很多就业无门但是想转行的人心中比较向往但是又心存疑惑的行业&#xff0c;毕竟网络安全的发展史比较短&#xff0c;而国内目前网安的环境和市场情况还不算为大众所知晓&#xff0c;所以到底零基础转行入门网络安全之后&#…

python自动化笔记:excel文件处理及日志收集

目录 一、openpyxl模块1.1、安装&#xff1a;pip install openpyxl1.2、openpyxl模块三大组件1.3、创建excel并写入数据1.4、读取excel 二、日志收集 一、openpyxl模块 1.1、安装&#xff1a;pip install openpyxl 注&#xff1a; openpyxl只支持xlsx格式&#xff0c;xls格式…

10+ Midjourney V6.1 提示:生成精美的角色海报

前言 近期图像生成界最大的更新是MidjourneyV6.1&#xff01;我迫不及待地想要开始创作和分享&#xff0c;这次分享的重点是V6.1在角色创作方面的增强。 以下是半天测试的结果&#xff0c;包括提示&#xff0c;专注于角色摄影照片和角色插图。 网上关于这方面的教程虽然很多&…

【第22章】Spring Cloud之Gateway集成Knife4j(下)

文章目录 前言一、访问页面加权控制1. 加权控制2. 登录 二、生产环境如何屏蔽Knife4j、Swagger等Ui资源和接口1. 基于Spring Boot框架提供的Conditional条件控制相关Bean的生效2. 效果 三、聚合个性化配置1. 用户服务1.1 引入依赖1.2 Knife4j配置类1.3 控制器 2. 网关服务2.1 排…

JG08Z-GD系列 八轴智能测径仪系统介绍

1.测径仪&#xff1a; 主要用于轧制线&#xff0c;棒材&#xff0c;八个方向直径及椭圆度在线测量&#xff0c;轧制螺纹钢特钢尺寸在线测量。 2.功能介绍&#xff1a; &#xff08;1&#xff09;显示内容 主控室液晶显示器&#xff1a;管材截面的最大/最小直径、平均值、椭圆…

问题本记录(1):mac有网络但打不开网页

此学习类别&#xff0c;仅作为小许的问题本&#xff0c;方便后续再次遇到相关问题进行查看。 第一步&#xff1a; 第二步&#xff1a; 添加一个新的位置 第三步&#xff1a; 选择这个新建的位置&#xff0c;Wi-Fi显示已连接就 万事大吉啦啦啦

html+css+js+jquery实现一个 飘零的树叶

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>飘落的枫叶</title><style>.maple {position: absolute;top: 0;color: #ff0000;}</style><script src"https://www.jq22.com…

片上POR和BOR的区别

片上 POR 和 BOR 的区别 片上 POR&#xff08;Power On Reset&#xff09;和 BOR&#xff08;Brown-out Reset&#xff09;是微控制器中用于确保系统在电源异常情况下能够恢复正常运作的两种复位机制。 1. POR&#xff08;上电复位&#xff09; POR 是在微控制器上电时触发的…

多路RTSP转RTMP推送方案的两个选择

技术选型 RTSP转RTMP推送到流媒体服务器&#xff0c;说起来技术实现不难&#xff0c;简单来说&#xff0c;获取RTSP流后&#xff0c;拿到未经解码的H.264/H.265和audio数据&#xff0c;重新打包RTMP发送出去即可。需要注意的是&#xff0c;大多RTSP转RTMP模块&#xff0c;需要…

数学建模~~追逐仿真问题

目录 1.前景介绍 2.题目描述 3.核心思路 4.思路分析 5.代码分析 5.1准备工作 5.2设置循环 5.3终止循环 5.4绘制图形 5.5完整代码 1.前景介绍 今天上午的数学建模培训王老师介绍的这个数学建模相关的经验真的是让我受益匪浅&#xff0c;让我对于数学建模有了更加清晰的…

数据增强库albumentations使用指南

数据增强技术就是人为地生成真实数据集的不同版本以增加其数据大小。计算机视觉(CV)和自然语言处理 (NLP) 在模型训练过程中经常使用数据增强策略来处理数据稀缺和数据多样性不足的问题&#xff0c;避免模型因数据量而导致的过拟合、泛化性不足等问题。计算机视觉中常见的数据增…

Node.JS - 基础

目录 A. 简介 B. 安装和配置 C. npm A. 简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 一、运行原理 事件驱动和非阻塞 I/O 模型&#xff1a; Node.js 采用事件驱动、异步编程的方式。这意味着它不会在等待一个操作&#xff08;如读取文件或网络请求&a…

spfa算法判断是否存在负权回路

spfa算法判断是否存在负权回路 题目 当一个图中存在一个负权回路时&#xff0c;是无法利用spfa 算法去求最短路问题的&#xff0c;但是可以利用spfa 算法判断有没有负权回路 题目 给定一个 n n n 个点 m m m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边…