Electron-vue 安装、问题、技术点

1.创建Electron-vue 项目

vue init simulatedgreg/electron-vue my-project

2.遇到的bug

1.控制台,如下报错

控制台报错
解决办法

在.electron-vue的文件夹中的dev-runner.js文件

做如下图修改

  const server = new WebpackDevServer(
      compiler,
      {
        contentBase: path.join(__dirname, '../'),
        quiet: true,
        // hot: true,
        // hot: false,
        // 原 hot为true
        before (app, ctx) {
          app.use(hotMiddleware)//原,此行被注释
          ctx.middleware.waitUntilValid(() => {
            resolve()
          })
        }
      }
    )

注释掉hot
将原来的 app.use(hotMiddleware)注释打开

2.项目打包发布时报错(一)

截图:

在这里插入图片描述

原因:
.electron-vue\build.js文件中,tasks变量重复命名了

在这里插入图片描述

解决办法:
修改其中一对的tasks变量名,需要注意的是本文件中一共包含四个tasks,前两个是一对,后两个是一对,修改时请对应修改。

3.项目打包发布时报错(二)

image.png

原因:
.electron-vue\build.js文件中,代码中使用了 Multispinner ,但没有在开头引用,并且package.json文件中也没有这个依赖文件。

解决办法:
先安装 Multispinner ,再在文件中引用

npm install multispinner -D

const Multispinner = require('multispinner')

4.项目打包发布时报错(三)

Error: C:\Users\Administrator\AppData\Local\electron-builder\Cache\nsis\nsis-3.0.3.2\Bin\makensis.exe exited with code 1Output:
Command line defined: "APP_ID=com.example.yourapp"
Command line defined: "APP_GUID=1fb8a7aa-e784-579d-a981-2142d5507b97"
Command line defined: "UNINSTALL_APP_KEY=1fb8a7aa-e784-579d-a981-2142d5507b97"
Command line defined: "PRODUCT_NAME=my-project"
Command line defined: "PRODUCT_FILENAME=my-project"
Command line defined: "APP_FILENAME=my-project"
Command line defined: "APP_DESCRIPTION=An electron-vue project"
Command line defined: "VERSION=0.0.1"
Command line defined: "PROJECT_DIR=F:\2017ѧϰ����\3. ���濪��\my-project"
Command line defined: "BUILD_RESOURCES_DIR=F:\2017ѧϰ����\3. ���濪��\my-project\build"

解决办法:
electron项目路径不能有中文!

5.electron-vue与vuetify整合出现报错:If you‘re seeing “$attrs is readonly“

如题所示,正常情况下electron-vue与vuetify的整合,因为就是vue与vuetify的整合,按照一般的推荐方法,基本不会出错,但是,这里因为electron-vue项目采用了webpack打包构建,导致了问题:

在这里插入图片描述

解决办法:
我们可以找到项目根目录下.electron-vue目录下的webpack.renderer.config.js文件,找到如下代码:

let whiteListedModules = ['vue']

增加一个"vuetify" 。


image

再次运行npm run dev,项目正常启动,窗口程序显示正常,不再报错

3.功能

功能一:最小化 最大化 关闭

index.vue

mixBtn() {
    console.log('最小化')
    this.$electron.ipcRenderer.send('minBtn')
},
maxBtn() {
    this.$electron.ipcRenderer.send('maxBtn')
    console.log('最大化')
},
closeBtn() {
    this.$electron.ipcRenderer.send('closeBtn')
    console.log('关闭')
},

在main文件中新建一个js ipcMain.js

var {ipcMain,BrowserWindow} = require('electron')

// 获取当前窗口对象
let win = BrowserWindow.getFocusedWindow()
// 最小化
ipcMain.on('minBtn', (e, data) => {
    console.log('minBtn')
    win.minimize()
})
// 最大化
ipcMain.on('maxBtn', (e, data) => {
    // 判断当前是否是最大化
    if (win.isMaximized()) {
        win.unmaximize()
    } else {
        win.maximize()
    }
})
// 关闭
ipcMain.on('closeBtn', (e, data) => {
    win.close()
})  

功能二:打开外部浏览器

this.$electron.shell.openExternal(url)

功能三:监听网络变化

app.vue 里面全局执行

// 有网
 window.addEventListener('online', () => {
    // alert('有网')
 })
// 无网
window.addEventListener('offline', () => {
     alert('没有网')
})

功能四:右键弹出菜单

app.vue 全局监听

// 监听用户右键
    window.addEventListener('contextmenu',()=>{
     this.$electron.ipcRenderer.send('contextmenu')
   })

在main文件里面新建一个menu.js

var {Menu,ipcMain,BrowserWindow} = require('electron')


// 右键弹出菜单
const contextMenuGroup = [{
    label: '复制',
    role: 'copy'
}, {
    label: '黏贴',
    role: 'paste'
}, {
    type: 'separator' //分割线
}, {
    label: '刷新',
    role: 'reload'
}, {
    label: '其他功能',
    click: () => {
        console.log('1111111111')
    }
}]

const contextmenu = Menu.buildFromTemplate(contextMenuGroup)
ipcMain.on('contextmenu', (e, data) => {
    contextmenu.popup(BrowserWindow.getFocusedWindow())
})

功能五:点击右上 角关闭按钮隐藏到托盘 双击显示

(function() {
    var {Menu,Tray,app,BrowserWindow} = require('electron');
    // 创建系统托盘
    const path = require('path');
    var appIcon = new Tray(path.join(__dirname, '../renderer/assets/favicon2.ico'));

    // 新建菜单
    const menu = Menu.buildFromTemplate([{
        label: '设置',
        click: function() {} //打开相应页面 
    }, {
        label: '帮助',
        click: function() {}
    }, {
        label: '关于',
        click: function() {}
    }, {
        label: '退出',
        click: function() {
            // BrowserWindow.getFocusedWindow().webContents().send('close-main-window');
            app.quit();
        }
    }])
    // 鼠标放在托盘上显示名称
    appIcon.setToolTip('my best app');
    appIcon.setContextMenu(menu);

    let win = BrowserWindow.getFocusedWindow();

    // 监听任务栏图标的单击、双击事件
    appIcon.on('double-click', () => {
        console.log(win);
        win.show();
    })
    // Electron 点击右上角关闭按钮隐藏任务栏图标
    win.on('close', (e) => {
        console.log(win.isFocused());
        if (!win.isFocused()) {
            win = null;
        } else {
            e.preventDefault(); /*阻止应用退出*/
            win.hide(); /*隐藏当前窗口*/
        }
    })
})()

功能六:渲染线程给主线程发送信息

***.vue 渲染页面

this.$electron.ipcRenderer.send('minBtn')

***.js主线程页面

ipcMain.on('minBtn', (e, data) => {
    console.log('minBtn')
})

功能七:主线程给渲染线程发送信息

(第一种)

***.js主线程页面

ipcMain.on('minBtn', (e, data) => {
    console.log('minBtn')
       e.sender.send('replay','收到了消息')
})

***.vue 渲染页面

this.$electron.ipcRenderer.on('replay', (e, data) => {
    console.log('-------------')
    console.log(data)
})
(第二种)

渲染进程

const msg = this.$electron.ipcRenderer.sendSync('msg-a')
console.log(msg)

主进程

ipcMain.on('msg-a', (e, data) => {
    console.log('minBtn')
    e.returnValue = 'hello'
})
(第三种)

主进程

BrowserWindow.getFocusedWindow().webContents.send('replay','sddsfdfdf')

渲染页面

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

推荐阅读更多精彩内容