聊聊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 [email protected] 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 打包內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 如何用electron把vue項目打包為桌面應用exe文件
- Vite+Electron快速構建VUE3桌面應用的實現
- vue + electron應用文件讀寫操作
- AntDesignPro使用electron構建桌面應用示例詳解
- vue + Electron 制作桌面應用的示例代碼