学习electron第一天
使用最简单的代码做一个桌面应用
-
第一步需要初始化一个项目pnpm init
-
安装electron-----------------------pnpm add -D electron
-
第三步配置package.json文件
-
在scripts中添加命令"dev":"electron ."
-
查看package.json文件可以看出main对应会有一个js文件,初始化应是index.js,但是我会习惯改为main.js,接下来创建这个文件
-
接下来就可以在主进程中渲染代码了
//导入窗口模板 const { BrowserWindow, app } = require("electron"); //创建窗口 app.whenReady().then(() => { const mainWindow = new BrowserWindow({ width: 1200, height: 800, // 是否置顶 alwaysOnTop: true, // 打开软件之后希望距离左边屏幕多少像素 x: 1500, //打开软件之后希望距离上边屏幕多少像素 y: 100, }); //打开哪一个网址,这里是一个听歌网站,若有需要请修改地址就好 mainWindow.loadURL("https://m2.trtst.com/index"); }); -
接下来运行npm run dev或者pnpm dev都可以打开这个软件
如何打开自己的网站
//第一步在根目录下面创建Index.html
//第二部就可以使用了代码如下
//导入窗口模板
const { BrowserWindow, app } = require("electron");
const path = require("path");
//创建窗口
app.whenReady().then(() => {
const mainWindow = new BrowserWindow({
width: 1200,
height: 800,
// 是否置顶
alwaysOnTop: true,
// 打开软件之后希望距离左边屏幕多少像素
x: 1500,
//打开软件之后希望距离上边屏幕多少像素
y: 100,
});
// 打开一个网站
// mainWindow.loadURL("https://m2.trtst.com/index");
// 打开html文件
mainWindow.loadFile(path.resolve(__dirname, "index.html"));
});
如何区分主进程和渲染进程
此时package.json里面的main配置的js就是主进程
渲染进程是浏览器执行的js,你可以在html文件中使用script标签进行包裹,此时的script就是渲染进程,也可以将渲染进程打包成一个js文件,然后使用script标签引入
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>day01</title> </head> <body> <h1>这里便是我的app内容</h1> //引入外部的script文件 <script src="./js/require.js"></script> </body> </html>require.js文件内容如下
alert("333"); console.log("打开了");渲染进程是使用的浏览器中的js语言,但是主进程使用的是node.js,因此需要区分清除主进程和渲染进程,比如主进程中不可以使用dom操作,但是渲染进程可以
解决每次修改代码还得重新运行终端问题
此时就需要修改package.json文件中的script中的dev了
** "dev": "nodemon --exec electron ."**--------------接下来运行dev就可以在主进程中修改代码,它可以自动重新编译打开软件了
但是此时还有一个问题就是修改html并不会重新编译打开
接下来需要在根目录下创建nodemon.json文件
//将下面的代码添加到nodemon.json文件中
{
"ignore": ["node_modules", "dist"],
"colours": true,
"verbose": true,
"restartable": "rs",
"watch": ["*.*"],
"ext": "html,js"
}
接下里重新启动一个项目就可以了,之后就会发现渲染进程更改代码也会发生改变
解决苹果客户端关闭软件但是还是会在后台运行的情况
//导入窗口模板
const { BrowserWindow, app } = require("electron");
const path = require("path");
//创建窗口
const createWindow = () => {
const mainWindow = new BrowserWindow({
width: 1200,
height: 800,
// 是否置顶
alwaysOnTop: true,
// 打开软件之后希望距离左边屏幕多少像素
x: 1200,
//打开软件之后希望距离上边屏幕多少像素
y: 100,
});
// 打开一个网站
// mainWindow.loadURL("https://m2.trtst.com/index");
// 打开文件的同时打开控制台
mainWindow.webContents.toggleDevTools();
// 打开html文件
mainWindow.loadFile(path.resolve(__dirname, "index.html"));
};
app.whenReady().then(() => {
createWindow();
app.on("window-all-closed", () => {
//当窗口全部关闭的时候触发的事件
//process.platform判断当前操作系统是不是苹果系统,如果是的话默认不会关闭后台
if (process.platform != "darwin") app.quit();
});
//当窗口打开时触发的事件
app.on("activate", () => {
createWindow();
});
});
解决css样式问题
//下面的代码是main.js的代码
//导入窗口模板
const { BrowserWindow, app } = require("electron");
const path = require("path");
//创建窗口
const createWindow = () => {
const mainWindow = new BrowserWindow({
width: 300,
height: 300,
// 是否置顶
alwaysOnTop: true,
// 打开软件之后希望距离左边屏幕多少像素
x: 1200,
//打开软件之后希望距离上边屏幕多少像素
y: 100,
// 是否取消顶部
frame: false,
// 是否将窗口透明化
transparent: true,
});
//设置缩放比例是1
mainWindow.setAspectRatio(1);
// 打开一个网站
// mainWindow.loadURL("https://m2.trtst.com/index");
// 打开文件的同时打开控制台
// mainWindow.webContents.toggleDevTools();
// 打开html文件
mainWindow.loadFile(path.resolve(__dirname, "index.html"));
};
app.on("window-all-closed", () => {
//当窗口全部关闭的时候触发的事件
//process.platform判断当前操作系统是不是苹果系统,如果是的话默认不会关闭后台
if (process.platform != "darwin") app.quit();
});
//当窗口打开时触发的事件
app.on("activate", () => {
createWindow();
});
});
接下来是html和css
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>day01</title>
<style>
* {
padding: 0;
margin: 0;
}
/* 设置为可以鼠标左键可以拖动 */
html {
-webkit-app-region: drag;
}
/* 设置鼠标左键可以拖动 */
textarea {
-webkit-app-region: no-drag;
}
body {
width: 100vw;
height: 100vh;
}
div {
height: 100vh;
background-color: #ff641e;
border-radius: 50%;
overflow: hidden;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
vite脚手架和electron结合
-
首先创建一个vue项目npm init vue@latest
-
安装electron pnpm add -D electron
-
安装concurrently,这个包是为了可以同时启动多个服务----------------------安装命令pnpm add concurrently
-
将package.json文件里面的dev设置成为 "dev": "concurrently "vite" "nodemon --exec electron . "",
-
给定主线程执行文件package中的main设置为main.cjs
-
main.js代码
//第一步在根目录下面创建Index.html //第二部就可以使用了代码如下 //导入窗口模板 const { BrowserWindow, app } = require("electron"); //创建窗口 app.whenReady().then(() => { const mainWindow = new BrowserWindow({ width: 1200, height: 800, // 是否置顶 alwaysOnTop: true, // 打开软件之后希望距离左边屏幕多少像素 x: 1500, //打开软件之后希望距离上边屏幕多少像素 y: 100, }); // 打开一个网站 mainWindow.loadURL("http://localhost:5173/"); }); -
运行pnpm dev
解决网络安全处理
当没有配置安装策略时,Electron会报出警告,你可以在渲染进程的开发者工具中查看到。
CSP
内容安全策略(CSP) 是应对跨站脚本攻击和数据注入攻击的又一层保护措施。 我们建议任何载入到Electron的站点都要开启。
定义方式
访问内容均来自项目资源
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'" />