最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快。我会在这一篇文章中实现一个HelloWord的应用程序,记录学习过程中的坑。

Electron是什么呢?

Electron 可以让你使用纯 JavaScript 调用丰富的原生(操作系统) APIs 来创造桌面应用。 你可以把它看作一个 Node. js 的变体,它专注于桌面应用而不是 Web 服务器端。

这不意味着 Electron 是某个图形用户界面(GUI)库的 JavaScript 版本。 相反,Electron 使用 web 页面作为它的 GUI,所以你能把它看作成一个被 JavaScript 控制的,精简版的 Chromium 浏览器。

一、环境准备

本地环境:Node.js + npm

# 下面这行的命令会打印出Node.js的版本信息
node -v

# 下面这行的命令会打印出npm的版本信息
npm -vCopy

二、目录结构

从开发的角度来看, Electron application 本质上是一个 Node. js 应用程序。 与 Node.js 模块相同,应用的入口是 package.json 文件。 一个最基本的 Electron 应用一般来说会有如下的目录结构:

your-app/
├── package.json
├── main.js
└── index.html

为你的新Electron应用创建一个新的空文件夹,并新建上述三个文件。

三、package.json

其中package.json的文件内容如下:

{
  "name": "my-app",
  "version": "0.1.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "author": "",
  "license": "ISC"
}

Tips:使用npm init命令可以便捷创建package.json。

四、安装Electron

在终端进入到工程文件夹下进行操作,会在当前目录下安装Electron。

# 局部安装 需要的话追加上 --registry='http://registry.npm.taobao.org' 使用淘宝npm源安装
npm install electron --save-dev
# Windows使用下面语句 64位32位机器都是--win32
npm install electron --save-dev --platform=win32

# 验证安装
node_modules/.bin/electron -v

Tips:--save-dev参数会在package.json文件中导入该依赖到devDependencies属性下,--save参数会导入该依赖到dependencies属性下。

安装过程可能会很慢,正常的话,安装下载进度如下直至完成。

> electron@5.0.6 postinstall /home/qii/electron/eee/node_modules/electron
> node install.js

Downloading tmp-26643-1-SHASUMS256.txt-5.0.6
[============================================>] 100.0% of 4.74 kB (4.74 kB/s)
npm notice created a lockfile as package-lock.json. You should commit this file.

+ electron@5.0.6
updated 1 package and audited 201 packages in 499.235s
found 0 vulnerabilities

Tips:npm安装超时的话一般是网络问题。解决方法

五、main.js

package.json中指定的入口点文件,即程序主文件。

const {app, BrowserWindow} = require('electron')

let mainWindow

// 创建主窗口,设置了宽高等信息
function createWindow () {
  mainWindow = new BrowserWindow({
    width: 1000,
    height: 600,
    webPreferences: {
      // node集成,即是否注入node能力
      nodeIntegration: true
    }
  })

  // 加载主页面内容 index.html
  mainWindow.loadFile('index.html')

  mainWindow.on('closed', function () {
    mainWindow = null
  })
}

app.on('ready', createWindow)

六、index.html

main.js中加载的主窗口文件,即主布局文件

<!DOCTYPE html>
<html>
<head>
    <!-- 此title会覆盖package.json中设置的name,作为应用顶部名称 -->
    <title>my-app</title>
</head>
<body>
    Hello World!
</body>
</html>

七、启动应用

在创建并初始化完成 main.js、 index.html和package.json之后,您就可以在当前工程的根目录执行下述命令来启动刚刚编写好的Electron程序了。

# 进入到包含 package.json 文件的目录
npm satrt

# 或者直接使用脚本启动,别忽略了后面的点
node_modules/.bin/electron .

八、打包应用

以上所述都是在本地开发环境下使用,但如果要给被人使用,就必须得将Electron打包成一个程序包。幸运的是我们可以通过electron-builder将程序打包成Win、Linux、Mac平台都兼容的版本,交给别人之后直接安装即可。

