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

electron学习和新建窗口

首先我们要先下载electron

npm install --save-dev electron

建立入口文件main.js

 新建一个入口文件 main.js,然后导入eletron新建一个窗口。

const { app, BrowserWindow, ipcMain } = require("electron");
const path = require("path");function createWindow() {const win = new BrowserWindow({width: 800,height: 600,show: false,// minHeight:600,// minWidth:800,autoHideMenuBar: true, // 菜单栏});// 这里引入页面  如果说url 需要win.loadUrl()引入win.loadFile("./index.html");win.webContents.openDevTools();win.on("activate",() => BrowserWindow.getAllWindows().length === 0 && createWindow());// 解决内容空白加载问题win.on("ready-to-show", () => {win.show();});//一个窗口中的文本加载完成win.webContents.on("dom-ready", () => {console.log("2、一个窗口中的文本加载完成");});//一个窗口中的文本加载完成win.webContents.on("close", () => {console.log("8、关闭窗口");});}app.whenReady().then(() => {createWindow();app.on("activate", () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}});
});// 生命周期// app初始化完成
app.on("ready", () => {});// 一个窗口中的文本加载完成
app.on("dom-ready", () => {});// 所有窗口都被关闭时触发
app.on("window-all-closed", () => {app.quit();
});

建立一个页面

新建一个html,然后通过main.js里的 win.loadFile引入 就ok了 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body>你能看见我吗
</body>
</html>

添加命令 启动

最后在在package.json里添加启动命令 start

 "scripts": {"dev": "nodemon --watch main.js --exec npm run build","start": "electron ."},

然后启动就ok了

添加新窗口

方式一:

在页面直接 window.opne()

方式二: 

我们需要页面和electron配置相关了,我们这里使用electron提供的 ipcMain、ipcRenderer, 可以使electron主进程和渲染层通讯。

编辑预加载 preload.js

preload.js主要是联通electron主进程和渲染端的桥梁,我们新建js文件夹,用contextBridge.exposeInMainWorld把方法暴露在window上,不直接把ipcRenderer暴露在window上的原因是因为怕网络攻击。

这里是吧 IPC绑定在window上

const { contextBridge, ipcRenderer, BrowserWindow } = require("electron");const fs = require("fs");/*** 通信方法挂载到window对象上* 在渲染进程中使用:* <script setup lang="ts">* window.IPC.createWin()* </script>*/
contextBridge.exposeInMainWorld("IPC", {closeWindow: () => {ipcRenderer.invoke("closeWindow");},minimizeWindow: () => {ipcRenderer.invoke("minimizeWindow");},createWin: (data) => {console.log(data);ipcRenderer.invoke("create");},
});
绑定preload.js

在main.js绑定preload.js,同时接收 ipcRenderer方法

 const win = new BrowserWindow({width: 800,height: 600,show: false,// minHeight:600,// minWidth:800,autoHideMenuBar: true, // 菜单栏webPreferences: {preload: path.join(__dirname, "preload.js"),nodeIntegration: true, // 可以在页面引用的js里面使用node。js语法 如 requireenableRemoteModule: true, // 可以在页面引用 electron 中的 remote},});

在main.js用ipcMain.handle()接收方法,并打开一个新的窗口,新的窗口要新建一个页面html 

const { app, BrowserWindow, ipcMain } = require("electron");
// 信息传递 ipcMain要引入ipcMain.handle("create", (event, args) => {console.log("可以看见我吗");let win = new BrowserWindow({width: 400, // * 指定启动app时的默认窗口尺寸height: 400, // * 指定启动app时的默认窗口尺resizable: true, // 禁止手动修改窗口尺寸autoHideMenuBar: true,icon: path.join(__dirname, "favicon.ico"),});//   win.loadURL("./dong.html");win.loadFile(path.join(__dirname, "dong.html"));win.on("close", () => {console.log("关闭窗口");});});

main.js全部代码

const { app, BrowserWindow, ipcMain } = require("electron");
const path = require("path");function createWindow() {const win = new BrowserWindow({width: 800,height: 600,show: false,// minHeight:600,// minWidth:800,autoHideMenuBar: true, // 菜单栏webPreferences: {preload: path.join(__dirname, "preload.js"),nodeIntegration: true, // 可以在页面引用的js里面使用node。js语法 如 requireenableRemoteModule: true, // 可以在页面引用 electron 中的 remote},});win.loadFile("./index.html");win.webContents.openDevTools();win.on("activate",() => BrowserWindow.getAllWindows().length === 0 && createWindow());// 解决内容空白加载问题win.on("ready-to-show", () => {win.show();});//一个窗口中的文本加载完成win.webContents.on("dom-ready", () => {console.log("2、一个窗口中的文本加载完成");});//一个窗口中的文本加载完成win.webContents.on("close", () => {console.log("8、关闭窗口");});// 信息传递ipcMain.handle("create", (event, args) => {console.log("可以看见我吗");let win = new BrowserWindow({width: 400, // * 指定启动app时的默认窗口尺寸height: 400, // * 指定启动app时的默认窗口尺resizable: true, // 禁止手动修改窗口尺寸autoHideMenuBar: true,icon: path.join(__dirname, "favicon.ico"),});//   win.loadURL("./dong.html");win.loadFile(path.join(__dirname, "dong.html"));win.on("close", () => {console.log("关闭窗口");});});
}app.whenReady().then(() => {createWindow();app.on("activate", () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}});
});// 生命周期// app初始化完成
app.on("ready", () => {});// 一个窗口中的文本加载完成
app.on("dom-ready", () => {});// 所有窗口都被关闭时触发
app.on("window-all-closed", () => {app.quit();
});
页面点击创建弹窗

页面中用window.IPC去掉preload.js里的方法

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body>你能看见我吗</body>
<script>const btn1 = document.getElementById("btn1")btn1.onclick = function(){window.IPC.createWin(123)}
</script>
</html>
 目录

启动成功

相关文章:

  • 强化学习入门(Matlab2021b)-创建环境【2】
  • [TCP] TCP/IP 基础知识词典(2)
  • Putty中运行matlab文件
  • 短剧小程序系统,重塑视频观看体验的科技革命
  • 【Linux】用户与用户组,用户账号系统文件
  • 全球游戏市场回暖,Flat Ads推动海外获客增长
  • gin源码实战 day2
  • 【GPTs分享】每日GPTs分享之Canva
  • 【Git】:标签功能
  • 【JVM】垃圾回收算法
  • Unity2023.1.19_ShaderGraph节点说明以及使用技巧
  • kafka和ZK的关系
  • Apache Camel定时任务
  • 跳槽前应该做好哪些准备?
  • Redis 缓存(Cache)
  • python3.6+scrapy+mysql 爬虫实战
  • [笔记] php常见简单功能及函数
  • 2017届校招提前批面试回顾
  • bootstrap创建登录注册页面
  • Docker: 容器互访的三种方式
  • Leetcode 27 Remove Element
  • PHP变量
  • SQL 难点解决:记录的引用
  • 百度小程序遇到的问题
  • 初识 webpack
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享一份非常强势的Android面试题
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 给初学者:JavaScript 中数组操作注意点
  • 那些被忽略的 JavaScript 数组方法细节
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一些关于Rust在2019年的思考
  • 原生js练习题---第五课
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • # 达梦数据库知识点
  • #1014 : Trie树
  • #Linux(make工具和makefile文件以及makefile语法)
  • ${ }的特别功能
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (23)Linux的软硬连接
  • (4)logging(日志模块)
  • (8)STL算法之替换
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (八)Spring源码解析:Spring MVC
  • (二)JAVA使用POI操作excel
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)插入排序
  • (转载)从 Java 代码到 Java 堆