原文首發於個人博客,歡迎點擊查看得到更好的閱讀體驗~
開發To-Do-List
大部分的緣由是由於看到了molunerfinn所寫的Electron-vue開發實戰的系列文章,比較詳細的介紹了PicGo
的開發流程,便就着文章教程開始了開發。javascript
本篇文章主要是記錄一下在Electron-vue開發實戰中沒有說起到的問題以及一些知識點。css
構建完項目後,就找了個簡單項目練練手,項目是模仿TIM
的中自帶的待辦事項功能。所謂是工欲善其事,必先利其器(雖然市面上有不少更強大的相似應用,主要是用於本身練手),那就從它開始下手。html
一個目標的創建,將是成就的開始。
書接上回,上回說到基於Electron-vue構建項目時遇到的一些坑,那麼實際開發中又會遇到哪些靈異事件呢?且聽我慢慢道來。vue
項目地址:https://github.com/gorkys/To-...(若是你喜歡它,或者對你有幫助,請點Star
)java
項目功能:node
技術棧:git
electron-vue
Vue
Vuex
lowdb
element-ui
項目截圖:github
問題發生在建立右鍵菜單
,將菜單中click
事件彈出dialog
改成Notification
,重啓應用後仍是彈出的dialog
,而若是隻是修改dialog
中body
的內容就能及時顯示。當時要下班回家了,就沒管它。web
到次日打開電腦的時候,忽然它就反映過來了,通過一系列的測試與排除,發現問題的根本緣由是:vuex
// main/index.js import { ..., dialog, Notification, ... } from 'electron'
引入了兩個模塊,而在使用時dialog
並無都使用到,致使的渲染不及時。只要註釋或者刪除多餘引入就能夠了。
在解決上面的問題後,發現使用Notification
後,無論如何點擊都不顯示,不報錯。有bug
只要報錯就不可怕,可是呢,它就是無任何反映。
而後翻教程,以及官方文檔,固然也不是一無所得,至少在經過CI發佈以及更新的方式以及[官方文檔]()中都提到了windows下須要使用到appid
。
// main/index.js import pkg from '../../package.json' // 設置appId if (process.platform === 'win32') { app.setAppUserModelId(pkg.build.appId) }
然而並非這麼簡單。
在electron
的技術羣內,獲得一位大佬指點
原來是要先把應用打包好,而後在電腦中安裝該應用並打開應用。這樣appid
纔會注入到系統中。
在打包好後,果真打包好的應用其實是已經有了通知的功能,而且在開發環境下也能夠正常使用了。
在解決通知問題時須要打包應用,npm run bulid
後又出現了一系列問題。
受限於牆以及網絡環境,不少人在嘗試打包electron程序時都會碰到。
Error: E:\Project\WebStorm\Electron\To-Do-List\node_modules\app-builder-bin\win\x64\app-builder.exe exited with code 1 at ChildProcess.childProcess.once.code (E:\Project\WebStorm\Electron\To-Do-List\node_modules\builder-util\src\util.ts:244:14) at Object.onceWrapper (events.js:286:20) at ChildProcess.emit (events.js:198:13) at maybeClose (internal/child_process.js:982:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:259:5) ... npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! to-do-list@0.0.1 build: `node .electron-vue/build.js && electron-builder` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the to-do-list@0.0.1 build script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
查閱了一些解決方案
首先是設置淘寶鏡像:
npm set ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/
或者是在C:\Users\用戶名
下找到.npmrc
直接添加
ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/
設置好後應該就能夠將electron-v2.0.18-win32-x64
下載下來了。
若是仍是不行的話,那麼就直接本身打開https://github.com/electron/e...在找到對應版本,在瀏覽器中下載後,將文件放入%LOCALAPPDATA%\electron\Cache
而後就是一些electron-builder
的包下載超時的問題
下載下來後解壓到 %LOCALAPPDATA%\electron-builder\cache
目錄下,不知是否版本問題,在上面的文章中集體都是說下載包獨立解壓,可是在我這裏並不適用。實際中在本機的目錄以下
(注意nsis-resources
的包是壓解到nsis
目錄下的):
├── electron │ └── Cache │ └── electron-v2.0.18-win32-x64.zip ├── electron-builder │ └── cache │ └── nsis │ └── nsis-3.0.1.13 │ 解壓nsis-3.0.1.13.7z所得文件 │ └── nsis-resources-3.3.0 │ 解壓nsis-resources-3.3.0.7z所得文件 │ └── winCodeSign │ └── winCodeSign-1.9.0 │ 解壓winCodeSign-1.9.0.7z所得文件
注意:以上所說目錄若不存在,請手動新建(其實只要執行到某一步,就會自動生成該目錄),目錄中已有的緩存文件能夠刪掉
To-Do-List
項目中有一個詳細窗口還有一個Mini窗口,詳細窗口中完成一個事項後,進度條狀態改變,同時Mini窗口其實也是個進度,狀態也應該相應改變,而在最初使用的是基礎的vuex
,至關於瀏覽器中開了兩個標籤,而這時vuex
是不可能支持共享的。
後面就打算使用main
進程進行中轉操做,在查資料時看到了關於使用vue-electron腳手架進行vuex賦值時,失敗的解決辦法中有提到
若是沒有多進程交互的需求,徹底能夠
不引入這個插件(
vuex-electron
)。
原來之前陰差陽錯刪除vuex-electron
插件的引入讓我避免了他所述的問題。
可是如今須要多進程交互了
首先引入插件(其實構建項目時是已經默認引入了)
// store/index.js ... import { createPersistedState, createSharedMutations } from 'vuex-electron' ... export default new Vuex.Store({ modules, plugins: [ createPersistedState(), createSharedMutations() ], strict: process.env.NODE_ENV !== 'production' })
而後在主進程的index.js
中引入
// main/index.js import '../renderer/store'
這樣就能夠多進程共享vuex
了,你會發如今應用的目錄下會生成一個vuex.json
的文件,其實就是把vuex
中的數據存到了本地。
由於應用的窗口大小緣由,DateTimePicker
組件的默認樣式比較佔地方,因此須要把樣式修改一下。日常在組件內的樣式中使用/deep/
修改就能夠了,可是此次並無修改爲功。
除了使用/deep/
來深度修改樣式,還有就是引入文件的方式覆蓋。
// assets/reset.scss .el-date-picker{ width: 300px!important; .el-picker-panel__body{ .el-date-picker__header { margin: 2px auto!important; } .el-picker-panel__content{ margin: 2px auto!important; .el-date-table th{ padding: 0!important; } .el-date-table td{ padding: 0!important; } } } }
而後在組件中引入便可
// components/todoList import '../../assets/reset.scss' // 重置el-date-picker樣式
element-ui
中的圖標仍是少了些,沒有的圖標就使用了iconfont中的圖標,在開發環境時將文件放入static\fonts
下,而後在inex.ejs
中引入
// index.ejs <link rel="stylesheet" type="text/css" href="../static/fonts/iconfont.css">
能夠正常顯示,可是打包後,圖標就不見了。
翻了一下dist/electron/
打包目錄發現,其實只須要一個.
就夠了
// index.ejs <link rel="stylesheet" type="text/css" href="./static/fonts/iconfont.css">
在main
進程中建立窗口時參數加入transparent:true
就可使窗口透明,可是由於html
默認是白色背景,因此須要在App.vue
樣式中加入
html,body{ ... background-color: rgba(0, 0, 0, 0) }
而後在主頁面的樣式中index.vue
加入
#box{ ... background-color: rgba(75, 75, 75, 0.8) }
使用了element-ui
的Progress
組件,修改其樣式以下:
.progress{ margin: 20px 50px 50px; border-radius: 1px; /deep/ .el-progress-bar__outer{ border-radius: 2px; .el-progress-bar__inner { border-radius: 2px; background-color: #8EC5FC; background-image: linear-gradient(177deg,#E0C3FC 24%,#8EC5FC 75%); background-image: -webkit-linear-gradient(177deg,#E0C3FC 24%,#8EC5FC 75%); } }
使用了Chrome
所獨有的::-webkit-scrollbar
屬性,相關文檔點擊此處
#todoList{ overflow-x: hidden; padding: 0 50px; color: white; height: calc(600px - 170px); &::-webkit-scrollbar{ width:5px; height:5px; } &::-webkit-scrollbar-thumb{ border-radius:4px; background-color: #8EC5FC; background-image: linear-gradient(177deg,#8EC5FC 24%,#E0C3FC 75%); background-image: -webkit-linear-gradient(177deg,#8EC5FC 24%,#E0C3FC 75%); } &::-webkit-scrollbar-track{ background-color:transparent } }
使用漸變事後就不能使用:hover
等僞類,可是有一個解決方案是使用 background-position來模擬漸變過渡。
參考連接:https://ask.helplib.com/css/p...
目前找到的只有這個連接提供256*256的ico
格式的轉換
連接地址:http://ico.duduxuexi.com/
本文主要講述了在開發To-Do-List
中所遇到的一些問題和踩的坑以及一些知識點,該項目花費了一個星期左右的時間,也許文中簡單的幾句話背後就是我無數次的查閱和調試。但願這篇文章可以給你的electron-vue
開發帶來一些啓發。文中相關的代碼,你均可以在To-Do-List的項目倉庫裏找到。
但願本文可以給你帶來幫助,這是我最開心的地方。若是喜歡,歡迎關注個人博客以及本系列文章的後續進展。
另外,再次感謝molunerfinn提供的electron-vue
實戰開發系列文章。