1、安装electron-builder

npm install --save-dev electron-builder

# 验证安装
node_modules/.bin/electron-builder -h

2、开始打包

注意生成各自平台的程序包最好在对应平台上执行,否则可能打包失败

# Linux打包成AppImage文件(在Linux环境上执行)
node_modules/.bin/electron-builder -l AppImage

# Windows打包成exe安装文件(在Windows环境下执行)
node_modules/.bin/electron-builder -w nsis
# 如果在非Windows上打包win程序,也可以借助docker 如下
# docker run --rm -it -v ${PWD}:/project electronuserland/builder:wine sh -c "node_modules/.bin/electron-builder -w nsis"

# Mac打包成dmg文件(在Mac环境下执行)
node_modules/.bin/electron-builder -m dmg

3、最终文件

打包好的程序在当前目录dist文件夹下,如图所示:

  • Linux生成my-app 0.1.0.AppImage文件,双击执行或者./my-app 0.1.0.AppImage执行即可。
  • Windows生成my-app 0.1.0.exe文件,双击安装即可。
  • Mac生成my-app 0.1.0.dmg,双击拖拽安装即可。

4、利用配置文件打包

上面的方法相当于临时打包,每次运行命令的时候都要指定打包命令,虽然很直接,但是有点不太方便,下面用另一种方法来打包,将打包配置写到package.json中 ,方便使用。

打开package.json文件,发现前面的 devDependencies 属性下已经多出了 electron 和 electron-builder 依赖,我们将与打包相关的配置信息全部写在build属性下,再添加脚本命令"dist": "electron-builder"。

{
  "name": "my-app",
  "version": "0.1.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "dist": "electron-builder"
  },
  "author": "",
  "license": "CC0-1.0",
  "devDependencies": {
    "electron": "^6.0.12",
    "electron-builder": "^21.2.0"
  },
  "build": {
    "win": {
      "icon": "icon.png",
      "target": [
        "nsis"
      ]
    },
    "nsis": {
      "allowToChangeInstallationDirectory": true,
      "oneClick": false,
      "menuCategory": true,
      "allowElevation": false
    },
    "linux": {
      "icon": "icon.png",
      "category": "Utility",
      "target": [
        "AppImage"
      ]
    },
    "mac": {
      "icon": "icon.png",
      "type": "development",
      "category": "public.app-category.developer-tools",
      "target": [
        "dmg"
      ]
    }
  }
}

运行命令:

npm run dist

九、进阶之路

Electron给我的认识是使用HTML文件渲染页面组件、使用CSS渲染页面组件的样式,使用JavaScript编写程序的逻辑,且支持Node以及DOM的API。

我在学习Electron的时候,写了一个本地音乐播放器的小项目,在这个项目中涉及了主进程与渲染进程如何通信,如何使用CSS样式,如何使用electron-store本地存储。

项目的地址:https://github.com/yueshutong/SimpleMusicPlayer

欢迎Star!

关于Electron的进阶之路,我推荐下面几个学习网站:

Electron官方开发文档

electron.build官方配置文档

electron-store本地文件存储

icns图标生成指南

Web开发者指南-MDN文档

一款字体图标库

Electron 打包优化

