如果你想要一款todo软件,就用Electron+Vue做一个吧!

1,205 阅读3分钟

前言

  前几天在水掘金的时候,无意间看到“玩具车”大佬的《我在阿里是怎么工作的——写在阿里入职一周年》,对四象限分析着了迷,然后想在市面上找现成的todo软件,没找到,于是,就自己做一个吧!

1626680304(1).jpg

一、物料准备

  • electron 12
  • node 14.17.2
  • Vue2
  • Vue-cli 4.5.9

二、万事开头难:搭建脚手架

  electron-vue脚手架太古老了,这里直接用Vue-cli4+vue-cli-plugin-electron-builder来完成项目搭建。

  1. 使用vue-cli完成项目创建
  2. 添加vue-cli-plugin-electron-builder:vue add vue-cli-plugin-electron-builder,选择electron12   在这个过程中,一般不会出错;完成之后,会在目录里生成一个background.js文件,这是electron的入口文件。

image.png

  同时,package.json文件中会多出两条命令:electron:serve开发模式、electron:build打包

image.png

三、中间难:用Electron完成一个壳子

  这个壳子要实现的功能如下:

  • 最大化
  • 最小化
  • 关闭到托盘
  • 托盘功能

1、改造窗口:

  frame设置为false,去除原生工具框;enableRemoteModule设为true,是为了使用remote,方便子进程和主进程通信;

image.png

2、自定义头部组件

  头部组件(Header.vue文件)实现了最大化、最小化、关闭三个功能。 image.png   引入remote,获取当前主进程对象

  import { remote } from 'electron'
  const win = remote.getCurrentWindow()

  最大化、最小化、关闭:

    // 最小化
    minimize() {
      win.minimize()
    },
    // 最大化
    maximize() {
      if (win.isMaximized()) {
        win.unmaximize()
      } else {
        win.maximize()
      }
    },
    // 关闭
    close() {
      this.$confirm('此操作将退出播放器, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          // win.destroy(); //这里之前用的是close,发现并不管用,用destroy就好使
          win.hide()
        })
        .catch((e) => {
          console.log(e)
        })
    }

3、实现托盘功能

  在background.js文件中,引入path、Tray、Menu

image.png

在ready事件中,进行处理:

app.on("ready", async () => {
  if (isDevelopment && !process.env.IS_TEST) {
    // Install Vue Devtools
    try {
      // await installExtension(VUEJS_DEVTOOLS);
    } catch (e) {
      console.error("Vue Devtools failed to install:", e.toString());
    }
  }
  createWindow();
  tray = new Tray(path.join(__dirname, '/favicon.ico'))
  tray.setToolTip('todo') // 鼠标放上去显示的文字;
  // 托盘左键控制显示隐藏
  tray.on('click', () => {
    // 点击图标的响应事件,这里是切换主窗口的显示和隐藏
    if (win.isVisible()) {
      win.hide()
    } else {
      win.show()
    }
  })
  // 右键:
  tray.on('right-click', () => {
    const menuConfig = Menu.buildFromTemplate([
      {
        label: '退出',
        click: () => win.destroy()
      }
    ])
    tray.popUpContextMenu(menuConfig)
  })

});

四、结尾难:用element完成内容

  UI如图所示,在此,特别鸣谢我的UI朋友,拯救了我的审美。

  • table内容存储于本地localStorage中
  • 点击进度、分数可进行编辑;
  • 右上角点击新增;
  • 扩展信息展示:创建时间、投入时间;

image.png

五、坑点

  1. tray对象要设为全局变量,如果为局部变量,会被垃圾回收,导致托盘图标闪一下就消失。
  2. 安装VUEJS_DEVTOOLS失败,你需要kexue上网,我的朋友;当然,可以直接注释掉这个插件。

image.png

image.png

  1. __dirname路径:在此系统中,__dirname指向dist_electron。
  2. 发现electron12这一版,close事件不起作用,使用destroy代替。
  3. 打包过程中,无法下载electron,github网络不稳,下载不下来。可以使用环境变量:淘宝镜像。

image.png 6.开发过程中,发现node全局变量报错;解决方案:在vue.config.js中添加如下配置:

image.png