代碼編輯器對比

由于在開發(fā)vue組件編輯工具中需要一款可以嵌入web的代碼編輯器,所以對目前的開源的基于javascript的代碼編輯器進(jìn)行了調(diào)研集灌。本文主要從編輯器的維護(hù)和更新狀態(tài)、功能完備度、擴(kuò)展性笛匙、外觀/交互、官網(wǎng)/文檔/api/demo犀变、支持/維護(hù)/社區(qū)妹孙、兼容性(瀏覽器)等方面進(jìn)行對比篩選。

1.編輯器統(tǒng)計(jì)數(shù)據(jù)

統(tǒng)計(jì)來源: Wikipedia Comparison of JavaScript-based source code editors

總覽:

image.png

上表中主要從最后的版本發(fā)布時(shí)間获枝,活躍狀況來判斷編輯器的維護(hù)和更新狀態(tài)蠢正,同時(shí)判斷是否開源也是選型的前提之一。

功能列表:

image.png

功能列表可以一目了然的把編輯器的功能完備度對比出來省店,作為現(xiàn)代的代碼編輯器嚣崭,語法主題高亮笨触,自動(dòng)補(bǔ)全縮進(jìn),快捷鍵操作有鹿,搜索和替換等功能是必不可少的旭旭。

綜合上述兩個(gè)表的數(shù)據(jù),結(jié)合部分編輯器的官網(wǎng)介紹和demo葱跋,篩選出三款編輯器:ACE, codemirror, monaco editor持寄,進(jìn)行更細(xì)致全面的比較。

2.codemirror

CodeMirror是一個(gè)用JavaScript為瀏覽器實(shí)現(xiàn)的多功能文本編輯器娱俺。它專門用于編輯代碼稍味,并附帶一些實(shí)現(xiàn)更高級編輯功能的語言模式和插件。其核心僅提供編輯器功能荠卷,其他功能通過豐富的API和插件實(shí)現(xiàn)模庐。CodeMirror的使用基于特定的程序語言模式(mode),它對特定的語言進(jìn)行語法解析(parse)油宜,使編輯器能夠在解析結(jié)果基礎(chǔ)上進(jìn)行語法高亮掂碱,實(shí)現(xiàn)具有上下文感知(context-aware)的代碼補(bǔ)全、縮進(jìn)等功能慎冤。

image.png

編輯器的架構(gòu)圖:

image.png

2.1使用

引入codemirror.js/codemirror.css/ 對應(yīng)語言的mode文件(如: /mode/javascript/javascript.js );

整體功能及擴(kuò)展:

image.png
創(chuàng)建編輯器實(shí)例:

1.編輯器將append到 container元素中:var editor = CodeMirror(container, options);

2.或者直接替換textarea元素:var editor = CodeMirror.fromTextArea(myTextArea);

2.2 配置

 默認(rèn)配置從CodeMirror.defaults中獲取疼燥。可以更新此對象以更改頁面上的默認(rèn)值蚁堤,例如配置 輸入初始值醉者, 語法模式, 風(fēng)格主題披诗, 鍵盤映射撬即, 快捷鍵綁定。

2.3 event(事件)

    各種與CodeMirror相關(guān)的對象發(fā)出事件呈队,這些事件允許客戶端代碼對各種情況作出反應(yīng)剥槐。

事件的處理程序可以用事件觸發(fā)對象的on和off方法進(jìn)行注冊,主要由四類事件:編輯器實(shí)例掂咒、文檔實(shí)例才沧、代碼行、文本范圍绍刮。

2.4 keymap(鍵盤映射)

    鍵映射是將鍵和鼠標(biāo)按鈕與功能相關(guān)聯(lián)的方式.鍵映射是一個(gè)映射字符串的對象温圆,它將按鈕標(biāo)識為實(shí)現(xiàn)其功能的函數(shù)。帶有Emacs孩革,Vim和Sublime Text-style鍵盤映射岁歉。可以使用extraKey配置或command API自定義。

2.5 command(命令)

    命令是可以在編輯器上執(zhí)行的無參數(shù)操作锅移。他們主要用于鍵綁定熔掺。庫本身定義了許多常用命令,其中大多數(shù)命令由默認(rèn)的鍵綁定使用

定義命令:CodeMirror.commands非剃,執(zhí)行命令: execCommand置逻。

2.6 自定義樣式

    CodeMirror的外觀可以通過修改css文件實(shí)現(xiàn)。mode提供的css文件只是為該模式提供顏色备绽。編輯器本身的樣式通過改變或覆蓋 codemirror.css的實(shí)現(xiàn)

codemirror提供了必須定義的css類名券坞,css文件必須包括這些類名才能保證編輯器的正常工作,主題也是css文件肺素,定義了各種語法元素的顏色 查看 /theme 目錄恨锚。

