聊聊vue番茄钟与electron 打包问题

目录
  • 动手
    • 准备工作
      • 功能规划
      • 开发工具
    • 开发过程
      • 创建项目
      • 配置项目
      • 界面编写
      • 主进程和渲染进程文件读存通信
      • 打包

平时对自己学习工作计划安排可以使用番茄钟去规划。

番茄钟:一个很简单的时间管理方法,设置一个固定时间,根据自己情况调整,这个时间是一个倒计时,在这段时间内认真去做一件事情,然后一个番茄钟结束后,休息大概五分钟,重新番茄钟。 这可以帮助我们量化自己的工作和效率,提醒我们休息和工作。

本人之前在手机上下载过番茄钟的应用,但是使用了一段时间后发现对我来说并不能算十分合适,准备制作一个简单的番茄钟应用。

原因:

  • 作为一个程序员,平时工作日都是在使用电脑,手机放在旁边,每次番茄钟到了还要去点手机非常不方便
  • 平时会戴着耳机,可能番茄钟响了都听不到
  • 作为一个前端程序员,难道自己不能写一个电脑上的番茄钟桌面应用工具嘛!!!

动手

准备工作

功能规划

在制作一款番茄钟前肯定要进行规划,先规划自己的番茄钟需要什么功能,然后使用xmind简单画了一下自己需要的功能(版本0.1.0肯定先简单点,下次一定优化)

开发工具

使用的工具:vs code

使用vue cli搭建界面框架,然后通过electron将界面打包成桌面应用。

创建和修改的任务数据在electron通过node进行存储在项目的json文件当中。

开发过程

创建项目

PS:打包坑比较多,关于我在打包那一块趟过的坑准备独立写在另一份markdown里

  • 使用vue create tomato创建出番茄钟项目

  • 然后准备添加需要的包:

electron部分

安装命令:yarn electron electron-builder -D

虽然vue cli可以使用vue add electron-builder安装,但这次我还是用最原始方式来。

vue界面需要的

  • 一些符号可以使用font-awesome来引入
  • 现在我习惯使用less来写css
  • px2rem-loader可以将px转换成rem,虽然对本项目作用不大

安装命令:yarn add less less-loader@7.3.0 font-awesome px2rem-loader

PS: 注意安装的less-loader版本号,如果版本过高,使用less运行项目时会出现报错

配置项目

  • 创建合适的vue.config.js配置文件

以下是我vue.config.js文件

module.exports = {
    publicPath: process.env.NODE_ENV === 'development' ? '/' : './',  //'./',
    outputDir: 'dist',
    configureWebpack: {
      resolve: {
        alias: {
          'assets': '@/assets',
          'common': '@/common',
          'components': '@/components',
          'network': '@/network',
          'views': '@/views',
          'plugins': '@/plugins',
        }
      },
    },
    devServer: {
      port: 9001
    },
    pluginOptions: {
        // electronBuilder可以不用配置了,这是Vue CLI Plugin Electron Builder添加的才会需要
        electronBuilder: {
        }
    },
    chainWebpack: config => {
        config.module
        .rule('less')
        .oneOf('vue')
        .use('px2rem-loader')
        .loader('px2rem-loader')
        .before('postcss-loader') // this makes it work.
        .options({ remUnit: 16, remPrecision: 2 })  // remUnit:让1rem对标多少px
        .end()  //这里就是引用插件
    }
}
  • 现在测试一次vue项目是否正常运行,yarn serve命令运行项目。正常即可

  • 接下来对electron运行进行配置,在package.json配置文件
"main": "electron_main.js",
"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "newbuild": "electron-builder --win --x64",
    "start": "chcp 65001 && electron ."
},
"build": {
    "productName": "tomato",
    "directories": {
        "output": "electron_dist"
    },
    "asar": false
},

并且创建一个electron_main.js文件,可以参考我之前的文章:《vue + electronの文件读写》xie.infoq.cn/article/ba9…

因为代码太长,这里就不细说了......

const electron = require('electron');
// 控制应用生命周期的模块。
const {app, ipcMain} = electron;
// 创建原生浏览器窗口的模块。
const {BrowserWindow} = electron;
let mainWindow;
function createWindow() {
  // 创建浏览器窗口。
  mainWindow = new BrowserWindow({
    width: 480,
    height: 670,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  });
  // 加载应用的 index.html。
  // mainWindow.loadURL(`file://${__dirname}/dist/index.html`);
  mainWindow.loadURL(`http://localhost:9001/`);
  // 启用开发工具
  mainWindow.webContents.openDevTools();
}

