Electron学习,从零到一

2018年12月下旬,开始,着手开发一项Electron应用。
目标:将公司现有的一项Android POS收银系统用electron完成,写一款桌面应用,为了解决一些客户不想购买收银POS机,直接可以通过PC完成操作
功能基本上和Android系统保持一致,API接口通用,因为我本身熟悉这套android项目,所以,改写成前端项目,只要会了electron框架和前端技术基本就OK了

VUE部分

由于我本身之前只会一些简单的html语言,css略知一二,项目要用vue,于是我刷了不少vue的课程,现在80%的掌握了吧,我选择b站和慕课搜vue教程,刷视频课 【web前端】vue2.0+node.js项目实战
慕课-3小时速成 Vue2.x 核心技术
补基础,加练习,再跟着官网文档细细看。
但是视频这种东西看多了容易产生假象,由如感觉看会了,实操一写又写不出来,容易卡住,这其实可能看视频带来的害处,自我动手解决问题的能力没有得到培养。而且学新东西靠视频教程是慢的,适合学生党在学校刷,但是我的话还是觉的直接靠文档上手会略显生疏,所以这个还是看个人吧,但是重点都是要自己实际动手去敲才能学会,靠实战学习是最快的
补文档:
1.细看es6入门教程,大概3天到一周时间。
ECMAScript 6 入门
2.熟悉脚手架构建工具,0.5天。
3.上手官方VUE原汁原味,大约2天~5天。
vue教程

Electron部分

Electron 文档文档还是很详细的,大致过一遍知道都有什么,然后需要用到什么再去查就好了,electron项目大致搭建好了,页面还都是vue的,然后菜单啊窗口啊等等才需要查文档

electron系统的教程不多,我还在csdn买了一套实战专题,刷了一些吧,感觉就是在过文档,就那样吧,不太建议买,Electron实战专题
最近慕课又推出一个 Electron开发仿网易云音乐播放器不知道如何,最近不做前端项目了也没怎么看,有兴趣的可以看看反正至少比csdn那套值得多
写了半年这个electron积累的书签,放在chrome下账号同步再也不会找不到了呢

书签.png

About Projrct

This project was generated with electron-vue@8fae476 using vue-cli. Documentation about the original structure can be found here.

项目中数据存储用localstorage/electron-store;
数据库用lowdb

关于vuex和storage的区别
1.最重要的区别:vuex存储在内存,localstorage则以文件的方式存储在本地
2.应用场景:vuex用于组件之间的传值,localstorage则主要用于不同页面之间的传值。
3.永久性:当刷新页面时vuex存储的值会丢失,localstorage不会。
注:很多同学觉得用localstorage可以代替vuex, 对于不变的数据确实可以,但是当两个组件共用一个数据源(对象或数组)时,如果其中一个组件改变了该数据源,希望另一个组件响应该变化时,localstorage无法做到,原因就是区别1。

electron-store 用electron-store替代localStorage
https://github.com/sindresorhus/electron-store/issues/17
Many reasons:

  • localStorage only works in the browser process.
  • localStorage is not very fault tolerant, so if your app encounters an error and quits unexpectedly, you could lose the data.
  • localStorage only supports persisting strings. This module supports any JSON supported type.
  • The API of this module is much nicer. You can set and get nested properties. You can set default initial config.

经测试 electron-store窗口关闭依然能存储,lowdb不行,localstorage不行,electron-store 数据存储卸载应用之后依然存在、

因为个人代码问题,想要不改代码解决问题,然后....想在这里删除本地存储的数据, 于是开启找文件之路......
https://github.com/sindresorhus/electron-store

electron-store readme 如图

https://electronjs.org/docs/api/app#appgetpathname

于是就到了这


Electron-vue开发实战2——引入基于Lodash的JSON数据库lowdb

  • 创建

    this.$db 
    .defaults({ posts: this.hungUpOrderList, user: {}, count: 0 })
    .write(); // 一定要显式调用write方法将数据存入JSON 
    
  • 通过set方法来对对象操作

    this.$db
    .set("user", { name: "chai" }) // 通过set方法来对对象操作
    .write();
    
  • 移除

    this.$db
       .get("posts")
       .remove({})
       .write();
    <!-- 还可以通过 lodash-id 提供的 removeById() 来删除指定id的项: -->
    this.$db
       .get("posts")
       .removeById(id)
       .write();
    
  • 删除

    this.$db.unset("user.name").write();
    this.$db.unset("user").write(); 
    

打包用electron-build;

执行"npm run build " 就可以打出正式环境的包,wins下只能打出exe,dmg需要macOS环境编译

项目图标,MAC的logo:"build/icons/icon.icns"

​       wins的logo:"build/icons/icon.ico"

关于安装包的 配置信息在package.json

 关于升级:版本号配置好,编译出正式包 ,上传OSS,上传build文件夹下的yml文件,和.exe安装包       