Electron开发跨平台桌面程序入门教程的更多相关文章

  1. 开发微信小程序入门教程,含破解工具

    2016年09月21日晚 微信发不了微信“小程序”的内测版,一时间整个互联网都炸了锅.个大新闻.论坛都在讨论这个事情. 作为互联网的一猿,我们怎能不紧跟时代的脚步.于是第二天上午也对微信发布的“小程序 ...

  2. Electron+Vue开发跨平台桌面应用

    Electron+Vue开发跨平台桌面应用 xiangzhihong发布于 2019-12-23 虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某 ...

  3. CentOS开发ASP.NET Core入门教程

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9891346.html 因为之前一直没怎么玩过CentOS,大多数时间都是使用Win10进行开发,然后程序 ...

  4. 使用c++开发跨平台的程序

    使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各样的语言被广泛使用,相对比来说c++不是那么出彩.c++虽然年龄大, ...

  5. 从零开始的微信小程序入门教程(一)

    之前说要和同事一起开发个微信小程序项目,现在也在界面设计,功能定位等需求上开始实施了.所以在还未正式写项目前,打算在空闲时间学习下小程序.本意是在学习过程中结合实践整理出一个较为入门且不是很厚的教程, ...

  6. 微信小程序入门教程之四:API 使用

    今天是这个系列教程的最后一篇. 上一篇教程介绍了,小程序页面如何使用 JavaScript 脚本.有了脚本以后,就可以调用微信提供的各种能力(即微信 API),从而做出千变万化的页面.本篇就介绍怎么使 ...

  7. DELPHI开发LINUX桌面程序

    DELPHI开发LINUX桌面程序 DELPHI官方目前为止尚不能开发LINUX桌面程序. 但三方控件FmxLinux(商业控件)是可以的.网上有破解版本.

  8. .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。

    介绍: 目前微软还没有跨平台桌面程序的开发框架.github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia.avalonia 采用 Xaml+C#,类似于wpf,可运行于.netf ...

  9. PhoneGap开发手机程序入门教程

    用PhoneGap开发手机移动程序 1.     什么是PhoneGap PhoneGap是一个自由开放源码的开发工具和框架,允许利用HTML + JavaScript + CSS的强大功能在多个手机 ...

随机推荐

  1. jvm 内存溢出

    堆内存溢出 堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java heap space 永久代溢出 类的一些信息,如类名.访 ...

  2. EasyJson 发布

    JSON库很常用了,现在开源的JSON库也有很多.但是我们仍然面临下列问题 1)时不时的爆出这个Json库出现漏洞,那个json库出现漏洞.一旦出现漏洞只能升级,想切换JSON都不成. 2)一个项目中 ...

  3. JQuery学习笔记之手网琴效果

    这种东西在网上多的是,最近在学JQuery,所以就写了个随笔 <!DOCTYPE html> <html lang="en"> <head> & ...

  4. 云原生生态周报 Vol. 21 | Traefik 2.0 正式发布

    作者 | 浔鸣.心水.元毅.源三.衷源 业界要闻 CNCF 计划将 TOC 升至 11 人 技术监督委员会(TOC)是 CNCF 的三大核心管理机构之一,从 2020 年 1 月起,TOC 将从 9 ...

  5. 品Spring:负责bean定义注册的两个“排头兵”

    别看Spring现在玩的这么花,其实它的“筹码”就两个,“容器”和“bean定义”. 只有先把bean定义注册到容器里,后续的一切可能才有可能成为可能. 所以在进阶的路上如果要想走的顺畅些,彻底搞清楚 ...

  6. 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...

  7. springboot系列之04-提高开发效率必备工具lombok

    未经允许,不得转载 原作者:字母哥博客 本文完整系列出自:springboot深入浅出系列 一.前置说明 本节大纲 使用lombok插件的好处 如何安装lombok插件 使用lombok提高开发效率 ...

  8. Idea 配置Jrebel热部署

    虽说Idea自带热更新功能,但是一旦mapper更改,则不能及时更新,影响开发效率. 接下来,我们来配置Jrebel热更新,简单方便实用. 第一步:进入插件下载页面. 第二步:安装jrebel插件. ...

  9. Java8新特性——接口默认方法

    Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个default关键字即可实现默认方法. 为什么要有这个特性? 首先 ...

  10. 离线服务器安装zabbix

    因为机房内的服务器并不是所有都能上外网,所以利用zabbix官方源的安装方法就行不通了,又嫌弃编译安装麻烦,所以这里选择离线RPM包安装zabbix.(如需完整rpm包可以留言与我联系) 下载zabb ...