如何從0開發一個Atom組件

来源:https://www.cnblogs.com/jiasm/archive/2018/04/11/8799046.html
-Advertisement-
Play Games

最近用Atom寫博客比較多,然後發現一個很嚴重的問題。。沒有一個我想要的上傳圖片的方式,比如某乎上邊就可以直接copy/paste文件,然後進行上傳。然而在Atom上沒有找到類似的插件,最接近的一個,也還是需要手動選擇文件,然後進行上傳。這個操作流程太繁瑣,索性自己寫一個插件用好了。 成品插件下載地 ...


 

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

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

規劃

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

插件開發

因為Atom是一個Electron應用:https://electronjs.org

是使用JavaScript來開發的桌面應用,所以對於一個前端來說,簡直是太美好了。
我們先去翻看Atom的官方文檔,查看關於創建插件相關的操作:
首先我們在Atom中打開命令面板,然後輸入Generate Package

按下回車後,將會彈出一個對話框,在框中輸入要建立的包名即可完成一個Package的創建。

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

 

keymaps

這裡可以配置要監聽的快捷鍵,我們可以設置一些自定義快捷鍵來觸發一些我們插件的行為。

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

 

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

Atom官方文檔

lib

這裡就是存放插件主要代碼的地方了。
預設會生成兩個文件:

  1. package.js
  2. package.view.js

預設插件生成的主入口文件指向這裡。

入口文件的表現方式為一個JSON對象,可以實現如下幾個函數:

  1. activate: 當Package被激活時會執行該方法,函數的簽名錶示會接受一個state參數,該參數是通過serialize方法傳遞過來的(如果有實現它的話)
  2. deactivate: 當Package失效時會出發的方法,這兩個方法可以理解為React中的componentWillMountcomponentWillUnmount
  3. serialize: 也就是上邊說到的那個方法,可以返回一個JSON對象供下次激活後使用
  4. 自定義快捷鍵對應的事件名: 每次Package被觸發對應快捷鍵時都會執行的方法

這裡存放的是在應用菜單和編輯區域菜單欄的配置文件

{
  "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對應的元素會在對應的區域內右鍵觸發時顯示。
menu則是出現在Atom主菜單欄上:

同樣的,context-menu會區分兩個環境,text-editorworkspace

spec

這裡存放的是一些測試用例,創建Package會生成一些預設的斷言。
寫測試確實是一個好習慣。

styles

如果Package有很多View要展示的話,可以在這裡編寫,預設使用的是Less語法。
由於我們只做一個C/V的操作,不會涉及到界面,所以styles直接就刪掉了。

開始搬磚

大致結構已經瞭解了,我們就可以開始搬磚了。
因為是一個Electron應用,所以我們直接在Atom中按下alt + command + i,呼出我們熟悉的控制台界面。

Atom是不會把Electron的各種文檔重新寫一遍的,所以我們現在控制台裡邊試一下我們的猜測是否正確。
一些想要的東西是否存在。

經過驗證確定了,Electronclipboard對象可以直接在Atom中使用,這就很開心了。

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

 

這樣我們就拿到剪切板中的圖片數據了,一個二進位的數組對象。
我們在觸發Paste操作時,從clipboard中獲取,如果剪切板中是圖片的話,我們就將它上傳並顯示到編輯器中。
所以,接下來我們要做的就是:

  1. 進行上傳圖片的操作
  2. 將上傳後的圖片顯示到編輯器中

上傳圖片

上傳圖片我們選擇的是七牛,我們選擇七牛來作為圖床使用,因為他家提供了10GB的免費存儲,灰常適合自己這樣的筆記型博客。
但是用他家SDK時發現一個問題。。我將二進位數據轉換為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()

 

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

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

 

然後在上傳成功後,我們將對應的填充字元替換為上傳後的URL就可以了。

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

 

scan方法接收一個正則對象和回調函數。
我們將前邊用到的占位文本作為正則對象,然後在回調將其替換為上傳後的url
至此,我們的代碼已經編寫完了,剩下的就是一些交互上的優化。

完成後的效果圖:

以及,最後:我們要進行Package的上傳。

上傳開發完的Package

首先我們需要保證package.json中存在如下幾個參數:

  1. name
  2. description
  3. repository

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

apm show 你的包名

 

如果沒有衝突,我們就可以直接執行以下命令進行上傳了。

apm publish 你的包名

 

後續的代碼修改,只需在該包的目錄下執行:

apm publish

 

一些可選的參數:

  1. major,增加版本號的第一位1.0.0 -> 2.0.0
  2. minor,增加版本號的第二位0.1.0 -> 0.2.0
  3. patch,增加版本號的第三位0.0.1 -> 0.0.2

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

以上,就是開發一個Atom插件的完整流程咯。

參考資料

hacking-atom
electron-doc


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 蘋果開發者賬號中,測試機器列表達到100臺上限,想要刪除一些設備、添加新設備,怎麼辦? 我們公司規模比較大,項目也比較多,最近就遇到了開發過程中發現新的iPhone添加不到測試設備中,在蘋果開發者中心添加新設備給予下麵的提示 意思是說測試設備已達到100台的上限,於是以為把原來添加的設備“Disab ...
  • ReactiveObjC使用 ReactiveCocoa是Github開源的一個用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱。敢自稱為XXXCocoa框架可以想象到這個框架的牛逼! 現在分為ReactiveObjC和ReactiveSwift,兩個框架的功能使用相似,本文主要介紹Re ...
  • 如果兩個不同的應用註冊了同樣的URL Scheme,那麼後安裝的應用會響應符合這種協議格式的URL。 如果你的應用的iPhone和iPad版是各自獨立的(即不是Universal類型的),那麼你就不應該給兩個版本的應用定義同樣的URL協議。如果用戶在同一個設備上先後安裝了兩個版本的應用,之後又刪除了 ...
  • 聲明全局變數 ViewController.m showV.h showV.m ...
  • 粗淺的理解是把要展現的東西一股腦寫道render{}裡面就好,然後在頁面指定的div內渲染出來。 順帶複習一下es6中map: es6的Map結構用來表示鍵值對的集合,和js的Object的區別在於: object只能用字元串做鍵名,但是Map是可以包括各類值的 比如 ...
  • 這篇博客收錄平時看到的一些優秀文章,持續更新~ 面向對象 + "深入理解javascript原型和閉包" ...
  • 概述 模式是一種非常靈活復用性非常高的模式,它可以把特定行為或功能封裝成一個組件,提供給其他組件使用讓其他組件擁有這樣的能力,接下來我們一步一步來看React組件中如何實現這樣的功能。 React 組件數據傳遞 中我們可以給一個組件傳遞一些 並且在組件內部展示,同樣的我們也可以傳遞一些組件同樣也是行 ...
  • n HTML顏色表示 網頁中的顏色有三種表示方法 顏色單詞:blue、green、red、yellow 10進位表示:rgb(255,0,0)、rgb(0,255,0)、rgb(0,0,255) 16進位表示:#ff0000、#00ff00、#0000ff 自然界中,所有顏色都可以用三種光的不同波長 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...