(升级是electron根据配置文件,自动判断,版本号配置好,无需修改配置文件,上传即可)
更新electron-update全量更新

electron 部分常用功能的实现

PS:这是项目过程中别人总结的哈哈哈哈哈

==electron-updater 4.0以上升级不好用==

1、在主程序中main=》index.js
引入 import { autoUpdater } from 'electron-updater'
在 import {app,BrowserWindow,ipcMain} from 'electron' 引入 设置一个ipcMain
2、// 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写
在mianjs主线程里附加以下代码:

function updateHandle() {
    let message = {
        error: '检查更新出错',
        checking: '正在检查更新……',
        updateAva: '检测到新版本,正在下载……',
        updateNotAva: '现在使用的就是最新版本,不用更新'
    }
    //let uploadUrl = 'https://xuexuedian.cn/download/'
    let uploadUrl = 'http://guang-1251835114.file.myqcloud.com/dowload/'
    
    autoUpdater.setFeedURL(uploadUrl)
    autoUpdater.on('error', function(error) {
        console.log(error)
        sendUpdateMessage(message.error)
        sendUpdateMessage(error)
    })
    autoUpdater.on('checking-for-update', function() {
        sendUpdateMessage(message.checking)
    })
    autoUpdater.on('update-available', function(info) {
        sendUpdateMessage(message.updateAva)
    })
    autoUpdater.on('update-not-available', function(info) {
            sendUpdateMessage(message.updateNotAva)
        })
        // 更新下载进度事件
    autoUpdater.on('download-progress', function(progressObj) {
        mainWindow.webContents.send('downloadProgress', progressObj)
    })
    autoUpdater.on('update-downloaded', function(event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
        ipcMain.on('isUpdateNow', (e, arg) => {
            console.log(arguments)
            console.log('开始更新')
            autoUpdater.quitAndInstall()
        })
        mainWindow.webContents.send('isUpdateNow')
    })
    ipcMain.on('checkForUpdate', () => {
        console.log('检查更新------》')
        autoUpdater.checkForUpdates()
    })
}       

3、// 通过main进程发送事件给renderer进程,提示更新信息,紧接着是在mianjs里创建以下方法:

function sendUpdateMessage(text) {
mainWindow.webContents.send('message', text)
}

4、主程序中的调用

在 function createWindow() 中添加 updateHandle() //触发更新需求的

5、在页面上APP.vue 或者其他页面设置触发更新按钮

   if (window.require) {//检查更新的
        console.error('------开始检查更新------')
        var ipcRenderer = window.require('electron').ipcRenderer
        ipcRenderer.send('checkForUpdate')
        ipcRenderer.on('message', (event, text) => {
          //console.log('---->', event)
          console.log('返回消息', text)
          this.tips = text
        })
        ipcRenderer.on('downloadProgress', (event, progressObj) => {
          console.log('下载', progressObj)
          this.progress = progressObj.percent
          this.downloadPercent = progressObj.percent || 0
        })
        ipcRenderer.on('isUpdateNow', () => {
          console.log('是否现在更新')
          this.$confirm('有新版本啦。。是否现在更新?', '提示', {
            confirmButtonText: '马上更新',
            cancelButtonText: '稍后更新',
            type: 'warning'
          }).then(() => {
            ipcRenderer.send('isUpdateNow')
          })
        })
      }
      

6、配置文件修改(package.json)
"build": {}中尾端添加
"publish": [ { "provider": "generic", "url": "http://guang-1251835114.file.myqcloud.com/dowload/" } ]

7、祝你好运,第五点可根据自己的方式来触发,自动触发都阔以,谢谢!


关于打印
搜索静默打印,我就是用他们博客的Demo写的,就是新建一个不显示窗口,ipc传输数据,调用打印
目前打印只能在wins上安装驱动,打印机要在连接成功状态下可用,所以应用内打印如果有问题先去打印机处排查是否连接,如果换打印机,安装对应的驱动,连接成功,在应用内选择你连接成功的打印机即可

开发过程中遇到的比较不好解决的问题
打包过程中,1.显示空白,npm run build就好了,改了package.json 配置
2.图片资源文件显示不出来 ==> /static改为./static

以下还有我在写项目过程中记录在有道云笔记里的内容

———— 我还会记录一些网址 ————

快速上手Element UI 库

vue-element-admin 是一个后台前端解决方案,它基于 vueelement-ui实现

使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)

用 Electron 打造跨平台前端 App

Electron系列教程——第一篇:入门

Vue学习看这篇就够

苏南大叔关于electron的相关文章,基本上遇到的80%都可以在这找到答案

———————— 以上差不多是我这半年来接触electron所记录的大部分了,关于项目代码毕竟属于在公司的东西,就不粘贴任何代码了,也没有单独记录过,现在已经重新写安卓项目了,这些东西整理记录出来,方便以后查找,感觉网上相关的并不系统,至少对曾经前端小白来说是这样————————

————整理的来自各位大佬的输出
over

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270