2.7 API

    許多CodeMirror功能只能通過其API訪問。因此倍靡,如果您想將其公開給用戶猴伶,則需要編寫代碼(或使用插件)。包括內(nèi)容操作塌西,光標(biāo)和選擇他挎,配置,文件管理等方法捡需。每個(gè)編輯器都與其文檔CodeMirror.Doc的一個(gè)實(shí)例相關(guān)聯(lián)雇盖,一個(gè)文檔代表編輯器的內(nèi)容,外加一個(gè)選擇栖忠,一個(gè)撤消歷史和一個(gè)模式,一個(gè)文檔一次只能與一個(gè)編輯器關(guān)聯(lián)贸街,文檔實(shí)例擁有歷史操作庵寞、文本標(biāo)記、工具薛匪、大小捐川,滾動(dòng)和定位、模式逸尖,狀態(tài)和令牌相關(guān)的方法古沥。

2.8 addon(插件)

   插件目錄包含許多可重用的組件,這些組件實(shí)現(xiàn)了額外的編輯器功能娇跟,例如代碼提示岩齿,代碼補(bǔ)全,搜索和替換

2.9 編寫mode

  mode最簡單的定義了一個(gè)詞法解析器苞俘,解析編輯器的內(nèi)容盹沈,更高級的模式也可以處理語言的縮進(jìn)。(相當(dāng)于寫一個(gè)語法解析器吃谣,比較復(fù)雜乞封,不具體描述)

2.10

功能表

image.png

codemirror通過插件實(shí)現(xiàn)了一些特別的功能做裙,例如:


image.png

2.11 附錄

2.12 評價(jià):

image.png

3. ACE

Ace是一個(gè)用JavaScript編寫的嵌入式代碼編輯器。它與Sublime肃晚,Vim和TextMate等原生編輯器的功能和性能相匹配锚贱。它可以很容易地嵌入到任何網(wǎng)頁和JavaScript應(yīng)用程序中。作為與codemirror同類的現(xiàn)代編輯器关串,ACE同樣擁有mode進(jìn)行語法解析拧廊,實(shí)現(xiàn)編輯器的智能感知型功能。

image.png

架構(gòu):

image.png

Ace也實(shí)現(xiàn)了編輯器和代碼文檔的分離悍缠,Session管理代碼的編輯狀態(tài)卦绣,Document為代碼容器,TextMode提供語言解析飞蚓,為代碼高亮和智能編輯提供支持滤港,Editor為編輯器的核心,它處理代碼的狀態(tài)趴拧,處理IO事件溅漾,渲染編輯器組件。

3.1 使用

image.png

通過ace.edit直接創(chuàng)建著榴,通過api設(shè)置編輯器

image.png

Ace只需引入一個(gè)文件添履,跟codemirror的核心包差不多大小(400k左右),但已經(jīng)集成了豐富的特性脑又,包括主題設(shè)置暮胧,語言設(shè)置,編輯內(nèi)容和狀態(tài)的操作问麸,搜索替換往衷,事件監(jiān)聽處理,快捷鍵與命令等功能严卖。

3.2 API

Ace主要分為Editor席舍、Session、Document哮笆、Mode来颤、VirtualRenderer五個(gè)模塊,針對五個(gè)模塊都有對應(yīng)的API進(jìn)行操作稠肘。通常用戶使用較多的是Session類的API福铅,涉及對編輯狀態(tài)的獲取和修改,如光標(biāo)项阴、選擇本讥、代碼行、代碼搜索等類的API方法都較為豐富。

3.3 自定義Mode

Ace提供了非常詳細(xì)完整的文檔描述如何自定義一個(gè)語法高亮的模塊擴(kuò)展拷沸,其中包括編寫mode(語法解析)色查、高亮規(guī)則、代碼流的狀態(tài)機(jī)撞芍、mode繼承等秧了,并提供了一個(gè)可在線預(yù)覽的編輯環(huán)境。

3.4 附錄

官網(wǎng): <u>https://ace.c9.io/</u>

github: <u>https://github.com/ajaxorg/ace</u> star:16k issue:580

編寫mode: <u>https://ace.c9.io/tool/mode_creator.html</u>

demo: <u>https://ace.c9.io/build/kitchen-sink.html</u>

社區(qū):https://groups.google.com/forum/#!forum/ace-discuss

用戶: <u>https://ace.c9.io/#nav=production</u>

3.5 評價(jià)

image.png

4. monaco editor

image.png

monaco是VS Code的代碼編輯器序无,同時(shí)也是一個(gè)開源代碼編輯器验毡,可以嵌入到Web應(yīng)用程序中。

4.1 創(chuàng)建

[圖片上傳中...(image-9be8b0-1566646220272-0)]

