electron学习和新建窗口

首先我们要先下载electron

npm install --save-dev electron

建立入口文件main.js

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

javascript 复制代码
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了

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>
</head>
<body>
    你能看见我吗
</body>
</html>

添加命令 启动

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

javascript 复制代码
 "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上

javascript 复制代码
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方法

javascript 复制代码
 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语法 如 require
      enableRemoteModule: true, // 可以在页面引用 electron 中的 remote
    },
  });

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

javascript 复制代码
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全部代码

javascript 复制代码
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语法 如 require
      enableRemoteModule: 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里的方法

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>
</head>
<body>
    你能看见我吗
  
</body>
<script>
  const btn1 = document.getElementById("btn1")
  btn1.onclick = function(){
    window.IPC.createWin(123)
  }
</script>
</html>
目录

启动成功

相关推荐
做cv的小昊6 分钟前
【TJU】信息检索与分析课程笔记和练习(6)英文数据库检索—web of science
大数据·数据库·笔记·学习·全文检索
每天吃饭的羊6 分钟前
媒体查询
开发语言·前端·javascript
Darkershadow11 分钟前
蓝牙学习之uuid与mac
python·学习·ble
毛小茛22 分钟前
芋道管理系统学习——项目结构
java·学习
XiaoYu200231 分钟前
第8章 Three.js入门
前端·javascript·three.js
这个一个非常哈41 分钟前
element之,自定义form的label
前端·javascript·vue.js
北岛寒沫1 小时前
北京大学国家发展研究院 经济学原理课程笔记(第二十五课 开放宏观基本概念)
经验分享·笔记·学习
李瑞丰_liruifengv1 小时前
Claude Agent SDK 最简玩法:几行代码配合 Markdown 轻松搭建 Agent
javascript·人工智能·程序员
bobringtheboys1 小时前
[el-tag]使用多个el-tag,自动判断内容是否超出
前端·javascript·vue.js
尽欢i1 小时前
用 return“瘦身“if-else:让代码少嵌套、好维护
前端·javascript