码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14307996.html

在之前总结了一篇自学笔记,通过之前学习到的方法和知识,完成了一个较为简单的桌面应用程序,Electron 实现桌面计算器,并打包成 .exe 可执行文件和可安装包文件

简要绘制一下该Demo的主要功能:

简短描述一下所用到的基础知识:

  1. 初始化应用,创建窗口,加载内容

  2. 设置菜单文件,main.js 引入菜单文件

  3. 渲染进程创建子窗口

  4. 渲染进程与主进程之间通讯

  5. 执行用户选择操作,并进行本地缓存,便于下次启动应用时,读取用户设置

  6. 项目文件目录结构

准备工作

  1. 创建一个空的文件夹,并创建入口 main.js 文件,计算器必要文件,计算器的代码,此处就不贴了,已上传至百度云,可自行下载

  2. 安装electron

    • npm init -y:初始化配置文件 package.json

    • npm i electron

  3. 创建文件夹及文件

    • 主进程菜单文件:./main-process/calculatorMenu.js

    • 渲染进程颜色文件:./render-process/calculatorColor.js

main.js:基本构建

  1. // app:控制应用的生命周期 BrowserWindow: 创建浏览器窗口
  2. const { app ,BrowserWindow, ipcMain} = require('electron');
  3. const path = require('path');
  4. // 引入设置菜单文件
  5. require('./main-process/calculatorMenu');
  6. app.on('ready',ny_createWindow)
  7. let win;
  8. // 创建窗口
  9. function ny_createWindow(){
  10. win = new BrowserWindow({
  11. width:345,
  12. height:370,
  13. webPreferences: {
  14. nodeIntegration: true,
  15. enableRemoteModule: true,
  16. }
  17. });
  18. // 加载内容
  19. win.loadURL(path.join(__dirname, './calculator/index.html')) // 计算器
  20. win.on('close',function(){
  21. win = null; // 关闭窗口
  22. app.quit(); // 关闭应用
  23. })
  24. }

./main-process/calculatorMenu.js

  1. // 1.创建菜单模板
  2. const { Menu, BrowserWindow, app} = require('electron');
  3. const path = require('path');
  4. let template = [{
  5. label: '计算器',
  6. submenu: [{
  7. label: '关于计算器',
  8. click: function () {
  9. ny_createAboutWindow()
  10. }
  11. },
  12. {
  13. label: '退出',
  14. accelerator: 'ctrl+Q',
  15. click: function () {
  16. app.quit();
  17. }
  18. }
  19. ]
  20. },
  21. {
  22. label: '格式',
  23. submenu: [{
  24. label: '颜色',
  25. click: function () {
  26. ny_createColorWindow()
  27. }
  28. },
  29. {
  30. type: 'separator'
  31. },
  32. {
  33. label: '字体增大',
  34. accelerator: 'F11',
  35. click: function (item,win) {
  36. // 主进程 - > 渲染进程 通讯
  37. if(win){
  38. win.webContents.send('add') // 不需要发送数据
  39. }
  40. }
  41. },
  42. {
  43. label: '字体减小',
  44. accelerator: 'F12',
  45. click: function (item,win) {
  46. if(win){
  47. win.webContents.send('cut')
  48. }
  49. }
  50. },
  51. {
  52. label: '默认字体',
  53. accelerator: (function () {
  54. return 'ctrl+0'
  55. })(),
  56. click: function (item,win) {
  57. if(win){
  58. win.webContents.send('normal')
  59. }
  60. }
  61. }
  62. ]
  63. }
  64. ]
  65. // 2.构建菜单,实例化一个菜单对象
  66. let menu = Menu.buildFromTemplate(template);
  67. // 3. 把菜单对象设置到应用中
  68. Menu.setApplicationMenu(menu);
  69. // 4.创建 about 窗口
  70. function ny_createAboutWindow() {
  71. let win = new BrowserWindow({
  72. width: 284,
  73. height: 198
  74. })
  75. win.loadURL(path.join(__dirname, '../calculator/about.html'));
  76. // 子窗口不要菜单
  77. win.setMenu(null)
  78. win.on('close', function () {
  79. win = null;
  80. })
  81. }
  82. // 5.创建 color 窗口
  83. function ny_createColorWindow() {
  84. let win = new BrowserWindow({
  85. width: 260,
  86. height: 95,
  87. webPreferences: {
  88. nodeIntegration: true
  89. }
  90. });
  91. win.loadURL(path.join(__dirname, '../calculator/color.html'));
  92. win.setMenu(null);
  93. win.on('click', function () {
  94. win = null;
  95. })
  96. }

