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

electron之旅(二)react使用

首先使用react模板

我们这里使用的是vite和yarn

yarn create vite #创建vite的react-js模板

在这里插入图片描述

初始化依赖

yarn

添加依赖

state(状态管理)

yarn add redux react-redux

routes(react路由)

yarn add react-router-dom

electron依赖

yarn add electron vite-plugin-electron cross-env -D

修改&添加文件

创建(根目录(与src同级))\electron/index.js

import { app, BrowserWindow } from "electron";
import path from "path";const createWindow = () => {const win = new BrowserWindow({webPreferences: {// 允许渲染进程使用nodecontextIsolation: false,nodeIntegration: true,},});// app.isPackaged 字段存在bug,即使正常打包后,仍然为false,所以不能用来判断项目是否经过打包if (process.env.NODE_ENV === 'development') {// 开发环境// process.env.VITE_DEV_SERVER_URL获取开发服务器的url// vite版本不同,VITE_DEV_SERVER_URL字段也有所变化,打印process.env查找具体的名称win.loadURL(process.env.VITE_DEV_SERVER_URL);} else {// 生产环境win.loadFile(path.join(__dirname, "../dist/index.html"));}
};app.whenReady().then(createWindow)

package.json

{"name": "electron_react_js_test01","private": true,"version": "0.0.0","type": "commonjs",//修改"main": "dist-electron/index.js",//添加"scripts": {"dev": "cross-env NODE_ENV=development vite",//修改"build": "vite build","preview": "vite preview"},...
}

vite.config.js

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'import electron from "vite-plugin-electron"//添加// https://vitejs.dev/config/
export default defineConfig({plugins: [react(),//添加electron({entry: 'electron/index.js'})],
})
yarn dev #即可

react状态管理&react路由

store.js

import {legacy_createStore} from "redux"//当然里面的数据自定义,这里只是一个参照
const defaultState = {num:0,isHome:false
}const reducer = (state = defaultState,action = {type,data}) =>{//深拷贝let newState = JSON.parse(JSON.stringify(state))//当然里面的数据自定义,这里只是一个参照switch(action.type){case "returnHome":newState.isHome = truebreakcase "QiTaPage":newState.isHome = falsebreakdefault:break}return newState
}const store = legacy_createStore(reducer)export default store

routes.jsx

import { Navigate } from "react-router-dom"
import Master from "./pages/master/Master"
import Home from "./pages/master/home/Home"
import Anime from "./pages/master/anime/Anime"const routes = [{path: '/master',element: <Master />,children: [{path: 'home',element: <Home />},{path: 'anime',element: <Anime />}]}
]export default routes

main.jsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import './index.css'
import { Provider } from 'react-redux'
import { HashRouter } from 'react-router-dom'
import store from './store'ReactDOM.createRoot(document.getElementById('root')).render(<Provider store={store}><HashRouter><App /></HashRouter></Provider>
)

./src/App.jsx


渲染进程react和主进程通讯

渲染进程(以创建窗口为例)

import {useState, useEffect} from "react"
import { useSelector,useDispatch } from "react-redux"import { ipcRenderer } from "electron"//主要引入import anime from './anime.module.css'function Anime(props){return (<div className={anime.all}>{/*主要*/}<button onClick={()=>ipcRenderer.send('new-win')}>点击新页面</button></div>)
}export default Anime

主进程(以创建窗口为例)

import { app, BrowserWindow, ipcMain } from "electron";
import path from "path";const createWindow = () => {const win = new BrowserWindow({...});//添加ipcMain.on('new-win',()=>{const newWin = new BrowserWindow({width:300,height:250,webPreferences: {// 允许渲染进程使用nodecontextIsolation: false,nodeIntegration: true,},})newWin.loadURL("https://www.bilibili.com") //可以自行修改})
....

问题1

TypeError: path.join is not a function

问题1图片

解决
yarn add vite-plugin-electron-renderer

vite.config.js

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'import electron from "vite-plugin-electron"import electron_render from "vite-plugin-electron-renderer" //添加
// https://vitejs.dev/config/
export default defineConfig({plugins: [react(),electron({entry: 'electron/index.js'}),electron_render()//添加],
})

相关文章:

electron之旅(二)react使用

首先使用react模板 我们这里使用的是vite和yarn yarn create vite #创建vite的react-js模板初始化依赖 yarn添加依赖 state(状态管理) yarn add redux react-reduxroutes(react路由) yarn add react-router-domelectron依赖 yarn add electron vite-plugin-electron cross-env…...

ChatGPT基础知识系列之Prompt

ChatGPT基础知识系列之Prompt 在 ChatGPT 中,用户可以输入任何问题或者话题,如天气、体育、新闻等等。系统将这个输入作为一个“提示”(prompt)输入到 GPT 模型中进行处理。GPT 模型会基于其学习到的语言规律和上下文知识,生成一个自然语言回答,并返回给用户。 例如,当…...

SpringBoot3 - Spring Security 6.0 Migration

Spring Security 6.0 Migration https://docs.spring.io/spring-security/reference/5.8/migration/servlet/config.html 最近在做SpringBoot2.x到3.0的升级。其中最主要的一部分是javax -> jakartapackageName的变更&#xff0c;另外一部分是对一些废弃/删除的类进行替换。…...

【新2023Q2模拟题JAVA】华为OD机试 - 最少停车数

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:最少停车数 题目 特定大小的…...

《代码实例前端Vue》Security查询用户列表,用户新增

login.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>系统登录-超市订单管理系统</title><link rel"stylesheet" href"../css/style.css"><script type&qu…...

CANopenNode学习笔记(一)--- README翻译

CANopenNode学习笔记 文章目录CANopenNode学习笔记特性CANopen其他CANopenNode 流程图文件结构对象字典编辑器CANopenNode 是免费开源的CANopen协议栈。 CANopen是建立在CAN基础上的用于嵌入式控制系统的国际标准化(EN 50325-4) (CiA301)高层协议。有关CANopen的更多信息&#…...

关于Android 11、12和13服务保活问题

物联网环境&#xff0c;为了解决不同厂商、不同设备、不同网络情况下使用顺畅&#xff0c;同时也考虑到节约成本&#xff0c;缩小应用体积的好处&#xff0c;我们需要一个服务应用一直存在系统中&#xff0c;保活它以提供服务给其他客户端调用。 开机自启动&#xff0c;通过广播…...

Java 泛型 使用案例

参考资料 Java 基础 - 泛型机制详解路人甲-Java泛型专题 目录一. 通用Mapper1.1 实体类1.2 Mapper基类1.3 自定义接口1.4 抽象基类Service1.5 调用二. session和bean的获取一. 通用Mapper 1.1 实体类 ⏹ Accessors(chain true): 允许链式调用 import lombok.Data; import …...

进程与线程

文章目录什么是线程线程与进程的关系线程与进程的区别什么是线程 上一篇文章中我们介绍了什么进程&#xff0c;我们把进程比作一个工厂&#xff0c;那么线程就是工厂中的流水线。引入进程的目的就是为了实现多个任务并发执行&#xff0c;但是如果频繁的创建销毁进程&#xff0…...

骑友,怎么挑选适合自己的赛事

骑友&#xff0c;怎么挑选适合自己的赛事一、从场地、路况、天气&#xff0c;各个方面了解赛事的要求。二、看完赛事&#xff0c;要知道自己适合参加什么样的比赛。三、通过比赛成绩&#xff0c;对比自己的实力。四、综合考虑自己的经济能力&#xff0c;根据自己的经济能力选择…...

【Java 数据结构与算法】-遍历Map和Set的方式

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Java 数据结构与算法】 文章目录一、遍历Map法一 先获取Map集合的全部key的set集合&#xff0c;遍历map的key的Set集合法二 把map的key和value打包成Set的key后的这个Set集合法…...

组件、套件、 中间件、插件

组件、套件、 中间件、插件 组件 位于框架最底层&#xff0c;是由重复的代码提取出来合并而成。组件的本质&#xff0c;是一件产品&#xff0c;独立性很强&#xff0c;组件的核心&#xff0c;是复用&#xff0c;与其它功能又有强依赖关系。 模块 在中台产品和非中台产品中&…...

自动化工具 pytest 内核测试平台落地初体验

测试平台&#xff0c;有人说它鸡肋&#xff0c;有人说它有用&#xff0c;有人说它轮子&#xff0c;众说纷纭&#xff0c;不如从自身出发&#xff0c;考虑是否要做测试平台&#xff1a; 第 1 阶段&#xff0c;用 Pythonrequests 写接口自动化。 第 2 阶段&#xff0c;选择 unit…...

Python 自动化指南(繁琐工作自动化)第二版:四、列表

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter4/ 在开始认真编写程序之前&#xff0c;您需要理解的另一个主题是列表数据类型及其表亲元组。列表和元组可以包含多个值&#xff0c;这使得编写处理大量数据的程序更加容易。由于列表本身可以包含其他列表&#…...

大数据领域的发展及其对现实世界的价值

大数据已经成为全球各行业领域不可或缺的一部分&#xff0c;并且其应用不断涌现。尽管很多人最初对“大数据”这一术语表示怀疑和不信任&#xff0c;但大数据技术已经确立了稳定的发展方向。根据调研机构的预测&#xff0c;到2027年&#xff0c;全球大数据市场规模将达到1090亿…...

几种常见的架构模式

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址 如果访问不了Github&#xff0c…...

flutter安装各种问题汇总

C:\Users\Administrator>flutter doctor -v Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source! [√] Flutter (Channel stable, 3.7.0, on Microsoft Windows [版本 10.0.19044.1826], locale zh-CN) • Flutte…...

网络传输层

目录传输层再谈端口号端口号范围划分认识知名端口号netstatpidofUDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项使用udp协议 的应用层协议其它TCP协议TCP协议段格式如何理解链接如何理解三次握手如何理解四次挥手概念TIME_WAIT/CLOSE_WAITTCP策略确认应答…...

linux内核启动分析(二)

文章目录1. set_task_stack_end_magic2.smp_setup_processor_id3. debug_objects_early_init4. cgroup_init_early4.1 init_cgroup_root4.1.1 init_cgroup_housekeeping4.2 cgroup_init_subsys5. local_irq_disable5.1 raw_irqs_disabled5.2 raw_local_irq_disable5.3 trace_ha…...

『EasyNotice』.NET开源消息通知组件——快速实现邮件/钉钉告警通知

&#x1f4e3;读完这篇文章里你能收获到 傻瓜式扩展方法直接使用如何通过EasyNotice快速实现钉钉/邮件的通知发送感谢点赞收藏&#xff0c;避免下次找不到~ 文章目录一、EasyNotice1. 功能介绍2. 源码地址二、项目接入1. 发送邮件通知Step 1 : 安装包&#xff0c;通过Nuget安装…...

JVM垃圾回收算法

垃圾标记阶段 对象存活判断&#xff1a;在堆里存放着几乎所有的Java对象实例&#xff0c;在GC执行垃圾回收之前&#xff0c;首先需要区分出内存中哪些是存活对象&#xff0c;哪些是已经死亡的对象。只有被标记为己经死亡的对象&#xff0c;GC才会在执行垃圾回收时&#xff0c;…...

怎么看待ChatGPT封号这件事呢?

最近的ChatGPT大量封号&#xff0c;刷爆了全网&#xff0c;我的两个个人账号被封禁了&#xff0c;不知道大家最近有没有遇到相关的报错信息&#xff0c;要么就是检查你当前的浏览器配置&#xff0c;最后来一个access denied&#xff0c;要么直接就给你来一个当前的国家不支持。…...

八、交换技术原理

&#xff08;一&#xff09;交换机 1、交换机介绍 一种用于电&#xff08;光&#xff09;信号转发的网络设备&#xff0c;可以为接入交换机的任意两个网络节点提供独享的电信号通路。 工作于第二层的叫交换机&#xff0c;工作于第三层的叫第三层交换机&#xff0c;最常见的是…...

什么是DHCP?DHCP有什么用?(中科三方)

在IP网络中&#xff0c;每一个连接的设备都需要分配一个唯一的IP地址&#xff0c;才能实现和Internet上其他设备的互联。在一些终端规模较大的网络中&#xff0c;需要为每一个主机手工配置IP地址&#xff0c;以避免IP地址的重复&#xff0c;如果主机发生变更&#xff0c;还要去…...

算法设计-二分

一、有序和单调 ​ 二分本质上是一种更加智能的搜索状态空间的方式&#xff0c;他需要状态空间的状态呈现一种“有序的一维数组”的形式&#xff0c;然后再进行搜索。所以一开始的排序是无法避免的。 ​ 因为二分的写法问题&#xff0c;所以应当怎样排序也是有一定讲究的&…...

隧道技术基础

隧道技术基础基本概念端口转发应用层代理基本概念 攻击者通过边界主机进入内网&#xff0c;往往会利用它当跳板进行横向渗透&#xff0c;但现在的内部网络大多部署了很多安全设备&#xff0c;网络结构错综复杂&#xff0c;对于某些系统的访问会受到各种阻挠&#xff0c;这就需…...

卡尔曼滤波浅析

文章目录前言任务状态预测外部影响因素外部不确定性状态更新利用测量进一步修正状态合并两个高斯分布公式汇总图形化解释总结&#xff08;readme&#xff09;references前言 Kalman Filter算法&#xff0c;是一种递推预测滤波算法&#xff0c;算法中涉及到滤波&#xff0c;也涉…...

Eolink Apikit 创建/生成 API 文档

在 API 研发管理产品中&#xff0c;几乎所有的协作工作都是围绕着 API 文档进行的。 我们在接触了大量的客户后发现&#xff0c;采用 文档驱动 的协作模式会比先开发、后维护文档的方式更好&#xff0c;团队协作效率和产品质量都能得到提高。因此我们建议您尝试基于文档来进行工…...

2023年上半年系统分析师备考法则

截止3月30日&#xff0c;上海、北京等地都开始报名&#xff0c;部分省市已经截止报名&#xff0c;大家如果还没报名成功的赶紧报名&#xff0c;千万别错过了&#xff0c;另外就是别忘了缴费&#xff0c;缴费成功才是报名成功。 报名网址&#xff1a;https://bm.ruankao.org.cn…...

【人工智能】—约束传播、弧约束、问题结果与问题分解、局部搜索CSP

【人工智能】—约束传播、弧约束、问题结果与问题分解、局部搜索CSP约束传播弧约束弧相容算法AC-3问题结构化简约束图-树结构CSP问题的局部搜索CSP的迭代算法举例&#xff1a;4-Queens加速&#xff1a;模拟退火法加速&#xff1a;最小最大优化(约束加权法)小结约束传播 前向检…...