相关文章推荐
冷静的毛豆  ·  基于 K-Means ...·  2 年前    · 

Electron跨平台桌面应用程序开发框架入门简介及学习笔记

Electron是什么及它的优势 (摘自网络)

Electron简介

Electron 是是 GitHub 开发的一个开源框架。它允许使用 Node.js(作为后端)和 Chromium(作为前端)完成桌面 GUI 应用程序的开发。

Electron 可以用于构建具有 html、css、JAVAScript 的跨平台桌面应用程序,它通过将 Chromium 和 node.js 合同一个运行的环境中来实现这一点,应用程序可以打包到 mac、windows 和 linux 系统

Electron为前端技术人员利用web前端技术开发桌面应用带来了可能,开发人员可利用已经掌握的前端技术如Html、CSS、JavaScript,以及结合一些前端技术框架:Vue、Angular、React、webpack,加之浏览器渲染引擎、Electron封装的系统API快速实现一款桌面应用的开发,Electron做了大部分复杂的工作,开发人员只需要专注在核心业务和前端技术本身。同时,通过一定的优化,Electron可以做到很好的体验。

支持平台

目前支持 Electron 的平台有 OS X、Windows、Linux:

  • OS X:对于 OS X 系统仅有 64 位的二进制文档,支持的最低版本是 OS X 10.8。
  • Windows:仅支持 Windows 7 及其以后的版本,之前的版本中是不能工作的。对于 Windows 提供 x86 和 amd64 (x64) 版本的二进制文件。需要注意的是 ARM 版本的 Windows 目前尚不支持。
  • Linux:预编译的 ia32(i686) 和 x64(amd64) 版本 Electron 二进制文件都是在 Ubuntu 12.04 下编译的,arm 版的二进制文件是在 ARM v7(硬浮点 ABI 与 Debian Wheezy 版本的 NEON)下完成的。预编译二进制文件是否能够运行,取决于其中是否包括了编译平台链接的库,所以只有 Ubuntu 12.04 可以保证正常工作,但是 Ubuntu 12.04+ 、Fedora 21、Debian 8 等平台也被证实可以运行 Electron 的预编译版。

Electron的优缺点

Electron 的优点如下所示:

  • 部署升级方便,用户可以通过浏览器就可以访问。
  • HTML/JS/CSS 编写,方便且高效。
  • 可支持 Windows、Linux 、Mac系统。
  • 可让js 前端的生态融入进来 ,让开发员有大量的模块和资源可用(类似python第三方库、 vscode插件)

Electron 的缺点如下所示:

  • 对于开发者而言:浏览器适配比较繁琐。有些应用必须指定浏览器版本(比如 OCX 必须是 IE 内核, H5 必须是较高版本),必须打开浏览器,输入一长串 URL 地址。
  • 打包体积大:一个小应用打包下来可能就需要几十兆,不过目前磁盘存储已经不是什么大问题,随着网路环境越来越好,磁盘容积也越来越大,这个问题给用户带来的负担越来越不明显,几乎可以忽略。
  • 占用内存较在:一般50M起步,多数要100-400M,新版不知道有否优化。毕竟开的是浏览器,有点重。
  • 性能有延迟:在100多ms以上,没有Winform 那么快。
  • 开发有一定复杂度:除需要掌握必要的前端知识外,基于Electron开发仍需要了解跨进程通信的一些知识点,进程上的一些问题往往还是容易给开发者带来一定的困惑,有一定的学习成本,但是通过系统学习还是容易攻克的。
  • 版本更新快:它是基于Chromium的,所以Electron跟随Chromium的版本发布节奏,版本迭代较快,这可能会导致一些兼容问题,但幸运的是目前Electron的核心功能一直都算是很稳定的。
  • 安全问题:Electron提供给了开发人员足够的便利,同时也有一些具有风险的开关,开发者需要在开发中妥善处理,避免对应用客户带来安全隐患,开发人员需要关注安全问题。
  • 对于传统C/S桌面客户端开发者:对 web 应用不习惯,尤其是使用专业c# Delphi 软件,大多数会觉得 web 应用没有桌面应用方便或强大。

Electron开发桌面程序需要的前端技术

Electron是基于Chromium和Node.js实现的,所以开发人员所需要使用到的前端技术主要包括以下方面:

1、Html、CSS、JavaScript、ES6

2、前端开发工具Vue、Angular、React等的一种

3、其他网络、缓存、通讯、系统、跟踪等前端技术

4、对Vscode编辑器的熟悉

