• 从零开始搭建Electron项目(二)之例程解析


    本专栏,前面学习了怎么下载例程并运行。

    这里解析例程的构成

    从零开始搭建Electron项目之运行例程-CSDN博客文章浏览阅读22次。最好的学习方式就是:给一段能够运行的代码示例。本文给出了例程资源,以及运行的步骤。在国内开发electron有一点特别不好,就是如果不爬梯子,下载依赖容易出错。https://blog.csdn.net/kissgoodbye2012/article/details/139572779?spm=1001.2014.3001.5501

    学习资源:

    app | Electron控制应用程序的事件生命周期。icon-default.png?t=N7T8https://www.electronjs.org/zh/docs/latest/api/app

    一、例程结构

    使用vscode打开源码文件夹。

    1.1 package.json 程序全局配置

    这个文件的主要作用是在运行程序或者打包程序时使用

    运行程序:运行cnpm start时,从该文件的scripts下的start启动程序。其他是程序全局的描述信息,如程序名称、程序版本等。main项说明了程序的入口函数:main.js。dependencies项说明程序的依赖关系。

    打包程序:build项,确定了打包程序的配置。这个例程没有,后续到需要打包程序时我们再讲解。

    1.2 main.js 主进程

    这是程序的入口程序,也是程序的主线程,主要作用:管理程序的生命周期

    下面的代码注释我加上去的。分为 几个部分,其中定义了几个函数,占了很大的篇幅,将它们折叠后会发现,条理会很清晰。

    1. // 第三方包 electron-updater 来实现自动更新的功能
    2. // 需要搭配update.js 文件
    3. //require是node.js的动态加载方法
    4. require('update-electron-app')({
    5. //使用第三方包 日志
    6. logger: require('electron-log')
    7. })
    8. // path是node 内置模块 拼接路径
    9. const path = require('path')
    10. //第三方包glob,详见:https://blog.csdn.net/weixin_45188187/article/details/117921803
    11. const glob = require('glob')
    12. //引入两个模块:app 和 BrowserWindow
    13. //app 模块,控制整个应用程序的事件生命周期。
    14. //BrowserWindow 模块,它创建和管理程序的窗口。
    15. const {app, BrowserWindow} = require('electron')
    16. const debug = /--debug/.test(process.argv[2])
    17. //process.mas(主进程),进程的参数
    18. if (process.mas) app.setName('Electron APIs')
    19. // 定义全局变量
    20. let mainWindow = null
    21. //定义函数initialize,初始化
    22. function initialize () {
    23. //后面定义了该函数,使之为单例模式
    24. makeSingleInstance()
    25. //后面定义了该函数,导入所有js文件
    26. loadDemos()
    27. //定义函数,创建窗口
    28. //********************** createWindow,begin*************************/
    29. function createWindow () {
    30. //const定义常量
    31. const windowOptions = {
    32. width: 1080,
    33. minWidth: 680,
    34. height: 840,
    35. // 返回 string - 当前应用程序的名称,即为该应用程序 package.json 文件的 name 字段。
    36. title: app.getName(),
    37. //配置安全策略,详情见:https://blog.csdn.net/qq_30386941/article/details/127550392
    38. webPreferences: {
    39. nodeIntegration: true
    40. }
    41. }
    42. if (process.platform === 'linux') {
    43. // Node中的__dirname(前面有两个下划线)是一个全局变量,用来确定当前运行的文件所在的目录。
    44. windowOptions.icon = path.join(__dirname, '/assets/app-icon/png/512.png')
    45. }
    46. //新建窗口
    47. mainWindow = new BrowserWindow(windowOptions)
    48. //加载页面
    49. mainWindow.loadURL(path.join('file://', __dirname, '/index.html'))
    50. // 在打开 DevTools 的情况下全屏启动, 用法: npm run debug
    51. if (debug) {
    52. mainWindow.webContents.openDevTools()
    53. mainWindow.maximize()
    54. require('devtron').install()
    55. }
    56. mainWindow.on('closed', () => {
    57. mainWindow = null
    58. })
    59. }
    60. //********************** createWindow,end*************************/
    61. //1. 初始化应用之后,会触发监听 ready 事件
    62. app.on('ready', () => {
    63. createWindow()
    64. })
    65. app.on('window-all-closed', () => {
    66. if (process.platform !== 'darwin') {
    67. app.quit()
    68. }
    69. })
    70. app.on('activate', () => {
    71. if (mainWindow === null) {
    72. createWindow()
    73. }
    74. })
    75. }
    76. // 将此应用程序设为单个实例应用程序。
    77. //
    78. // 当尝试启动第二个实例时,将恢复并聚焦到主窗口,
    79. // 而不是打开第二个窗口。
    80. //
    81. // 如果应用程序的当前版本应该退出而不是启动,
    82. // 则返回true.
    83. function makeSingleInstance () {
    84. if (process.mas) return
    85. app.requestSingleInstanceLock()
    86. app.on('second-instance', () => {
    87. if (mainWindow) {
    88. if (mainWindow.isMinimized()) mainWindow.restore()
    89. mainWindow.focus()
    90. }
    91. })
    92. }
    93. // 在主进程目录中需要的每个 JS 文件
    94. function loadDemos () {
    95. const files = glob.sync(path.join(__dirname, 'main-process/**/*.js'))
    96. files.forEach((file) => { require(file) })
    97. }
    98. //运行初始化
    99. initialize()

    Import 和 Require 的区别 在 TypeScript 中,import 和 require 都可以用来引入模块。但是它们之间有一些区别:

    import 是 ES6 中的语法,它会被 TypeScript 编译器解析和处理。

    require 是 Node.js 中的模块加载语法,它是动态加载的,不会被 TypeScript 编译器处理。

    程序初始化时加载了index.html,这个是页面的文件。

    1.3 index.html 主页面

    这个定义了页面的布局,完全是web技术了

    里面的data-section定义了,点击按钮后,加载html文件。这里是section下的menus.html

    二、总结

    这是一个简单的示例。使用了nav导航栏。

    点击后,在不同的html文件定义页面间跳转。

  • 相关阅读:
    React面试:谈谈虚拟DOM,Diff算法与Key机制
    学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业
    6、Selector
    2333. 最小差值平方和-排序加二分查找,力扣c语言题解
    绿色新动力,算力“零”负担——JASMINER X4系列火爆热销中
    计算机毕业设计springboot+vue基本微信小程序的学习资料共享小程序
    ESP8266使用记录(一)
    【STM32】HAL库——串口中断只接收到两个字符
    <Android开发> 开发工具python- 之-pip安装使用说明
    搞定“项目八怪”,你就是管理高手!
  • 原文地址:https://blog.csdn.net/kissgoodbye2012/article/details/139577256