首页 > 其他分享 >Electron简单使用

Electron简单使用

时间:2023-12-28 15:13:58浏览次数:27  
标签:npm 渲染器 简单 electron Electron 使用 进程 const

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。

Electron 继承了来自 Chromium 的多进程架构,这使得此框架在架构上非常相似于一个现代的网页浏览器。 应用开发者将控制两种类型的进程:主进程 和 渲染器进程。
  • 每个 Electron 应用都有一个单一的主进程,作为应用程序的入口点。 主进程在 Node.js 环境中运行,这意味着它具有 require 模块和使用所有 Node.js API 的能力。主进程的主要目的是使用 BrowserWindow 模块创建和管理应用程序窗口。
  • BrowserWindow 类的每个实例创建一个应用程序窗口,且在单独的渲染器进程中加载一个网页。每个 Electron 应用都会为每个打开的 BrowserWindow ( 与每个网页嵌入 ) 生成一个单独的渲染器进程。 渲染器负责 渲染 网页内容。因此,一个浏览器窗口中的所有的用户界面和应用功能,都应与您在网页开发上使用相同的工具和规范来进行攥写。
预加载(preload)脚本包含了那些执行于渲染器进程中,且先于网页内容开始加载的代码 。 这些脚本虽运行于渲染器的环境中,却因能访问 Node.js API 而拥有了更多的权限。 上下文隔离(Context Isolation)意味着预加载脚本与渲染器的主要运行环境是隔离开来的,以避免泄漏任何具特权的 API 到您的网页内容代码中。上下文隔离功能将确保您的 预加载脚本 和 Electron的内部逻辑 运行在所加载的 webcontent网页 之外的另一个独立的上下文环境里。 这对安全性很重要,因为它有助于阻止网站访问 Electron 的内部组件 和 您的预加载脚本可访问的高等级权限的API 。 在 Electron 中,进程使用 ipcMain 和 ipcRenderer 模块,通过开发人员定义的“通道”传递消息来进行通信。 这些通道是 任意 (您可以随意命名它们)和 双向 (您可以在两个模块中使用相同的通道名称)的。   以上为来自官方文档的介绍和核心概念,下面将之前写的vue3 学习应用写成demo记录下 用到的命令:
# 查看 npm 指定的源地址

npm config get registry
npm config set registry https://registry.npm.taobao.org/
npm config set registry https://registry.npmjs.org/

# 强制重新 build

npm rebuild

# 清除缓存

npm cache clean # 卸载包

npm uninstall package
npm uninstall package --save-dev
npm uninstall package -D

# 创建项目

npm init
npm install electron --save-dev

# 打包并分发应用程序

npm install --save-dev @electron-forge/cli
npx electron-forge import

npm run make

 

将之前的vue3网页应用build到dist目录,并安装electron到dist目录 目录结构如下 :

package.json

{
  "name": "learn-electron",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "electron .",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@electron-forge/cli": "^6.4.2",
    "electron": "^27.0.4"
  }
}

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + Vue</title>
    <script type="module" crossorigin src="./assets/index-30fcb507.js"></script>
    <link rel="stylesheet" href="./assets/index-41f0a336.css" />
  </head>
  <body>
    <div id="app"></div>
    <h4>Hello from electron</h4>
    <p>
      Node.js: <span id="node-version"></span><br />
      Chromium: <span id="chrome-version"></span><br />
      Electron: <span id="electron-version"></span><br />
      api:<span id="api-version"></span>
    </p>
    <p id="info"></p>
    <p id="ping"></p>
    <button id="setTitle">set-title</button>
  </body>
  <!-- 将额外功能添加到网页内容 -->
  <script src="./renderer.js"></script>
</html>

index.js

const { app, BrowserWindow, ipcMain, Menu } = require("electron");
const path = require("node:path");

// app 模块,它控制应用程序的事件生命周期。
// BrowserWindow 模块,它创建和管理应用程序 窗口。
const createWindow = () => {
  let win = new BrowserWindow({
    width: 800,
    height: 600,
    fullscreen: false,
    // 将预加载脚本附加到渲染器流程 预加载脚本在渲染器进程加载之前加载,并有权访问两个 渲染器全局 (例如 window 和 document) 和 Node.js 环境。
    webPreferences: {
      preload: path.join(__dirname, "preload.js"),
    },
  });

  win.loadFile("index.html");
  //  win.loadURL("url");

  // 打开开发工具
  // win.webContents.openDevTools();

  // 隐藏菜单栏
  Menu.setApplicationMenu(null);

  win.on("closed", function () {
    win = null;
  });
};