// Electron 会在初始化后并准备
app.on('ready', createWindow);
// 当全部窗口关闭时退出。
app.on('window-all-closed', () => {
  // 否则绝大部分应用及其菜单栏会保持激活。
  if (process.platform !== 'darwin') {
    app.quit();
  }
});
app.on('activate', () => {
  // 绝大部分应用会重新创建一个窗口。
  if (mainWindow === null) {
    createWindow();
  }
});

然后使用yarn start能成功出现弹窗即可。界面electron调用时先使用http://localhost:9001/ 即可。mainWindow.loadURL(http://localhost:9001/`);`

界面编写

  • 接下来就该对页面进行修饰,设计一个合适自己的番茄钟页面。可以参考别的应用番茄钟页面。 界面样式编写代码不做过多叙述,虽然我是前端,但是如何设计才是值得记录的。

注意:不要加vue-router来做路由导航,不然等一下打包是大坑

当前没有任务的界面: (左上角实时时间使用setInterval设置间隔一秒,后续番茄钟任务倒计时也需要用到)

设计一份任务卡片需要的数据和属性:(虽然有些目前没有用到)

属性 作用
name 任务名称
creatTime 任务创建时间
duringTime 任务需要持续的时间
startFlag 是否开始
bgSrc 背景图片
taskEndCount 任务完成次数,提前结束的不算
taskId 任务id

然后先使用测试数据,不做文件之间的存储。

taskList: [
    {
        name: '学习node',
        creatTime: '',
        duringTime: 10,
        startFlag: false,
        bgSrc: 'bg1.png',
        taskEndCount: 0,
        taskId: 'adfa455a'
    },
]

  • 增加添加任务弹窗和倒计时弹窗

这里可以定义一些属性,来判断当前的倒计时以及真正经过的时间:

absTipFlag: false,   // 添加任务弹窗
isRuning: false,  // 是否有任务正在进行中
countdownTime: '',  //任务倒计时
taskbeginTime: '',  // 任务开始时间
taskendTime: '',   // 任务结束时间
taskduringTime: 0,  // 任务持续时间
curTask: null,   // 当前正在进行的任务
hasProcessTime: 0,  // 任务真正耗时

之前说到的时间进度:

setInterval(()=>{
    this.currentTime();
    this.curTime = `${this.date.year}年${this.date.mounth}月${this.date.date}日 ${this.date.hour}:${this.date.minute}:${this.date.second}`;

    if (this.isRuning && this.taskduringTime > 0) {
        this.hasProcessTime++;
        this.taskduringTime--;
    }
}, 1000 )
  • 并且在倒计时弹窗完成后,可以调用Notification来实现消息通知。

这里可以参考:《Notification 发送消息》xie.infoq.cn/article/6d4…

// 通过window的消息通知告知任务结束
notification(){
    let options;
    if (this.hasProcessTime == this.curTask.duringTime * 60) {
        options = {
            body: `请休息一下吧,工作辛苦啦!`,
            icon: require('../../assets/img/icon1.png')
        }
        new Notification(`恭喜,你设置的 ${this.curTask.name} 已完成`, options);
    } else {
        options = {
            body: `任务尚未成功,期待下次重来`,
            icon: require('../../assets/img/icon2.png')
        }
        new Notification(`抱歉,您提前结束了工作`, options);
    }
}

主进程和渲染进程文件读存通信

  • 界面上的工作基本已经完成了,下面就是对electron发起进攻了。

因为要做一个桌面应用,并且番茄钟的任务数据并不大,所以数据最好能够直接存在本地的文件当中。 现在就需要使用electron的主进程和渲染进程互相进行数据交互。

因为在electron可以直接使用node,所以直接在public文件夹下创建一个static文件夹,里面存放读写方法和tomato.json数据文件。

请参考:《vue + electronの文件读写》

electron_main.js文件中添加ipcMain响应方法:

注意,这里需要使用path.join(__dirname)来设置读取文件的路径,虽然调试时直接相对位置也可以,但是在打包后是找不到文件的

const path = require('path')
const { readFile, writeFile } = require('./src/assets/fs/readFs')
// 监听渲染进程发来的消息
ipcMain.on('render-msg', async (event, arg) => {
  if (arg == '获取番茄钟') {
    let con = await readFile(path.join(__dirname, './public/static/tomato.json') ).then(r=>r).catch(err=>err)
    event.sender.send('tomato-list', con)
  }
})

// 保存数据
ipcMain.on('save-msg', async (event, arg) => {
  let con = await writeFile(path.join(__dirname, './public/static/tomato.json'), JSON.stringify(arg));
  console.log(con)
})

vue组件当中使用window.ipcRenderer发送请求和响应接收:

window.ipcRenderer.send('render-msg', '获取番茄钟')
window.ipcRenderer.on('tomato-list', (event, arg) => {
    try {
        // console.log(arg)
        this.taskList = JSON.parse(arg);
    } catch(e) {
        this.taskList = [];
    }
})

...
// 数据存入json中
window.ipcRenderer.send('save-msg', this.taskList);

......

此时,经过一系列的操作后,终于能够创建任务并保存到json文件当中了,而且也能成功读取文件。

打包

  • 现在要开始打包工作了,因为我使用的不是vue add electron-builder,所以不能一口气打包,不过也没有关系。

第一步: 使用yarn build将vue项目打包出来,会生成一个dist文件夹。即使把里面的index.html拖到浏览器里,也是会有效果的,不过require会出错,因为浏览器不允许。

第二步:先将electron_main.js中的mainWindow.loadURL修改回来,变成: mainWindow.loadURL(file://${__dirname}/dist/index.html);。不然打包出来应用会是一片空白

运行yarn newbuild命令,根据之前package.json中的build配置,会生成electron_dist文件夹

如果打包出错,可以参考:关于 electron-builder 打包遇到的一点点问题

如何在electron_dist中下载或者直接打开

创建一个1分钟任务进行测试:(这里我任务次数记录没做好,不过不影响主要功能,关闭后重新打开任务也还是存在的)

到此,番茄钟0.1.0版本已经完成,并且能安装到电脑上了。

到此这篇关于vue番茄钟&electron 打包的文章就介绍到这了,更多相关vue electron 打包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • electron-vue利用webpack打包实现多页面的入口文件问题

    项目需要在electron的项目中新打开一个窗口,利用webpack作为静态资源打包器,发现在webpack中可以设置多页面的入口,今天来讲一下我在electron中利用webpack建立多页面入口的踩坑经验. 1.webpack的核心概念 •Entry:入口,Webpack执行构建的第一步从Entry开始: •Module:模块,在Webpack里一切皆模块,一个模块对应着一个文件.Webpack会从配置的Entry开始递归找出所有依赖的模块. •Chunk:代码块,一个Chunk由多个模块组

  • vue + electron应用文件读写操作

    目录 vue + electron应用文件读写 正常操作流程 vue + electron应用文件读写 在使用electron制作桌面应用时,基本都会需要数据的存储. 如果要制作的应用并不复杂,完全可以将数据存储在本地文件当中,然后应用就可以通过这些文件进行数据的读写. 因为electron的主进程是支持node的,所以可以通过fs文件系统对文件完成读写操作. 正常操作流程 首先先创建一个vue项目, 可以使用vue cli进行创建 通过yarn serve命令测试是否能否运行成功,界面正常出现

  • 如何用electron把vue项目打包为桌面应用exe文件

    目录 1.首先从electron官网克隆一个demo npm与cnpm的区别 2. 接下来,在已创建好的vue-cli项目中 3. 在新建的项目的package.json文件中增加一条指令 下面附上我的文件目录 如果按本文操作遇到一些问题报错,如C:\Users\milyyy\AppData\Roaming\npm-cache\_logs\2018-11-27T07_36_17_406Z-debug.log等等 解决办法可以参见我的另一篇文章:electron打包VUE项目中遇见的报错问题及解决

  • electron-vue开发环境内存泄漏问题汇总

    package.json "dependencies": { "vue": "^2.5.16" }, "devDependencies": { "ajv": "^6.5.0", "babel-core": "^6.26.3", "babel-loader": "^7.1.4", "babel-plu

  • 用electron打包vue项目中的报错问题及解决

    目录 1.  首先一定要cd到项目的根目录 2.  接下来运行 如何用electron打包vue项目,请参见我的另一篇文章:如何用electron打包vue项目为桌面应用文件exe 这里,也要提到实际项目中的问题,可能有同志的目录结构和内容有些许差别,就我刚刚遇到的问题来说,常见的问题的有几个问题,以及解决办法如下: 1.  首先一定要cd到项目的根目录 (我这里是app)里面才能运行项目,再重新npm run build,不然的话很有可能出现 “ 系统找不到路径的问题 ”,成功的话会出现下面绿

  • electron打包vue项目的方法 步骤

    目录 创建项目 添加electron-builder electron下载失败 窗体运行 打包exe 白屏 创建项目 点击这里 添加electron-builder 1.在项目目录下运行命令:vue add electron-builder2.electron-builder添加完成后会选择electron版本,直接选择最新版: electron下载失败 vue add electron-builder下载electron会下载失败,使用淘宝镜像下载:cnpm i electron 窗体运行 1

  • electron+vue实现div contenteditable截图功能

    最近在学习基于electron + electron-vue开发聊天客户端项目时,需要用到编辑器插入表情功能.一般通过input或textarea也能实现,通过插入[笑脸].(:12 这些标签,展示的时候解析标签就行. 如下图效果: 在网上找到的jq插件实现在textarea光标处插入表情符标签 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></t

  • 聊聊vue番茄钟与electron 打包问题

    目录 序 动手 准备工作 功能规划 开发工具 开发过程 创建项目 配置项目 界面编写 主进程和渲染进程文件读存通信 打包 序 平时对自己学习工作计划安排可以使用番茄钟去规划. 番茄钟:一个很简单的时间管理方法,设置一个固定时间,根据自己情况调整,这个时间是一个倒计时,在这段时间内认真去做一件事情,然后一个番茄钟结束后,休息大概五分钟,重新番茄钟. 这可以帮助我们量化自己的工作和效率,提醒我们休息和工作. 本人之前在手机上下载过番茄钟的应用,但是使用了一段时间后发现对我来说并不能算十分合适,准备制

  • vue项目中添加electron的详细代码

    1.在package.json中添加 "main": "electron.js", 在 "scripts": {添加: "package": "electron-packager ./ appName --overwrite" 在"dependencies": {添加: "electron-share-memory": "^1.0.1", &quo

  • 关于electron打包的坑

    首先electron打包的方式有两种 通过electron-builder 通过electron-package 两种方式,electron-builder打包的话扩展性更强,包也较小,electron-package打出来的包相对扩展性更小,且包容量较大,一般都会选择electron-builder进行打包. 注意electron和electron-build版本的问题 1.两者配套使用,如果两者的包不是配套的,版本不适配那么就会导致打包失败,因此我们使用electron-builder打包的

  • Vue.js中用webpack合并打包多个组件并实现按需加载

    前言 随着移动设备的升级.网络速度的提高,用户对于web应用的要求越来越高,web应用要提供的功能越来越.功能的增加导致的最直观的后果就是资源文件越来越大.为了维护越来越庞大的客户端代码,提出了模块化的概念来组织代码.webpack作为一种模块化打包工具,随着react的流行也越来越流行. 使用 Vue 开发项目时,如果要使用其单文件组件特性,必然要使用 webpack 或者 browserify 进行打包,对于大型应用,为了提升加载速度,可以使用 webpack 的 code split 功能

  • c#编写的番茄钟倒计时器代码

    恩  主要大家可以看下思路吧  图形界面里 除了图标和音乐两个资源 别的都是代码. 时间没有用timer组件 是自创的Time类在一个线程中进行的倒计时.  对于导出记录 创建了一个Record类  别的就没什么了  .... Program.cs 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace 番茄钟 {   

  • 详解Vue快速零配置的打包工具——parcel

    本文介绍了Vue快速零配置的打包工具--parcel,分享给大家,具体如下: 特性 快速打包 打包所有资源 自动转换 代码拆分 模块热替换 友好的错误记录 如何工作 Parcel 将 资源 树转换成 包(bundles) 树.许多其它的打包工具基本上是基于 JavaScript 资源,还有附加在其上的其它格式的资源.例如,在 JS 文件中内联成字符串. Parcel是对文件类型无感知的,它能按你所期待的方式那样与任意类型的资源工作,且毋须配置. 构建资源树 Parcel 接受单个入口资源作为输入

  • vue多页面开发和打包正确处理方法

    前段时间做项目,技术栈是vue+webpack,主要就是官网首页加后台管理系统 根据当时情况,分析出三种方案 一个项目代码里面嵌两个spa应用(官网和后台系统) 分开两套项目源码 一套项目源码里面就一个spa应用 思考: 直接否定了一套项目源码里一个spa应用(ui样式会相互覆盖,如果没有代码规范后期比较难维护) 两套源码的话,后台可能开两个端口,然后需要用nginx反向代理可能比较麻烦,而且前端开发也比较麻烦麻烦,毕竟需要维护两个git仓库,两套git上线流程,可能会损耗很多时间. 对自己的技

  • 聊聊Vue中provide/inject的应用详解

    众所周知,在组件式开发中,最大的痛点就在于组件之间的通信.在 Vue 中,Vue 提供了各种各样的组件通信方式,从基础的 props/$emit 到用于兄弟组件通信的 EventBus,再到用于全局数据管理的 Vuex. 在这么多的组件通信方式中,provide/inject 显得十分阿卡林(毫无存在感).但是,其实 provide/inject 也有它们的用武之地.今天,我们就来聊聊 Vue 中 provide/inject 的应用. 何为 provide/inject provide/inj

随机推荐