成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

開發(fā)了一款寫作軟件(OSX,Windows),附帶Electron開發(fā)指南

OnlyLing / 2042人閱讀

摘要:本來寫這個(gè)項(xiàng)目時(shí)就沒打算來自己實(shí)現(xiàn)富文本編輯器,本著能用開源就用開源的原則,在項(xiàng)目里測(cè)試了一些開源的編輯器,發(fā)現(xiàn)或多或少都有些問題,后來一琢磨,反正這個(gè)項(xiàng)目的富文本編輯器需求不復(fù)雜,就自己實(shí)現(xiàn)一個(gè)好了。

斷斷續(xù)續(xù)寫了個(gè)把月,終于在昨天完成了第一版…
筆落寫作

一款幫助網(wǎng)絡(luò)寫手更方便地進(jìn)行小說創(chuàng)作的PC軟件,目前支持 OSX/Windows

名字靈感來自于杜甫的一首詩(shī),前兩句是:

《寄李十二白二十韻》

昔年有狂客,號(hào)爾謫仙人。

筆落驚風(fēng)雨,詩(shī)成泣鬼神。

對(duì)于名字,要感謝下@藍(lán)色

預(yù)覽的話,可以去官網(wǎng)

作為我的第一款商業(yè)性(雖然才賣出去一個(gè),還是朋友捧場(chǎng)…)產(chǎn)品,我投入了很多精力。而且,重要的還在后面,那就是運(yùn)營(yíng)。

怎么讓得讓更多的人知道并且去使用它?直覺告訴我,這將是比寫代碼還要難的事情...

Electron 開(cai)發(fā)(keng)指南

主要用到了Electron-Vue這個(gè)框架,讓我不用花時(shí)間去琢磨配置Webpack和Electron,上來就直接開發(fā)。感謝開源社區(qū)!

歪個(gè)樓:我對(duì)Wepback的看法就是,籠統(tǒng)的了解下運(yùn)行原理就行了,現(xiàn)成并且配置好的Webpack模板直接用,遇到特殊需求,查文檔,查Google知道怎么改即可。

開發(fā)要求你比較熟悉Vue和Node,這里不會(huì)講基礎(chǔ)的東西,講基礎(chǔ)知識(shí)的除了官方文檔,網(wǎng)上有更多相關(guān)文章可供選擇。

細(xì)數(shù)踩過的坑:

首先,我遇到了:dev模式?jīng)]問題,打包后空白頁(yè)的問題?

如果你剛剛生成項(xiàng)目,什么都沒有動(dòng)的話,那就可能是Webpack在打包時(shí),把Vue當(dāng)成了外部文件沒有打包進(jìn)去。

代碼在:webpack.renderer.config.js

注釋掉...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))即可

然后,又遇到了多窗口的需求:

開始沒思路,因?yàn)槎啻翱诤鸵话闱岸碎_發(fā)時(shí)遇到的多路由,多Tab還不是一回事兒。后來經(jīng)人指點(diǎn),才明白其實(shí)多窗口挺簡(jiǎn)單的...

我們先觀察生成的代碼模板中,主窗口是怎么生成的:

let mainWindow;  //主窗口變量
const winURL =    
  process.env.NODE_ENV === "development" ?
  `http://localhost:9080` :
  `file://${__dirname}/index.html`  // 設(shè)置URL或者文件,畢竟Electron App其實(shí)運(yùn)行在Chromium中
  
mainWindow = new BrowserWindow(options)  // new 一個(gè)窗體對(duì)象,同時(shí)傳一些參數(shù)
mainWindow.loadURL(winURL)    // 加載URL,加載之后,窗口就會(huì)被顯示出來。

那么,我們依葫蘆畫瓢,第二個(gè)窗口就可以這么寫

let secondWindow; 
 const modalPath = process.env.NODE_ENV === "development" ?
    "http://localhost:9080/#/showOutline" :
    `file://${__dirname}/index.html#showOutline`  // 的確比較簡(jiǎn)單...
  
