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

資訊專欄INFORMATION COLUMN

如何從0開發(fā)一個(gè)Atom組件

lauren_liuling / 2354人閱讀

摘要:將剪切板中的數(shù)據(jù)轉(zhuǎn)換為然后暫存到本地,通過本地文件的方式來進(jìn)行上傳七牛。以上,就是開發(fā)一個(gè)插件的完整流程咯。

最近用Atom寫博客比較多,然后發(fā)現(xiàn)一個(gè)很嚴(yán)重的問題。。
沒有一個(gè)我想要的上傳圖片的方式,比如某乎上邊就可以直接copy/paste文件,然后進(jìn)行上傳。
然而在Atom上沒有找到類似的插件,最接近的一個(gè),也還是需要手動(dòng)選擇文件,然后進(jìn)行上傳。
這個(gè)操作流程太繁瑣,索性自己寫一個(gè)插件用好了。

成品插件下載地址:https://atom.io/packages/atom-image-uploader

規(guī)劃

首先,我們確定了需求,要通過可以直接copy文件,然后在Atom中paste即可完成上傳的操作。
確定了以后,我們就要開始搬磚了。

插件開發(fā)

因?yàn)?b>Atom是一個(gè)Electron應(yīng)用:https://electronjs.org

是使用JavaScript來開發(fā)的桌面應(yīng)用,所以對(duì)于一個(gè)前端來說,簡(jiǎn)直是太美好了。
我們先去翻看Atom的官方文檔,查看關(guān)于創(chuàng)建插件相關(guān)的操作:
首先我們?cè)?b>Atom中打開命令面板,然后輸入Generate Package

按下回車后,將會(huì)彈出一個(gè)對(duì)話框,在框中輸入要建立的包名即可完成一個(gè)Package的創(chuàng)建。

Atom會(huì)生成一套默認(rèn)文件,并打開一個(gè)新的窗口。

項(xiàng)目結(jié)構(gòu)

生成的插件目錄如下:

.
├── 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
keymaps

這里可以配置要監(jiān)聽的快捷鍵,我們可以設(shè)置一些自定義快捷鍵來觸發(fā)一些我們插件的行為。

{
  "atom-workspace": {
    "ctrl-alt-o": "first-package:toggle"
  }
}

我們可以添加各種自定義的快捷鍵在這里。
Value的定義為:包名:觸發(fā)的事件名
需要注意的是:
這里配置的快捷鍵還有一個(gè)作用域的概念。也就是JSON外邊的那個(gè)key。
atom-workspace表示在Atom中生效
atom-text-editor表示只在文本編輯器范圍內(nèi)生效。

Atom官方文檔

lib

這里就是存放插件主要代碼的地方了。
默認(rèn)會(huì)生成兩個(gè)文件:

package.js

package.view.js

默認(rèn)插件生成的主入口文件指向這里。

入口文件的表現(xiàn)方式為一個(gè)JSON對(duì)象,可以實(shí)現(xiàn)如下幾個(gè)函數(shù):

activate: 當(dāng)Package被激活時(shí)會(huì)執(zhí)行該方法,函數(shù)的簽名表示會(huì)接受一個(gè)state參數(shù),該參數(shù)是通過serialize方法傳遞過來的(如果有實(shí)現(xiàn)它的話)

deactivate: 當(dāng)Package失效時(shí)會(huì)出發(fā)的方法,這兩個(gè)方法可以理解為React中的componentWillMountcomponentWillUnmount

serialize: 也就是上邊說到的那個(gè)方法,可以返回一個(gè)JSON對(duì)象供下次激活后使用

自定義快捷鍵對(duì)應(yīng)的事件名: 每次Package被觸發(fā)對(duì)應(yīng)快捷鍵時(shí)都會(huì)執(zhí)行的方法

menus

這里存放的是在應(yīng)用菜單和編輯區(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對(duì)應(yīng)的元素會(huì)在對(duì)應(yīng)的區(qū)域內(nèi)右鍵觸發(fā)時(shí)顯示。
menu則是出現(xiàn)在Atom主菜單欄上:

同樣的,context-menu會(huì)區(qū)分兩個(gè)環(huán)境,text-editorworkspace。

spec

這里存放的是一些測(cè)試用例,創(chuàng)建Package會(huì)生成一些默認(rèn)的斷言。
寫測(cè)試確實(shí)是一個(gè)好習(xí)慣。

styles

如果Package有很多View要展示的話,可以在這里編寫,默認(rèn)使用的是Less語法。
由于我們只做一個(gè)C/V的操作,不會(huì)涉及到界面,所以styles直接就刪掉了。

開始搬磚

大致結(jié)構(gòu)已經(jīng)了解了,我們就可以開始搬磚了。
因?yàn)槭且粋€(gè)Electron應(yīng)用,所以我們直接在Atom中按下alt + command + i,呼出我們熟悉的控制臺(tái)界面。

