electron初学

news2025/1/11 8:04:01

最近有一个开发桌面端的业务,考虑到跨平台就使用了electron。

引用官网:Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux。

简单说就是你会前端就能开发,无非是学一点api。官网入口

1.脚手架创建

正文

#创建文件夹
mkdir my-electron-app && cd my-electron-app

#初始化
npm init

#下载electron
npm i electron -S

在package.json里面加一个任务 “electron”: “electron .”

{
  "name": "electrondemo",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",//主程序入口
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "electron": "electron ." //就是这个
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@electron/remote": "^2.1.2",
    "electron": "^30.0.9"
  },
  "devDependencies": {
    "electron-reloader": "^1.2.3"
  }
}

2.文件介绍

在electron项目中,最重要的就是main.js,这是主程序的入口。
在这里插入图片描述

3.代码粘贴

我这里会把我项目中的代码全部贴出来,个人理解就是主程序为核心,然后渲染主页面,页面上可以做各种交互。

main.js

const { app, BrowserWindow, Menu, globalShortcut, ipcMain } = require('electron')

//热加载
const reloader = require('electron-reloader')
reloader(module)
// 监听初始化完成的生命周期
app.on('ready', () => {

    const createWindow = () => {
        const mainWindow = new BrowserWindow({
            width: 700,
            height: 700,
            frame: false, //无边框窗口
            webPreferences: {
                nodeIntegration: true,//开启渲染进程使用node模块
                contextIsolation: false,//开启渲染进程使用node模块
                enableRemoteModule: true,//开启渲染进程remote模块
            }
        })
        mainWindow.loadFile('./src/index.html')

        //默认打开调试
        mainWindow.webContents.openDevTools()

        //引入菜单js
        require('./menu.js')

        //引入remote
        const remote = require('@electron/remote/main')
        remote.initialize()
        remote.enable(mainWindow.webContents)

        //快捷键窗口最大化
        globalShortcut.register('CommandOrControl+M', () => {
            mainWindow.maximize()
        })

        //定义自定义事件(渲染进程和主进程通讯)
        ipcMain.on('max-window',()=>{
            mainWindow.maximize()
        })
    }


    app.whenReady().then(() => {
        createWindow()
        app.on('activate', () => {
            if (BrowserWindow.getAllWindows().length === 0) {
                createWindow()
            }
        })
    })

    app.on('window-all-closed', () => {
        if (process.platform !== 'darwin') app.quit()
    })

})

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>
    <link rel="stylesheet" href="./css/index.css">
</head>
<body>
    <div class="custom-menu">
            <button style="-webkit-app-region: no-drag" onclick="maxWindow()">最大</button>
            <ul>
                <li>最大</li>
                <li class="new-window">新建窗口</li>
                <li><a href="http://www.baidu.com">关于我们</a></li>
            </ul>
    </div>
    <h1>hello electron 汗滴禾下土</h1>
    <button onclick="openFile()">打开文件</button>
    <button onclick="saveFile()">保存文件</button>
    <textarea></textarea>
    <script src="./js/index.js"></script>
</body>
</html>

menu.js

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

//定义菜单模版
const template = [
    {
        label: '文件',
        submenu: [
            {
                label: '新建窗口',
                click() {
                    new BrowserWindow({
                        width: 200,
                        height: 200
                    })
                }
            }
        ]
    },
    {
        label: '关于我们'
    }
]

//编译模版
const menu = Menu.buildFromTemplate(template)
//设置菜单
Menu.setApplicationMenu(menu)

index.css

* {
    margin: 0;
    padding: 0;
}

.custom-menu{
    height: 50px;
    width: 100%;
    background: pink;
    -webkit-app-region: drag; /*支持拖拽*/
}

.custom-menu ul{
    list-style: none;
}

.custom-menu ul li{
    float: left;
    width: 80px;
    line-height: 50px;
    text-align: center;
    margin-left: 10px;
    -webkit-app-region: no-drag;
} 

index.js