./calculator/color.html

  1. <script>
  2. require('../render-process/calculatorColor');
  3. </script>

./render-process/calculatorColor.js

  1. // 渲染进程
  2. const {ipcRenderer} = require('electron')
  3. //<li data-color="#00ffff" style="background-color: #00ffff;"></li>
  4. let lis = document.querySelectorAll('li');
  5. // 遍历每个li,绑定点击事件 获取对应的颜色值 this.dataset.color, 发送到主进程
  6. for (let i = 0; i < lis.length; i++) {
  7. var li = lis[i];
  8. li.onclick = function(){
  9. ipcRenderer.send('colorToMain',this.dataset.color)
  10. }
  11. }

进程之间的通讯,传递颜色值和字体大小变化的指令

  1. color传值:渲染进程 --> 主进程 --> 渲染进程

  2. fontSize传值:主进程 --> 渲染进程

代码补充:

main.js:

  1. ipcMain.on('colorToMain',function(event,color){
  2. win.webContents.send('colorToRender',color);
  3. })

./calculator/index.js

  1. // 获取屏幕input对象
  2. let txt = document.getElementById("txt");
  3. if (localStorage.getItem('color')) {
  4. txt.style.color = localStorage.getItem('color')
  5. }
  6. if (localStorage.getItem('fontSize')) {
  7. txt.style.fontSize = localStorage.getItem('fontSize')
  8. }
  9. // 接受 Color
  10. ipcRenderer.on('colorToRender', function (event, color) {
  11. txt.style.color = color
  12. localStorage.setItem('color', color)
  13. })
  14. // 字体增大
  15. ipcRenderer.on('add', function (event, data) {
  16. let fontSize = window.getComputedStyle(txt).fontSize;
  17. fontSize = parseInt(fontSize) + 3
  18. txt.style.fontSize = fontSize + 'px'
  19. localStorage.setItem('fontSize',fontSize + 'px');
  20. });
  21. // 字体减小
  22. ipcRenderer.on('cut', function (event, data) {
  23. let fontSize = window.getComputedStyle(txt).fontSize;
  24. fontSize = parseInt(fontSize) - 3;
  25. txt.style.fontSize = fontSize + 'px';
  26. localStorage.setItem('fontSize',fontSize + 'px');
  27. })
  28. // 默认字体
  29. ipcRenderer.on('normal', function (event, data) {
  30. txt.style.fontSize = '30px';
  31. txt.style.color = '#ffffff';
  32. localStorage.setItem('fontSize','30px');
  33. localStorage.setItem('color', '#ffffff')
  34. });

打包为安装包

  • 下载:npm i electron-builder -g

  • electron-builder可以将应用程序打包为安装文件,如.exe .dmg,对于windows系统打包为.exe,对于mac系统打包为.dmg

  • 实现electron-builder的配置,package.json 文件, npm run XXX 执行

    1. "build":{
    2. "appId":"com.test.app",
    3. "productName":"calculator",
    4. "dmg":{
    5. "icon":"./images/mac.icns",
    6. "window":{
    7. "x":200,
    8. "y":150,
    9. "width":540,
    10. "height":380
    11. }
    12. },
    13. "mac": {
    14. "icon":"./images/mac.icns"
    15. },
    16. "win":{
    17. "icon":"./src/img/win.ico"
    18. }
    19. },
    20. "scripts": {
    21. "start": "electorn .",
    22. "buildwin":"electron-builder --win ",
    23. "buildwin":"electron-builder --mac ",
    24. "packager":"electron-packager ./ calculator --platform=win32 --out=./dist --arch=x64 --app-version=1.0.1 --ignore=node_modules --icon=./src/img/win.ico --overwrite ",
    25. }

    上述为应用全部源码,欢迎指教共同学习~~~!

