小編給大家分享一下如何開發(fā)一個Atom插件,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
站在用戶的角度思考問題,與客戶深入溝通,找到臨城網站設計與臨城網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站設計、成都網站建設、企業(yè)官網、英文網站、手機端網站、網站推廣、域名與空間、網站空間、企業(yè)郵箱。業(yè)務覆蓋臨城地區(qū)。最近用Atom寫博客比較多,然后發(fā)現(xiàn)一個很嚴重的問題。。
沒有一個我想要的上傳圖片的方式,比如某乎上邊就可以直接copy/paste文件,然后進行上傳。
然而在Atom上沒有找到類似的插件,最接近的一個,也還是需要手動選擇文件,然后進行上傳。
這個操作流程太繁瑣,索性自己寫一個插件用好了。
成品插件下載地址:https://atom.io/packages/atom-image-uploader
首先,我們確定了需求,要通過可以直接copy
文件,然后在Atom中paste
即可完成上傳的操作。
確定了以后,我們就要開始搬磚了。
因為Atom
是一個Electron
應用:https://electronjs.org
是使用JavaScript
來開發(fā)的桌面應用,所以對于一個前端來說,簡直是太美好了。
我們先去翻看Atom
的官方文檔,查看關于創(chuàng)建插件相關的操作:
首先我們在Atom
中打開命令面板,然后輸入Generate Package
按下回車后,將會彈出一個對話框,在框中輸入要建立的包名即可完成一個Package
的創(chuàng)建。
Atom
會生成一套默認文件,并打開一個新的窗口。
生成的插件目錄如下:
. ├── keymaps │ └── first-package.json ├── lib │ ├── first-package-view.js │ └── first-package.js ├── menus │ └── first-package.json ├── package.json ├── spec │ ├── first-package-spec.js │ └── first-package-view-spec.js └── styles └── first-package.less
這里可以配置要監(jiān)聽的快捷鍵,我們可以設置一些自定義快捷鍵來觸發(fā)一些我們插件的行為。
{ "atom-workspace": { "ctrl-alt-o": "first-package:toggle" } }
我們可以添加各種自定義的快捷鍵在這里。Value
的定義為:包名:觸發(fā)的事件名
需要注意的是:
這里配置的快捷鍵還有一個作用域的概念。也就是JSON
外邊的那個key
。atom-workspace
表示在Atom
中生效atom-text-editor
表示只在文本編輯器范圍內生效。
Atom官方文檔
這里就是存放插件主要代碼的地方了。
默認會生成兩個文件:
package.js
package.view.js
默認插件生成的主入口文件指向這里。
入口文件的表現(xiàn)方式為一個JSON
對象,可以實現(xiàn)如下幾個函數:
activate
: 當Package
被激活時會執(zhí)行該方法,函數的簽名表示會接受一個state
參數,該參數是通過serialize
方法傳遞過來的(如果有實現(xiàn)它的話)
deactivate
: 當Package
失效時會出發(fā)的方法,這兩個方法可以理解為React
中的componentWillMount
和componentWillUnmount
serialize
: 也就是上邊說到的那個方法,可以返回一個JSON
對象供下次激活后使用
自定義快捷鍵對應的事件名: 每次Package
被觸發(fā)對應快捷鍵時都會執(zhí)行的方法
這里存放的是在應用菜單和編輯區(qū)域菜單欄的配置文件
{ "context-menu": { "atom-text-editor": [ { "label": "Toggle first-package", "command": "first-package:toggle" } ] }, "menu": [ { "label": "Packages", "submenu": [ { "label": "first-package", "submenu": [ { "label": "Toggle", "command": "first-package:toggle" } ] } ] } ] }
context-menu
對應的元素會在對應的區(qū)域內右鍵觸發(fā)時顯示。menu
則是出現(xiàn)在Atom
主菜單欄上:
同樣的,context-menu
會區(qū)分兩個環(huán)境,text-editor
和workspace
。
這里存放的是一些測試用例,創(chuàng)建Package
會生成一些默認的斷言。
寫測試確實是一個好習慣。
如果Package
有很多View
要展示的話,可以在這里編寫,默認使用的是Less
語法。
由于我們只做一個C/V
的操作,不會涉及到界面,所以styles
直接就刪掉了。
大致結構已經了解了,我們就可以開始搬磚了。
因為是一個Electron
應用,所以我們直接在Atom
中按下alt + command + i
,呼出我們熟悉的控制臺界面。
Atom
是不會把Electron
的各種文檔重新寫一遍的,所以我們現(xiàn)在控制臺里邊試一下我們的猜測是否正確。
一些想要的東西是否存在。
經過驗證確定了,Electron
的clipboard
對象可以直接在Atom
中使用,這就很開心了。
require('electron').clipboard.readImage().toPng()
這樣我們就拿到剪切板中的圖片數據了,一個二進制的數組對象。
我們在觸發(fā)Paste
操作時,從clipboard
中獲取,如果剪切板中是圖片的話,我們就將它上傳并顯示到編輯器中。
所以,接下來我們要做的就是:
進行上傳圖片的操作
將上傳后的圖片顯示到編輯器中
上傳圖片我們選擇的是七牛,我們選擇七牛來作為圖床使用,因為他家提供了10GB的免費存儲,灰常適合自己這樣的筆記型博客。
但是用他家SDK時發(fā)現(xiàn)一個問題。。我將二進制數據轉換為ReadStream
后上傳的資源損壞了-.-目前還沒有找到原因。
所以我們做了曲線救國的方式。
將剪切板中的數據轉換為Buffer
然后暫存到本地,通過本地文件的方式來進行上傳七牛。
在操作完成后我們再將臨時文件移除。
try { let buffer = clipboard.readImage().toPng() let tempFilePath = 'XXX' fs.writeFileSync(tempFilePath, Buffer.from(buffer)) } catch (e) { // catch error } finally { fs.unlink(tempFilePath) // 因為我們并不依賴于刪除成功的回調,所以直接空調用異步方法即可 }
因為考慮到上傳可能會受到網絡影響,從而上傳時間不可預估。
所以我們會先在文件中顯示一部分占位文字。
通過全局的atom
對象可以拿到當前活躍的窗口:
let editor = atom.workspace.getActiveTextEditor()
為了避免同時上傳多張圖片時出現(xiàn)問題,我們將臨時文件名作為填充的一部分。
editor.insertText(`![](${placeHolderText})`, editor)
然后在上傳成功后,我們將對應的填充字符替換為上傳后的URL就可以了。
editor.scan(new RegExp(placeHolderText), tools => tools.replace(url))
scan
方法接收一個正則對象和回調函數。
我們將前邊用到的占位文本作為正則對象,然后在回調將其替換為上傳后的url
。
至此,我們的代碼已經編寫完了,剩下的就是一些交互上的優(yōu)化。
完成后的效果圖:
以及,最后:我們要進行Package
的上傳。
首先我們需要保證package.json
中存在如下幾個參數:
name
description
repository
我們可以先使用如下命令來檢查包名是否沖突。
apm show 你的包名
如果沒有沖突,我們就可以直接執(zhí)行以下命令進行上傳了。
apm publish 你的包名
后續(xù)的代碼修改,只需在該包的目錄下執(zhí)行:
apm publish
一些可選的參數:
major
,增加版本號的第一位1.0.0
->2.0.0
minor
,增加版本號的第二位0.1.0
->0.2.0
patch
,增加版本號的第三位0.0.1
->0.0.2
通過apm help
可以獲取到更多的幫助信息。
看完了這篇文章,相信你對如何開發(fā)一個Atom插件有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章名稱:如何開發(fā)一個Atom插件-創(chuàng)新互聯(lián)
本文網址:http://jinyejixie.com/article34/ghcse.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站導航、動態(tài)網站、品牌網站設計、全網營銷推廣、外貿建站、自適應網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)