基于Electron实现的软件

Electron 现已被多个开源应用软件所使用,其中被广大所熟知和使用的 Atom 、MongoDB桌面版管理工具、Skype桌面版、WhatsApp桌面版、HTTP网络测试工具Postman 、接口管理软件ApiFox 、WhatsAp、Teams、支付宝小程序IDE、 开发人员熟知的Visual Studio Code编辑器就是基于 Electron 实现的。案例将来还会更多。

一、搭Electron

1、使用克隆库来搭建

1)安装git

要先安装git ,安装git, 在任何目录右键 就有相关的命令 文件资源管理器 直接 敲 cmd 随时在当前目录下克隆来创建项目

2)克隆项目

然后git clone github.com/electron/ele

3)安装依赖

克隆后再:cd electron-quick-start

安装依赖并运行(主要是针对package.json 里面的 DevDependencies 这段里面的依赖配置) npm install && npm start 或者 直接 cnpm i (一定要先进入到项目目录,是针对当前文件夹来的) 也可直接下载 Download Zip源码包下来再解压到你指定的文件夹下面

4)运行项目

运行:在package.json 里 Scripts 段里有 一个 start 它模拟 "electron ." 来运行 相当于把 "electron ." 封装成 start 这个命令了。 所以可以 通过: npm start /cnpm start来运行 (npm 是node.js里的)

可看到控制台里 显示 实际执行的是 electron . node_modules :各种依赖库模块 Ct+C 结束运行 Preload.js 是在main.js 讲程创建window时加载的 写在webPreferences 里 监听了DOMContentLoaded事件 使用replacetext来替换 index.html 按指定ID找到几个版本文本 renderer.js 渲染进程 (与index.html 一起组成渲染进程 index.html 引用了 <script src="./renderer.js"></script>

2、使用electron-forge(锻造) 脚手架来搭建 项目

1) npx是node.js 新版 支持的命令

npx create-electron-app my-new-app (推荐用这个) 或 yarn create-electron-app my-new-app

npx相当于多步传统的方式 npm install -g @electron-forge/cli (安装脚手架) 或 cnpm安装 electron-forge init my-new-app cd my-new-app npm start

但npx使用的是npm 可能下载慢或下载不了,可考虑使用cnpm npx运行时控制台可看到简洁的安装过程,最后一步是安装相关的依赖

2)使用Vscode打开项目

项目下载或克隆后,使用Vscode编辑器来打开 生成以下文件会放在src目录下: index.js 主进程 index.html 渲染进程 index.css index.html用到的css

3)运行项目

打开package.json 在scripts节中可看到 "start" : "electron-forge start", 所以你可以使用npm start 来运行 同理,可使用 npm make 来生成exe文件

4)关闭DevTools

运行可看到打开了调试工具 这个是在index.js 主进程的 createWindow 最后使用了一句 mainWindow.webContents.openDevTools();

5)渲染进程重载网页

改完index.html 或index.css后,可以不中止,直接在view-reload 重新加载网页

3、手工写代码来搭建Electron项目,更好理解代码

1)手工创建新项目

先创建项目目录,不能有空格,不能有中文 在vscode 打开这个目录

2)新建3个文件 index.html index.css index.js

在index.html文件中,输入html:5 可产生一个基本的html框架 或 !+Tab键 也可以(必须是html文件中,js文件中不行) 输入div或html+tab (不用 <div> 也可) 再新建main.js 右键 在文件资源管理器打开,再在上面输入cmd 就会自动到达这个目录的命令行 输入 npm init --yes 回车,它就会在当前目录下生成 package.json文件 它会自动找main.js 入口,并配置好入口

也可手工再编辑修改package.json的内容

3)在当前项目安装一下Electron(开发环境)

虽然我们全局已安装了electron ,但输入 electron. 没有代码自动补齐或提示 需要在Vscode 再用cnpm i electron --save-dev 再安装一次, 把它写到package.json中的devDependencies中 依赖里 这样再敲 electron. 代码就会自动提示了 所以建议在项目里面安装一次这个模块

4)Require electron

再引用 const {app,BroserWindow}=require("electron")

5)app添加监听ready事件

再监听应用的 启动事件。需要 事件名 及回调函数