secondWindow = new BrowserWindow(options)  
secondWindow.loadURL(modalPath)    

PS: 這里提醒下vue-router不要設(shè)置成history模式。原因在文檔里看到過,忘了,想知道就去查文檔 :p

多窗口下的Vuex異常:

開發(fā)多窗口時(shí)并沒有意識(shí)到vuex存在問題,后面發(fā)現(xiàn)數(shù)據(jù)怎么都對(duì)不上,然后排查問題時(shí)發(fā)現(xiàn),兩個(gè)窗口的state(狀態(tài))并不同步,即:

當(dāng)你在打開窗口B時(shí),此時(shí)兩個(gè)窗口的Vuex數(shù)據(jù)時(shí)一致的,但一旦你的B窗口的數(shù)據(jù)狀態(tài)發(fā)生變化,其并不能反映到窗口A里。為什么不行,其實(shí)也很好理解。

歪個(gè)樓:說下我對(duì)Vuex實(shí)現(xiàn)原理的理解。以前剛開始學(xué)習(xí)Vue還沒有學(xué)Vuex時(shí),當(dāng)時(shí)我解決多組件(非父子)之間的通訊方式除了利用父組件做中間人(event bus)外,還試過維護(hù)一個(gè)全局JSON(比如共用一個(gè)store.js),然后其他組件都能訪問及操作。后來學(xué)了Vuex,發(fā)現(xiàn)它的工作方式和我想的差不多。(當(dāng)然,我并沒有去看源碼,它真正的實(shí)現(xiàn)方式是什么。但直覺告訴我應(yīng)該是這樣沒錯(cuò)了?。?/pre>

讓我反問一句:為什么兩個(gè)窗口之間的數(shù)據(jù)能一直同步?

解決方法: 我結(jié)合了Electron文檔中提到的兩種方式:ipc通訊在主進(jìn)程維護(hù)全局變量

PS: 經(jīng)人點(diǎn)撥,ipc通訊的實(shí)現(xiàn)利用了瀏覽器的postMessage接口(話說這個(gè)API,之前還真沒聽過說...)

在Vue中自己實(shí)現(xiàn)富文本編輯器:輸入框的雙向綁定和自動(dòng)聚焦(auto focus)

還有個(gè)不算是Electron,只能說是Vue方面的問題。

本來寫這個(gè)項(xiàng)目時(shí)就沒打算來自己實(shí)現(xiàn)富文本編輯器,本著能用開源就用開源的原則,在項(xiàng)目里測(cè)試了一些開源的編輯器,發(fā)現(xiàn)或多或少都有些問題,后來一琢磨,反正這個(gè)項(xiàng)目的富文本編輯器需求不復(fù)雜,就自己實(shí)現(xiàn)一個(gè)好了。

編輯器的輸入框,我使用的HTML屬性contenteditable來實(shí)現(xiàn)。

編輯器組件的雙向綁定和自動(dòng)聚焦的細(xì)節(jié)參考這篇文章

此外,還有些坑不知道什么原因造成的:

用戶數(shù)據(jù)的本地存儲(chǔ)我用了lowdb:

本質(zhì)就是通過nodefs模塊來操作本地JSON文件,只不過它比我們自己實(shí)現(xiàn)的要優(yōu)雅,可靠多了

然后有個(gè)需求是,當(dāng)觸發(fā)某種條件時(shí),保存對(duì)應(yīng)的變量:

// 當(dāng)用戶點(diǎn)擊Button A
db.set("a",111).write();
// 當(dāng)用戶點(diǎn)擊Button B
db.set("b",222).write();

此時(shí),如果用戶點(diǎn)擊了Button A,不僅a 數(shù)據(jù)會(huì)更新,b數(shù)據(jù)也會(huì)更新,反之同樣。

這不是lowdb的問題,因?yàn)槲叶鄮y(cè)試過,點(diǎn)擊Button A并不會(huì)導(dǎo)致其他set函數(shù)調(diào)用!