const { shell, ipcRenderer } = require("electron");
const { BrowserWindow, dialog } = require("@electron/remote");
const fs = require("fs")

// 点击新建窗口
const newWindow = document.querySelector('.new-window')
newWindow.onclick = function () {
    new BrowserWindow({
        width: 300,
        height: 300
    })
}

// 点击a跳转
const allA = document.querySelectorAll('a')
allA.forEach(item => {
    item.onclick = function (e) {
        e.preventDefault();
        shell.openExternal(item.href)
    }
})

// 打开文件
const textArea1 = document.querySelector('textarea')
function openFile() {
    const res = dialog.showOpenDialogSync({
        title: '读取',
        buttonLabel: '读取文件',
        filters: [
            { name: 'Custom File Type', extensions: ['js'] },
        ]
    })

    const fileContent = fs.readFileSync(res[0]).toString
    console.log(fileContent)
    textArea1.value = fileContent
}

// 保存文件
function saveFile() {
    const res = dialog.showSaveDialogSync({
        title: '保存',
        buttonLabel: '保存文件',
        filters: [
            { name: 'index', extensions: ['js'] },
        ]
    })

    fs.writeFileSync(res,textArea1.value)
}

// 渲染进程和主进程通讯
const maxWindow =function(){
    ipcRenderer.send('max-window')
}

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

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

相关文章

就业班 第四阶段(docker) 2401--5.29 day3 Dockerfile+前后段项目若依ruoyi

通过Dockerfile创建镜像 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | ->1. 常用选项说明 --build-arg&#xff0c;设…

el-tooltip 样式修改

<template><div><el-tooltip class"item" effect"dark" content"Right Bottom 提示文字" placement"right-end"><el-button>右下</el-button></el-tooltip></div> </template><sc…

接口请求参数为文件时如何测试

方法 工具&#xff1a;Postman 步骤&#xff1a;①点击body②点击form-data③选择key类型为fie ④输入参数名⑤选择参数上传⑥发送请求

Memoro:一款功能强大的堆栈数据细节分析工具

关于Memoro Memoro是一款功能强大的堆栈数据细节分析工具&#xff0c;该工具可以给广大研究人员提供关于堆内存数据的详细信息&#xff0c;并给出分析数据。 Memoro不仅可以告诉我们目标程序什么时候、在哪里进行了堆内存分配&#xff0c;而且还可以告诉我们目标程序是如何实际…

JPA详解

文章目录 JPA概述JPA的优势JPA注解 JPA概述 Java Persistence API&#xff08;JPA&#xff09;是 Java EE 平台的一部分&#xff0c;它为开发者提供了一种用于对象关系映射&#xff08;ORM&#xff09;的标准化方法。JPA 提供了一组 API 和规范&#xff0c;用于在 Java 应用程…

前端vue搭建

1.找一个合适的模板&#xff0c;可以用vue-element-admin的模板&#xff0c;但是个人认为这个模板太大了&#xff0c;做小项目修改起来比较复杂&#xff0c;可以找一个比较小的项目 2.我找的项目git clone https://github.com/tuture-dev/vue-admin-template.git&#xff0c;这…

Vivado报错 [Synth 8-9917] port ‘xx‘ must not be declared to be an array

报错位置&#xff1a; input wire [11:0] i_data [7:0] ,报错原因&#xff1a; Verilog并不支持将端口设置为数组类型&#xff0c;而SystemVerilog支持此写法。 解决办法&#xff1a; 将文件后缀.v改成.sv格式&#xff1b; 此时工程中文件确实&#xff0c;修正修改格…

留言板——增添功能(持久化存储数据,使用MyBatis)

目录 一、数据准备 二、引入MyBatis 和 MySQL驱动依赖 三、配置MySQL账号密码 四、编写后端代码 五、调整前端代码 六、测试 之前的代码&#xff1a;综合性练习&#xff08;后端代码练习3&#xff09;——留言板_在线留言板前后端交互-CSDN博客 一、数据准备 创建数据库…