app.on("ready", () => {
    const mainWindows = new BrowserWindows({
        width: 600,
        height: 400

mainWindow.loadFile(path.join( dirname,'index.html')); //path.join dirname 都是node.js的

electron可直接引用node.js里面的东西

在前面要先引用 const path=require('path'); //mainWindow.loadUrl(' github.com '); }

二、开发工具中配置Eslint (js代码检测工具)

1、安装Eslint 插件

ESLint(有时发音为Easy Lint)是一种静态代码分析工具,用于识别JavaScript代码中发现的有问题的模式,可配置

安装此插件后,代码敲错,会有提示 安装:cnpm install -g eslint (全局安装不需要注重目录)

2、项目中配置Eslint插件

cd 到项目的目录 终端下运行:eslint --init 1)选择3种方式,只查找问题,.... ,第3种可强制修改你的格式 (也可右键格式化你的代码 shift+alt+f) 2)再问你是在 javascript modules(import/export) 还是 CommonJS(require/exports) 使用 ,选择这个 (node.js使用是require)

3)再问你是在 React Vue.js None of these (选择这个)

4)然后问你是否使用TypeScript, 选择No

会生成一个 .eslintrc.js 配置文件 (其实就是我们刚才选择的配置)

再回到刚才 错误代码,就有提示了 就是你虽然全局安装了,但需要用eslint --init 在当前项目中使用(其实就是生成一个.eslintrc.js配置文件)

5)使用node 来运行 js文件 随便创建一个文件,内容为 console.log(process.platform) 在终端输入 :node test.js 就可运行 得到是 win32 (windows平台)

三、electron的运行流程

运行electron项目是执行命令:electron .

1、它先找项目中的package.json中的入口

找到 "main": "main.js", 加载这个主进程 它实例化 BrowserWindow ,也就创建了一个渲染进程 它再加载本地的index.html 文件 (html css ) 展示给用户这个应用的页面 再使用IPC 去完成任务 并从主进程得到信息

2、主进程与渲染进程

一个electron应用只有一个主进程,但可以有多个渲染进程,每个Electron中的web页面运行在它自己的渲染进程里

3、进程与线程的区别

进程(Process) :是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调试的基本单位 ,是操作系统结构的基础 线程(Thread): 在一一个程序里的一个执行路线就叫做线程(thread), 更准确的定义是:线程是”一个进程内部的控制序列“ 线程和进程 :一个程序至少有一个进程,一个进程至少有一个线程

4、可在new BrowserWindow 时增加属性 parent:

设置窗体的父窗体

5、在主进程和渲染进程里修改内容怎么刷新

在主进程里修改东西,必须重新运行 electron .

在渲染进程里改东西,可以使用网页-View-Force Reload 来刷新

6、如何在主进程和渲染进程中使用nodejs模块及NodeJs第三方模块

主进程中无需任何配置就可使用Nodejs模块

const fs=require("fs") 主进程打印console.log 需要在终端里看,而不是在浏览器时里的开发工具里的console里看 (DevTools)

渲染进程: 第一种方法: preload 加载的可直接使用 在 new BrowserWindow(查看官网它的详细参数) 时 使用 webPreferences:{ preload:path.join(__dirname,"renderer/preload.js") BrowserWindow通过preload.js 可直接使用nodejs模块

第二种方法:不在preload加载的 如果要在index.html 引用Nodejs的模块 如 index.html里加了 <script src="rederer.js"></script> 在rederer.js 中如果使用 require 就会出错。 必须在main.js 中的创建这个渲染进程 new BrowserWindow (对应那个index.html) 加上下面配置 webPreferences:{ nodeIntegration: true, contextIsolation: false

}

7、加个按钮来显示调用文件的内容

1、在index.html 增加个按钮 <button id="opednFile"> 打开 </button>

2、再定义 <div id="content"> //将来最好改成textArea ,代码显示更美观一些

3、再为 div 增加个样式

4、在renderer.js中要监听按钮单击事件

window.onload = () => {
    contentDom = document.querySelector('#openFile')
    openFileDom = document.querySelector('#content')
    openFileDom.onclick = () => {
        alert('test')
        const fs = require('fso')
        fs.readFile('package.json', (err, data) => {
            if (err) {
                console.log(err)
                return
            console.log(data.toString())
            contentDom.innerHTML = data.toString()

四、调用h5里的拖放Api 及Nodejs实现文件拖放

1、在窗体的 onload 设置 ondragenter ondrop等事件

window.onload = () => {
    var contentDom = document.querySelector('#content')
    // =function() 可改成箭头函数 =()=>
    //阻止这些事件的默认行为
    contentDom.ondragenter = contentDom.ondragover = contentDom.ondragleave = () => {
        return false
    contentDom.ondrop=(e)=>{