所以這應(yīng)該算是一個(gè)奇怪的問題吧。

利用ipcRenderer監(jiān)聽通信時(shí),如果在listener內(nèi)使用了異步:

 ipcRenderer.on("delete", () => {
     // 異步這里特指setTimeout
     setTimeout(() => {
     // 不知為何,_this.remove會(huì)調(diào)用多次(但發(fā)現(xiàn)ipcMian.send只被調(diào)用了一次!)
     _this.remove(this.nodeWasRightClicked, this.dataWasRightClicked);
     }, 0);
 });

另外: 打包軟件時(shí)也遇到了很多問題,但最終都通過Google解決掉了,所以這里不復(fù)述了(所謂面向Google編程

其他問題后續(xù)會(huì)繼續(xù)補(bǔ)充,歡迎持續(xù)關(guān)注!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95013.html

相關(guān)文章

  • Hola~ 一款基于Electron的聊天軟件

    摘要:前言本項(xiàng)目旨在從零到壹,制作一款界面精美的聊天軟件。因?yàn)楸救耸情_發(fā),設(shè)計(jì)功底欠缺,所以軟件設(shè)計(jì)的有點(diǎn)丑,如果有大神有更好的,歡迎。 Hola 前言 本項(xiàng)目旨在從零到壹,制作一款界面精美的聊天軟件。 Github 地址因?yàn)橐压ぷ?,所以可能沒有多少時(shí)間來繼續(xù)跟進(jìn)這個(gè)項(xiàng)目了,項(xiàng)目可優(yōu)化的點(diǎn)已在下文列出,歡迎大家 Fork 或 Star。 ps: 征 logo 一枚。因?yàn)楸救耸情_發(fā),設(shè)計(jì)功底...

    Kaede 評(píng)論0 收藏0
  • Electron 打造 Win/Mac 應(yīng)用,從「代碼」到可下載的「安裝包」,可能比你想得麻煩一

    摘要:三配置環(huán)節(jié)目的一是為之后的環(huán)節(jié)初始化工作流參數(shù),二是準(zhǔn)備好應(yīng)用文件夾內(nèi)容即要打包的目標(biāo)文件夾做的事解析命令行參數(shù),初始化工作參數(shù),填充配置文件,把配置文件和相關(guān)依賴文件導(dǎo)入到文件夾內(nèi)合適的 首發(fā)于酷家樂前端博客,作者@摘星(segmentfault @StinsonZhao) 我們能從很多地方學(xué)習(xí)到怎么起一個(gè) Electron 項(xiàng)目,有些還會(huì)介紹怎么打包或構(gòu)建你的代碼,但距離「真正地...

    LdhAndroid 評(píng)論0 收藏0
  • windows/mac系統(tǒng)下常用的SSH工具軟件收集整理

    摘要:工欲善其事,必先利其器,買了一款之后,就要選用一款好用的工具遠(yuǎn)程連接登錄你的服務(wù)器了。鑒于目前已經(jīng)是年了,系統(tǒng)自帶的終端也是可以連接的工欲善其事,必先利其器,買了一款VPS之后,就要選用一款好用的SSH工具遠(yuǎn)程連接登錄你的服務(wù)器了。當(dāng)然SSH工具有很多,你可以選用自己覺得的順手的,雖然FinalShell和MobaXterm也非常好用,但是感覺JAVA寫的東西,啟動(dòng)總是慢半拍。 此外,...

    ZweiZhao 評(píng)論0 收藏0
  • 一個(gè)程序員的正版清單

    摘要:有部分前端人員使用的是盜版的。非編程相關(guān)其它一些我使用的,但與編程關(guān)系不大的正版工具。尊重別人,更是尊重自己做為一個(gè)程序員,使用正版,我認(rèn)為這不是自做清高的事情,這是對(duì)自己職業(yè)的一種基本尊重。 ...

    wudengzan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<