// 在 Electron 中,只有在 app 模块的 ready 事件被激发后才能创建浏览器窗口。 在whenReady()成功后调用createWindow()。
app.whenReady().then(() => {
  //浏览器进程和主进程双向IPC示例,从渲染器进程代码调用主进程模块并等待结果
  ipcMain.handle("ping", () => "pong");

  // 渲染器进程到主进程单向IPC示例,单向 IPC 消息从渲染器进程发送到主进程,主进程接收消息
  ipcMain.on("set-title", (event, title) => {
    const webContents = event.sender;
    const win = BrowserWindow.fromWebContents(webContents);
    win.setTitle(title);
  });

  createWindow();

  // 如果没有窗口打开则打开一个窗口 (macOS)
  // 当 Linux 和 Windows 应用在没有窗口打开时退出了,macOS 应用通常即使在没有打开任何窗口的情况下也继续运行,并且在没有窗口可用的情况下激活应用时会打开新的窗口。
  app.on("activate", () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

// 关闭所有窗口时退出应用(Windows & Linux);
app.on("window-all-closed", () => {
  if (process.platform !== "darwin") app.quit();
});

 

 preload.js

const { contextBridge, ipcRenderer } = require("electron");

// contextBridge 模块可以用来安全地从独立运行、上下文隔离的预加载脚本中暴露 API 给正在运行的渲染进程。
contextBridge.exposeInMainWorld("e_api", {
  node: () => process.versions.node,
  chrome: () => process.versions.chrome,
  electron: () => process.versions.electron,
  ping: () => ipcRenderer.invoke("ping"),
  setTitle: (title) => ipcRenderer.send("set-title", title),
  api_url: "localhost",
});

window.addEventListener("DOMContentLoaded", () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector);
    if (element) element.innerText = text;
  };

  for (const type of ["chrome", "node", "electron"]) {
    replaceText(`${type}-version`, process.versions[type]);
  }
  replaceText(`api-version`, "localhost");
});

renderer.js

const information = document.getElementById("info");
information.innerText = `This app is using Chrome (v${window.e_api.chrome()}),Node.js (v${window.e_api.node()}),
 and Electron (v${window.e_api.electron()}),api_url (${window.e_api.api_url})`;

const func = async () => {
  const response = await window.e_api.ping();
  document.getElementById("ping").innerText = response;
};
func();

const setTitle = () => {
  window.e_api.setTitle("demo");
};

  

   

标签:npm,渲染器,简单,electron,Electron,使用,进程,const
From: https://www.cnblogs.com/caroline2016/p/17932745.html

相关文章

  • 如何解决使用融云音视频时由于库冲突导致编译不通过的问题
    音视频库里面使用了一些第三方库,比如openssl,libopencore-amrnb等第三方库,如果集成的过程中遇到冲突可以尝试这样修改:1、在BuildSettings中OtherLinkerFlags中把-all_load去掉;2、如果遇到openssl库冲突无法解决,请工单联系我们单独提供不包含openssl库的音视频引擎库......
  • go-使用通道模拟抢到活动
    packagemainimport( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "math/rand" "sync" "time")//用户结构体typeUserstruct{ Idint Namestring Telstring Addressstring}......
  • 【Django进阶】djangorestframework-jwt使用
    简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资......
  • UPX 可执行文件压缩工具的介绍与使用
    UPX是什么UPX全称是"UltimatePackerforeXecutables",是一个免费、开源、编写、可扩展、高性能的可执行程序打包程序。换句话说一个可执行文件的压缩工具。主要的功能是将可执行的二进制程序、动态链接库和其他的二进制文件压缩为更小的体积,UPX通常可以将文件大小减少50%......
  • 使用Linux背后的Shell概念和shebang的正确用法
    1.Shell的作用:解释执行用户输入的命令或程序等用户输入一条命令,shell就解释一条键盘输入命令,Linux给予响应的方式,称之为交互式 2.shebang:指的是现在文本文件中的第一行前两个字符,即#! 3.初步编写shell脚本:3.1vim脚本名.sh:创建脚本,并进入脚本编辑 ......
  • android开发使用mavlink协议
    一、添加依赖库在工程的build.gradle添加implementation'io.dronefleet.mavlink:mavlink:1.1.11'。点击右上角sync二、接收解析数据//ThisexampleusesaTCPsocket,howeverwemayalsouseaUDPsocketbyinjecting//PipedInputStream/PipedOutputStreamtoMavlinkCon......
  • 【C++】使用指针,动态多维数组
    二维数组intm=3,n=2;int**arr;//动态创建二维数组[3][2]arr=newint*[m];//这里是mfor(inti=0;i<m;i++){ arr[i]=newint[n];//这里是n}三维数组intx=3,y=4,z=5;//arr[3][4][5]int***arr;arr=newint**[x];for(inti=0;i<x;i++){......
  • 【史上最易懂】变分推断:从【求分布】的推断问题,变成【缩小距离】的优化问题,用简单的分
    变分推断:从求分布的推断问题,变成缩小距离的优化问题频率学派与贝叶斯学派隐空间和隐变量变分推断完整推导 频率学派与贝叶斯学派学过概率论,应该了解过,概率分为2个学派:频率学派:数据是客观的(看到啥就是啥,隐变量z->观察变量/输入变量x),直接求统计指标即可(似然函数),代表之作像CNN、......
  • 【鱼授之以渔】如何创建和使用视图?
    鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)视图(View)是数据库中的一个虚拟表,它由一个查询定义,并且视图的结果集是根据查询的结果动态生成的。视图可以被视为存......
  • 项目中使用spring.session.store-type=redis和@EnableRedisHttpSession 的区别
    spring项目的session存在哪里SpringSession提供了多种存储策略,可以选择将session存储在内存、数据库或Redis缓存中。内存存储:这是默认的存储方式,适用于单个应用程序的情况。SpringSession会在应用程序启动时创建一个ConcurrentHashMap对象,用于存储session数据。JDBC存......