Atom是不會(huì)把Electron的各種文檔重新寫一遍的,所以我們現(xiàn)在控制臺(tái)里邊試一下我們的猜測(cè)是否正確。
一些想要的東西是否存在。

經(jīng)過驗(yàn)證確定了,Electronclipboard對(duì)象可以直接在Atom中使用,這就很開心了。

require("electron").clipboard.readImage().toPng()

這樣我們就拿到剪切板中的圖片數(shù)據(jù)了,一個(gè)二進(jìn)制的數(shù)組對(duì)象。
我們?cè)谟|發(fā)Paste操作時(shí),從clipboard中獲取,如果剪切板中是圖片的話,我們就將它上傳并顯示到編輯器中。
所以,接下來我們要做的就是:

進(jìn)行上傳圖片的操作

將上傳后的圖片顯示到編輯器中

上傳圖片

上傳圖片我們選擇的是七牛,我們選擇七牛來作為圖床使用,因?yàn)樗姨峁┝?0GB的免費(fèi)存儲(chǔ),灰常適合自己這樣的筆記型博客。
但是用他家SDK時(shí)發(fā)現(xiàn)一個(gè)問題。。我將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為ReadStream后上傳的資源損壞了-.-目前還沒有找到原因。
所以我們做了曲線救國(guó)的方式。
將剪切板中的數(shù)據(jù)轉(zhuǎn)換為Buffer然后暫存到本地,通過本地文件的方式來進(jìn)行上傳七牛。
在操作完成后我們?cè)賹⑴R時(shí)文件移除。

try {
  let buffer = clipboard.readImage().toPng()
  let tempFilePath = "XXX"
  fs.writeFileSync(tempFilePath, Buffer.from(buffer))
} catch (e) {
  // catch error
} finally {
  fs.unlink(tempFilePath) // 因?yàn)槲覀儾⒉灰蕾囉趧h除成功的回調(diào),所以直接空調(diào)用異步方法即可
}
將上傳后的資源顯示到編輯器中

因?yàn)榭紤]到上傳可能會(huì)受到網(wǎng)絡(luò)影響,從而上傳時(shí)間不可預(yù)估。
所以我們會(huì)先在文件中顯示一部分占位文字。
通過全局的atom對(duì)象可以拿到當(dāng)前活躍的窗口:

let editor = atom.workspace.getActiveTextEditor()

為了避免同時(shí)上傳多張圖片時(shí)出現(xiàn)問題,我們將臨時(shí)文件名作為填充的一部分。

editor.insertText(`![](${placeHolderText})`, editor)

然后在上傳成功后,我們將對(duì)應(yīng)的填充字符替換為上傳后的URL就可以了。

editor.scan(new RegExp(placeHolderText), tools => tools.replace(url))

scan方法接收一個(gè)正則對(duì)象和回調(diào)函數(shù)。
我們將前邊用到的占位文本作為正則對(duì)象,然后在回調(diào)將其替換為上傳后的url。
至此,我們的代碼已經(jīng)編寫完了,剩下的就是一些交互上的優(yōu)化。

完成后的效果圖:

以及,最后:我們要進(jìn)行Package的上傳。

上傳開發(fā)完的Package

首先我們需要保證package.json中存在如下幾個(gè)參數(shù):

name

description

repository

我們可以先使用如下命令來檢查包名是否沖突。

apm show 你的包名

如果沒有沖突,我們就可以直接執(zhí)行以下命令進(jìn)行上傳了。

apm publish 你的包名

后續(xù)的代碼修改,只需在該包的目錄下執(zhí)行:

apm publish

一些可選的參數(shù):

major,增加版本號(hào)的第一位1.0.0 -> 2.0.0

minor,增加版本號(hào)的第二位0.1.0 -> 0.2.0