Electron入门Demo之桌面应用计算器笔记(二)的更多相关文章

  1. 《python编程从入门到实践》读书实践笔记(二)

    本文是<python编程从入门到实践>读书实践笔记11章的内容,主要包含测试,为体现测试的重要性,独立成文. 11 测试代码 写在前面的话,以下是我这些年开发中和测试相关的血泪史. 对于一 ...

  2. Electron入门笔记(二)-快速建立hello world

    官方的文档我没有看懂,看了不少别人的博客和文章,终于慢慢看懂了如何快速的建立一个Electron app demo,前一篇文章不是使用官方快速搭建的,而且还出了小问题,所以去撸了一遍quick-sta ...

  3. electron 入门小白贴

    electron 入门小白贴 electron demo 跑起来! 毕设准备是做个 跨平台的做题的客户端,打算用 electron 来弄. 然而今天折腾了半天才终于吧demo给跑起来了.经历了许多的问 ...

  4. Electron - 创建跨平台的桌面客户的应用程序

    Electron 框架的前身是 Atom Shell,可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序.它是基于io.js 和 Chromium 开源项目,并用于在 ...

  5. 【SSH系列】初识spring+入门demo

    学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...

  6. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  7. apollo入门demo实战(二)

    1. apollo入门demo实战(二) 1.1. 下载demo 从下列地址下载官方脚本和官方代码 https://github.com/nobodyiam/apollo-build-scripts ...

  8. lua入门demo(HelloWorld+redis读取)

    1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ...

  9. netty入门demo(一)

    目录 前言 正文 代码部分 服务端 客服端 测试结果一: 解决粘包,拆包的问题 总结 前言 最近做一个项目: 大概需求: 多个温度传感器不断向java服务发送温度数据,该传感器采用socket发送数据 ...

随机推荐

  1. 2020-2021-1 20209307《Linux内核原理与分析》第六周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第六周作业> 这个作业的目标 & ...

  2. 04-flask-模版基础

    Jinja2 概念 Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Fl ...

  3. [日常摸鱼]bzoj3122 [Sdoi]2013 随机数生成器

    又是写了一晚上才过的题- 题意:有一个数列$x_n=(ax_{n-1}+b) mod p$,给你$x_1,a,b,p,t$,求最小的$x_i=t$的$i$,可能不存在 一开始很自然的推出了式子$x_n ...

  4. angualr8 循环对象

    <div *ngFor="let item of object | keyvalue"> {{item.key}}:{{item.value}} </div> ...

  5. 无法获得VMCI驱动程序的版本:句柄无效 (亲测有效! )

    今天在学习Linux 的时候 启动VM时出现了这个问题, 搞了很久终于弄好了, 就写篇博客来记录一下,帮助一下大家,如果对大家有帮助,还请各位哥哥姐姐点个关注,你的支持就是我坚持下去的动力 ! 文章目 ...

  6. 使用IDE练习插件【廖雪峰】

    使用廖雪峰大神的插件,安装过程中,一直出现问题,然后在他的Java教程下面看大家的评论也有点晕了(很多人说的是jar包,结果其实是下的依旧是zip包) 最终解决方法: 将zip包解压到同名文件夹中,再 ...

  7. 讲两个int 数组找出重复的数字 用最少的循环

    int a[] = {1,3}; int b[] = {1,3,5}; int size = a.length>b.length ?a.length:b.length; int valueA = ...

  8. [LeetCode]501. Find Mode in Binary Search Tree二叉搜索树寻找众数

    这次是二叉搜索树的遍历 感觉只要和二叉搜索树的题目,都要用到一个重要性质: 中序遍历二叉搜索树的结果是一个递增序列: 而且要注意,在递归遍历树的时候,有些参数如果是要随递归不断更新(也就是如果递归返回 ...

  9. 【NC基础操作】开发环境配置初体验

    当我们拿到开发工具UAP-STUDIO-6.5.0.2和Home文件的时候,意味着我们可以用这两样东西开始进行项目开发了(默认其他准备已就绪). 运行UAP-STUDIO-6.5.0.2 双击进入&q ...

  10. 分布式一致性协议 Raft

    分布式领域,CP模型下 数据一致性协议至关重要,不然两边数据不一致容易出现数据读混乱问题.像Etcd Consul  zookeeper Eureka ,Redis集群方案这些中间件 都有一致性算法来 ...