glpi 安装与使用

1、环境介绍 操作系统&#xff1a;龙蜥os 8.9 nginx&#xff1a;1.26.1 php&#xff1a;8.2.19 mysql&#xff1a;MarinaDB 10.3.9 glpi&#xff1a;10.0.6 fusioninventory&#xff1a;fusioninventory-10.0.61.1 2、安装epel源 dnf install epel-release -y dnf install htt…

[个人笔记] 记录docker-compose使用和Harbor的部署过程

容器技术 第三章 记录docker-compose使用和Harbor的部署过程 容器技术记录docker-compose使用和Harbor的部署过程Harborhttps方式部署&#xff1a;测试环境部署使用自签名SSL证书https方式部署&#xff1a;正式环境部署使用企业颁发的SSL证书给Docker守护进程添加Harbor的SSL证…

活动预告|6月13日Apache Flink Meetup·香港站

6 月 13 日 | 香港 | 线下 Apache Flink Meetup 的风吹到了香江之畔&#xff0c;Apache Flink 香港 Meetup 来啦&#xff01;本次活动&#xff0c;我们邀请了来自阿里云的顶尖专家&#xff0c;帮助开发者全面了解 Apache Flink 的流批一体的数据处理能力&#xff0c;流式数据湖…

颠覆传统家居行业?线上3D数字化营销有何魅力?

在数字时代的浪潮中&#xff0c;Z时代年轻用户正成为泛家居行业的消费核心力量。作为数字原生的一代&#xff0c;他们追求的不仅仅是产品本身&#xff0c;更是独特的消费体验。为了迎合这一趋势&#xff0c;泛家居行业正积极引入线上3D数字化沉浸式营销&#xff0c;为用户提供前…

Redis相关详解

什么是 Redis&#xff1f;它主要用来什么✁&#xff1f; Redis&#xff0c;英文全称是 Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源✁使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化✁日志型、Key-Value 数据库&#xff…

优选算法一:双指针算法与练习(移动0)

目录 双指针算法讲解 移动零 双指针算法讲解 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是快慢指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最…

Windows 80端口占用解决办法

启动软件系统前&#xff0c;有时遇见端口被其他程序占用&#xff0c;导致无法启动系统 解决办法: # 查看端口占用情况 > netstat -ano | findstr 端口号通常端口占用&#xff0c;通过任务管理器查看PID&#xff0c;结束任务可以完成。System进程占用&#xff0c;结束不了&…

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题 查看python语言服务器的日志&#xff0c;确定问题。 我的问题是加载的vscode 目录下存在一个很大的数据集目录&#xff0c;导致无法正常工作。 解决办法&#xff1a; 在vscode的pylance设置中&#xff0c;排除对应的目…

Linux服务器搭建http服务,添加DNS域名解析

效果如下&#xff1a;搭建自己的网站&#xff0c;添加域名解析服务后&#xff0c;外网可访问 1.搭建http服务器&#xff0c;可通过局域网下的ip访问 2.DNS域名解析服务&#xff0c;链接ip到公网&#xff0c;外网可以通过对应的域名访问 1.安装httpd yum install httpd #根据提示…

CSS 空间转换 动画

目录 1. 空间转换1.1 视距 - perspective1.2 空间转换 - 旋转1.3 立体呈现 - transform-style1.4 空间转换 - 缩放 2. 动画 - animation2.1 动画的基本用法2.1 animation 复合属性2.2 animation 拆分属性2.3 多组动画 正文开始 1. 空间转换 空间&#xff1a;是从坐标轴角度定义…

芋道系统,springboot+vue3+mysql实现地址的存储与显示

1.效果图 2.前端实现&#xff1a; <el-form-item label"地址" prop"entrepriseAddress"><el-cascaderv-model"formData.entrepriseAddress"size"large":options"region"/></el-form-item> //导入组件 im…

不借助三方平台自主搭建量化回测系统 ——以海龟交易策略为例

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…