Vue番茄钟与Electron打包问题详解:学习与工作的时间管理利器
Vue番茄钟与Electron打包问题详解:学习与工作的时间管理利器
自己觉得下载的番茄钟用起来不方便?那可以试试自己动手制作一个。接下来,我会详细介绍我是如何制作 Vue 番茄钟以及如何进行打包的整个过程。我曾下载过一款番茄钟软件,满怀希望地想用它提高工作效率。然而,使用了一段时间后,我发现它并不符合我的需求。因此,我决定亲自开发一个简易的番茄钟应用,以便完全按照自己的需求来定制。// electronBuilder可以不用配置了,这是Vue CLI Plugin Electron Builder添加的才会需要
自己觉得下载的番茄钟用起来不方便?那可以试试自己动手制作一个。接下来,我会详细介绍我是如何制作 Vue 番茄钟以及如何进行打包的整个过程。
制作契机
我曾下载过一款番茄钟软件,满怀希望地想用它提高工作效率。然而,使用了一段时间后,我发现它并不符合我的需求。我希望能够有更多个性化的设置,比如自由调整专注时长等。因此,我决定亲自开发一个简易的番茄钟应用,以便完全按照自己的需求来定制。
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() //这里就是引用插件
}
}
前期规划
"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
},
动手前,得先规划一番。我静下心来,琢磨番茄钟得有哪些功能,比如任务设定、倒计时提醒。我用 Xmind 搞了个功能思维导图。毕竟这是初版,先做基础版,以后逐步改进。
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();
}
});
环境搭建
我将任务数据创建与编辑的操作,计划利用 Node 进行存储,具体保存在项目中的 json 文件中。尽管 Vue CLI 提供了 vue add 命令来安装插件,但我决定采用最基本的方法。特别提醒,在安装 less 时,需留意其版本,若版本更新过高,项目运行时可能会出现错误。安装完毕后,运行yarn start命令,若能成功看到弹窗,即表明环境搭建成功。
路由与界面设计
taskList: [
{
name: '学习node',
creatTime: '',
duringTime: 10,
startFlag: false,
bgSrc: 'bg1.png',
taskEndCount: 0,
taskId: 'adfa455a'
},
]
路由配置不能随便,别用vue进行路由跳转,否则在打包时可能会遇到麻烦。界面中无任务时,左上角的实时时间每秒更新一次,番茄钟任务的倒计时也会采用这种计时方法。设计任务卡片所需的数据和属性时,即使有些现在暂时不用,也应该先列出来。起初可以用测试数据,暂时不必考虑文件存储的问题。
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 )
由于开发桌面应用,且番茄钟任务的数据量并不大,我计划将数据直接保存在本地文件里。为此,主进程和渲染进程需要实现数据间的交流。于是,我在指定文件夹内新建了一个子文件夹,用于存放读写操作的相关代码以及.json格式的数据文件。请注意,设置文件读取路径需使用 path.join() 函数。在调试阶段,使用相对路径尚可,但一旦打包,文件便难以找到。经过多次尝试,我们最终成功创建了任务,并将其保存至 json 文件中。同时,读取文件的操作也顺利完成。
// 通过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);
}
}
项目打包与测试
进入打包步骤。用yarn build命令对Vue项目进行打包,会创建一个名为dist的文件夹。将文件夹中的index.html文件拖入浏览器,虽然能看到效果,但会出现错误提示,这是因为浏览器存在安全防护。执行yarn命令后,会根据之前配置的.json文件中的build设置,生成一个新的文件夹。我设立了时长为一分钟的测试任务,尽管任务执行次数的记录不够完善,但这并未影响任务的核心功能。即便关闭并再次启动,任务依然能够正常运行。现在,番茄钟的0.1.0版本已经制作完成,并且可以成功安装在电脑上。
在类似项目的制作过程中,大家是否遇到过特别麻烦的问题?若觉得本文对您有帮助,请记得点赞及转发。
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)
})