monaco的引入需要預(yù)先加載loader帝嗡,該loader相當(dāng)于一個(gè)AMD的加載器把monaco的模塊和依賴加載進(jìn)來晶通,然后通過全局的monaco變量創(chuàng)建編輯器實(shí)例哟玷。這種引入方法對于打包可能會造成不小的麻煩,社區(qū)也有issue(https://github.com/Microsoft/monaco-editor/issues/18 )關(guān)于如何解決monaco在webpack中的加載谦絮。

4.2 API

monaco實(shí)現(xiàn)了vscode的編輯器,功能完備且集成度高祭椰,可以說即插即用钉赁,非常適合僅需編輯功能不考慮擴(kuò)展和自定義樣式的場景带膜。

image.png

API主要分為editor和language滑废,涉及編輯器的操作使用editor提供的API辛馆,language主要進(jìn)行代碼程序語言的擴(kuò)展。

4.3 自定義語法

monaco有一個(gè)專門的庫Monarch定義語法高亮硕蛹,包括language(語言定義),token(語法標(biāo)記)乙濒,state(狀態(tài)機(jī)),rules(輸入規(guī)則)等語言解析的模塊卵蛉,其中可以通過json文件直接定義語言颁股,不用像另外兩種編輯器那樣編寫程序。同樣也支持語法的繼承傻丝。支持高級功能如復(fù)雜的大括號匹配甘有,語言定義的更多屬性,復(fù)雜的動(dòng)態(tài)結(jié)束標(biāo)簽葡缰。與Ace一樣提供在線的語法定義的編輯預(yù)覽亏掀。

image.png

4.4 評價(jià)

image.png

5. 總結(jié)

功能點(diǎn)的對比

image.png

功能的整體對比來看忱反,CodeMirror的功能比較多,但三者相差不大滤愕,基本功能都具備温算,只是某些特殊功能codemirror可以通過其豐富的擴(kuò)展實(shí)現(xiàn)。

綜合對比

image.png
image.png

綜合以上對比该互,可以對三款編輯器做出初步評價(jià)米者,三款功能基本完備,CodeMirror適合支持?jǐn)U展性要求高的定制型編輯器宇智,但其多文件的引入方式帶來一定的管理不方便以及瀏覽器端的網(wǎng)絡(luò)性能影響蔓搞。Ace綜合能力突出,適應(yīng)現(xiàn)代的前端開發(fā)能力随橘,基本上手簡單喂分,擴(kuò)展也較為豐富,適合在瀏覽器端的網(wǎng)頁中嵌入机蔗。monaco集成度最高蒲祈,引入文件量巨大,引入方式兼容性不太好萝嘁,但功能實(shí)現(xiàn)完備梆掸,不需另外的擴(kuò)展引入,適合需要實(shí)現(xiàn)復(fù)雜功能但不進(jìn)行深度擴(kuò)展的應(yīng)用牙言,因其不支持mobile且文件量大酸钦,在electron這類的客戶端環(huán)境使用較為合適。

附:

三款編輯器的vue組件封裝和擴(kuò)展:

codemirror:

Vue-Codemirror: Codemirror component for Vue.

<u>https://github.com/surmon-china/vue-codemirror</u>

Vue-Codemirror-Lite: Lightweight Codemirror Component for Vue.js

<u>https://github.com/cnu4/vue-codemirror-lite</u>

monaco:

vue-monaco-editor: Monaco Editor Vue Component

<u>https://github.com/matt-oconnell/vue-monaco-editor</u>

monaco-vue: Vue language plugin for the Monaco Editor.

<u>https://github.com/rebornix/monaco-vue/blob/master/test/index.html</u>

Ace:

vue2-ace-editor:A packaging of ace

<u>https://github.com/chairuosen/vue2-ace-editor</u>

from 基于JavaScript的代碼編輯器的比較和選型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咱枉,一起剝皮案震驚了整個(gè)濱河市卑硫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚕断,老刑警劉巖欢伏,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亿乳,居然都是意外死亡硝拧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門葛假,熙熙樓的掌柜王于貴愁眉苦臉地迎上來障陶,“玉大人,你說我怎么就攤上這事桐款。” “怎么了夷恍?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵魔眨,是天一觀的道長媳维。 經(jīng)常有香客問我,道長遏暴,這世上最難降的妖魔是什么侄刽? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮朋凉,結(jié)果婚禮上州丹,老公的妹妹穿的比我還像新娘。我一直安慰自己杂彭,他們只是感情好墓毒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亲怠,像睡著了一般所计。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上团秽,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天主胧,我揣著相機(jī)與錄音,去河邊找鬼习勤。 笑死踪栋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的图毕。 我是一名探鬼主播夷都,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吴旋!你這毒婦竟也來了损肛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荣瑟,失蹤者是張志新(化名)和其女友劉穎治拿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笆焰,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劫谅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚷掠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捏检。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖不皆,靈堂內(nèi)的尸體忽然破棺而出贯城,到底是詐尸還是另有隱情,我是刑警寧澤霹娄,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布能犯,位于F島的核電站鲫骗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏踩晶。R本人自食惡果不足惜执泰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渡蜻。 院中可真熱鬧术吝,春花似錦、人聲如沸茸苇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽税弃。三九已至纪岁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間则果,已是汗流浹背幔翰。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留西壮,地道東北人遗增。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像款青,于是被迫代替她去往敵國和親做修。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容