patch,增加版本號(hào)的第三位0.0.1 -> 0.0.2

通過apm help可以獲取到更多的幫助信息。

以上,就是開發(fā)一個(gè)Atom插件的完整流程咯。

參考資料

hacking-atom
electron-doc

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

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

相關(guān)文章

  • [譯] Focal:類型安全、表達(dá)力強(qiáng)、可組合的狀態(tài)管理方案

    摘要:致力于為應(yīng)用提供一個(gè)類型安全表達(dá)力強(qiáng)可組合的狀態(tài)管理方案。是一組的命名空間。是內(nèi)置組件的鏡像,但允許組件的額外接受類型的數(shù)據(jù)。這次內(nèi)容更新,是由組件處理的。這些小的組件不必知道所有的應(yīng)用狀態(tài)數(shù)據(jù)。這是因?yàn)榇蟛糠謱?duì)的研究來自于。 Focal Focal 致力于為 React 應(yīng)用提供一個(gè)類型安全、表達(dá)力強(qiáng)、可組合的狀態(tài)管理方案。 用一個(gè)不可變的 (immutable) 、響應(yīng)式的 (o...

    suemi 評(píng)論0 收藏0
  • Vue.js資源分享

    摘要:中文官網(wǎng)英文官網(wǎng)組織發(fā)出一個(gè)問題之后,不要暫時(shí)的離開電腦,如果沒有把握先不要提問。珍惜每一次提問,感恩每一次反饋,每個(gè)人工作還是業(yè)余之外抽出的時(shí)間有限,充分準(zhǔn)備好應(yīng)有的資源之后再發(fā)問,有利于問題能夠高效質(zhì)量地得到解決。 Vue.js資源分享 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/maid...

    vpants 評(píng)論0 收藏0
  • 前端每周清單第 10 期:Firefox53、React VR發(fā)布、Microsoft Edge現(xiàn)代

    摘要:新聞熱點(diǎn)國(guó)內(nèi)國(guó)外,前端最新動(dòng)態(tài)發(fā)布近日,正式發(fā)布新版本中提供了一系列的特性與問題修復(fù)。而近日正式發(fā)布,其能夠幫助開發(fā)者快速構(gòu)建應(yīng)用。 前端每周清單第 10 期:Firefox53、React VR發(fā)布、JS測(cè)試技術(shù)概述、Microsoft Edge現(xiàn)代DOM樹構(gòu)建及性能之道 為InfoQ中文站特供稿件,首發(fā)地址為這里;如需轉(zhuǎn)載,請(qǐng)與InfoQ中文站聯(lián)系。從屬于筆者的 Web 前端入門...

    MingjunYang 評(píng)論0 收藏0
  • 2014 杭JS大會(huì) 會(huì)議盛況與技術(shù)熱點(diǎn)現(xiàn)場(chǎng)報(bào)道(直播)

    摘要:中國(guó)開發(fā)者的年度盛會(huì)中國(guó)開發(fā)者大會(huì),于年月日在杭州舉辦了本年度的杭會(huì)議我們的和將為在現(xiàn)場(chǎng)為您帶來現(xiàn)場(chǎng)的報(bào)道,一覽大牛風(fēng)采,直擊技術(shù)熱點(diǎn)。簽到中第日的會(huì)議即將開幕以下是與參會(huì)者和與博文視點(diǎn)的作者們合影 中國(guó)JS開發(fā)者的年度盛會(huì)JS中國(guó)開發(fā)者大會(huì),于2014年6月21日在杭州舉辦了本年度的杭JS會(huì)議! 我們SegmentFault的 @integ 和 @shamiao 將為在現(xiàn)場(chǎng)為您帶來...

    caige 評(píng)論0 收藏0
  • 前端每周清單第 41 期 : Node 與 Rust、OpenCV 的火花,網(wǎng)絡(luò)安全二三事

    摘要:的網(wǎng)站仍然使用有漏洞庫(kù)上周發(fā)布了開源社區(qū)安全現(xiàn)狀報(bào)告,發(fā)現(xiàn)隨著開源社區(qū)的日漸活躍,開源代碼中包含的安全漏洞以及影響的范圍也在不斷擴(kuò)大。與應(yīng)用安全是流行的服務(wù)端框架,本文即是介紹如何使用以及其他的框架來增強(qiáng)應(yīng)用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清單專注...

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

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

0條評(píng)論

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