精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SVGEdit:老牌開源 SVG 編輯器是如何架構(gòu)的?

開發(fā) 前端
作為一款 SVG 編輯器,選擇 SVG 沒有毛病,這樣渲染效果就完全交給瀏覽器,不需要根據(jù)標準去實現(xiàn)渲染效果,自己專心寫編輯器的業(yè)務邏輯即可。沒有用 TypeScript,因為是很老的項目,當時 TypeScript 尚未大行其道。如果要做新項目,建議還是上 TypeScript,大型復雜軟件還是很需要類型系統(tǒng)的。

大家好,我是前端西瓜哥。這次簡單看看 SVGEdit 的架構(gòu)。

SVGEdit 的版本為 7.2.0。

SVGEdit 一款非常老牌的 SVG 圖形編輯器,用于編輯處理 SVG,star 數(shù)目前是 5.8k。

它的優(yōu)點在于經(jīng)過多年的開發(fā),完成度高,較為成熟,功能相當豐富。

  • 有豐富的工具:選擇工具、鉛筆工具、鋼筆工具(三階貝塞爾)、直線、各種圖形、圖片、文字等;
  • 畫布縮放、圖形縮放旋轉(zhuǎn)、編組、復制粘貼、層級排布修改、對齊;
  • 網(wǎng)格線、標尺、圖層管理、導入導出 SVG;
  • 歷史記錄,支持撤銷重做(編輯器的基本功能)等等。

缺點是幾乎不維護了,提交很少,大概一個月一提交,最新版 7.2.0 也是 22 年 8 月的時候了。

UI 比較簡陋,很簡單就能看到一些 UI bug。

如果要找一個 UI 好看的,可以看看開源項目 :Method-Draw,這個 UI 好看很多。它  fork 了 SVG-Edit 并做了一些改造。

Method-Draw 標榜簡單易用,所以有意去掉了 SVGEdit 的一些高級功能,比如圖層。

技術棧

Web Component + SVG + Rollup + i18next

UI 使用了 Web Component,瀏覽器原生支持的組件方案。

作為一款 SVG 編輯器,選擇 SVG 沒有毛病,這樣渲染效果就完全交給瀏覽器,不需要根據(jù)標準去實現(xiàn)渲染效果,自己專心寫編輯器的業(yè)務邏輯即可。

沒有用 TypeScript,因為是很老的項目,當時 TypeScript 尚未大行其道。如果要做新項目,建議還是上 TypeScript,大型復雜軟件還是很需要類型系統(tǒng)的。

打包用了 Rollup。國際化用了 i18next。

模塊設計

UI 層對應 Editor 類,該類繼承了 EditorStartup 類,后者做一些初始化操作。

編輯器內(nèi)核對應 SvgCanvas 類。

SvgCanvas 感覺太多讀寫屬性的方法(getXx 和 setXx)了,學 Java 學的??梢猿閹讉€小類把耦合性強的方法封裝起來。

有插件機制,插件對象通過 addExtension 方法注入到 SvgCanvas.extensions 對象。

可以看到注冊了 grid(網(wǎng)格)、markers(標尺)之類的插件。

關于 UI 層和內(nèi)核層的通信,UI 層改數(shù)據(jù),會直接改內(nèi)核層,然后再改 UI 層。

這里的 zoom 有兩個數(shù)據(jù)源,可能會出現(xiàn)改了一個忘記改另一個的情況。建議只使用一個內(nèi)核層數(shù)據(jù)源,改這個數(shù)據(jù)源后通過事件通知 UI 層或其他層做數(shù)據(jù)同步。多數(shù)據(jù)源是壞文明。

渲染方案

渲染方案是 SVG。

SVG 編輯器用 SVG,相當合理。

對于圖形樹的實現(xiàn)、圖形拾?。c選)、圖形渲染,SVGEdit 都交給瀏覽器都去實現(xiàn)。

SVG 對一般前端開發(fā)是非常好上手的,不需要太多圖形知識,本質(zhì)就是一個有層級的 DOM 元素樹,前端同學再熟悉不過了,只是元素專門用來描述圖形。

但因為遠離底層,不方便做一些渲染優(yōu)化和緩存,圖形多的時候很卡,不適合做高性能圖形編輯器。

靈活性也較差,比如一個 0.5 線寬的直線還把畫布縮小了,根本就點不中好不好,希望點擊區(qū)域可以外擴一些,或想點中一個設置為不可見的圖形點擊區(qū)域。這個做不了。

當然一個可以考慮的方案是 SVG 只是單純做渲染,圖形拾取自己實現(xiàn)。

但 SVG 有一個強大的優(yōu)點:方便做功能擴展,進行二次開發(fā)。

比如你要在圖形編輯器里加一個新的模塊,比如倒計時、一個表單組件,網(wǎng)上找到輪子集成進去會很方便。因為 SVG 里面可以嵌入 DOM 元素,DOM 元素里也可以嵌入 SVG。

UI 層

UI 層原本是基于 jQuery UI 的,但后面丟棄  jQuery 改用 Web Component 進行了重構(gòu)。

順帶一提,有個叫做 jPicker 的基于 jQuery 的拾色器插件,也做了魔改,去掉對 jQuery 的依賴。

它沒有用 React、Vue 這些 UI 框架,而是選擇 Web Component,我認為這是一個糟糕的決策。

Web Component 雖然被 瀏覽器原生支持,但并不是主流,生態(tài)一般,輪子不如 React 和 Vue 豐富。

我們繼續(xù)看代碼。

以左側(cè)欄 LeftPanel 為例,HTML 為:

這里的 se-button 就是一個 Web Component 組件,里面有局部樣式和交互邏輯,類似 React 和 Vue。

全局樣式文件是 svgedit.css。

LeftPanel 類初始化后會調(diào)用 init 方法。

該方法會:

  • 讀取前面的 HTML 創(chuàng)建一個 template 元素,然后添加 DOM 樹中。
  • 給一些 DOM 元素綁定了事件響應函數(shù)。

$id 這些是工具類方法。

下面代碼的作用是,給選擇工具按鈕綁定方法,該方法更改編輯器的模式為選擇模式。

LeftPanel 的 init 方法是在 EditorStartUp 類(這個是 Editor 的父類)的 init 方法中被調(diào)用的。

圖形拾取

點選 圖形的圖形拾取是交給瀏覽器,監(jiān)聽鼠標按下事件的方式,讀取 mouseEvent.target。

因為可能有組的存在,所以會不斷地讀 parentNode 找最頂層的 group 元素,直到當前 group 結(jié)束。

框選 會在點中空白區(qū)域出現(xiàn),并將當前模式(currentMode)臨時切換為 multiselect。

期間產(chǎn)生的選區(qū)矩形元素保存在 svgCanvas.rubberBox 屬性中。

拖拽修改選區(qū)矩形寬高時,會遞歸 SVG 樹,計算它們的 bbox,判斷是否和選區(qū)矩形相交。將相交的圖形放到 selectedElements 屬性中。

工具管理

切換工具使用 SvgCanvas.setMode('line') 的方式。

不同工具都有各自實現(xiàn)的事件響應函數(shù),當用戶進行鼠標操作時,會執(zhí)行 mouseDownEvent、mouseMoveEvent、mouseUpEvent,會根據(jù) mode 執(zhí)行不同的工具的方法。

鋼筆工具對應 svgCanvas.pathActions 屬性,對應 pathActionsMethod 方法,沒有用類,而是用了閉包的方式進行邏輯封裝。

圖形工具的邏輯倒沒有抽一個對象出來,直接寫在 ouseDownEvent、mouseMoveEvent、mouseUpEvent 里。

操作的歷史記錄

兩個棧等價于一個數(shù)組或雙向鏈表中,加上一個指針,該指針指向多個命令中的當前命令。

撤銷就是把指向往左移動,重做往右移,新操作則把指針后面的命令丟掉,然后把這個新的操作加到數(shù)組中,并將指針后移。

SVGEdit 的歷史命令都保存在 UndoManager 類的 undoStack 數(shù)組中,并用 undoStackPointer 指針指向最新命令的位置。

SVGEdit 使用了 patch(打補?。┑姆绞接涗洑v史操作,沒有使用圖形樹快照的方式。

下面是移動一個矩形產(chǎn)生的操作命令,它記錄了修改圖形屬性的命令,該命令保存了一個元素修改前后的屬性。

這里有個特殊的 BatchCommand 批量命令對象,它的 stack 數(shù)組記錄了一次操作要執(zhí)行的多個子命令。

其實就是 宏命令。宏命令的作用是將多個命令組合在一起批量執(zhí)行。

各種命令類保存在 svgCanvas.history 中。

簡評

UI 框架應該選擇 React 或 Vue。

這樣項目才會有更多人使用,作為一款比較古早的編輯器才可能煥發(fā)第二春。

最好是 Vue3,國內(nèi)很多中小廠在用,那里的程序員不喜歡造輪子,這樣他們就會用你這個編輯器,然后社區(qū)繁榮,贏。當然最好 React 和 Vue 都做。

SVGEdit 丟掉 jQuery 用 Web Component,我不是很理解,外國比較流行這個?這樣就不好集成進公司的項目中,不利于項目的持續(xù)發(fā)展。

不要使用單例。

我看不少地方用了單例,單例模式有個問題,如果頁面需要同時有多個編輯器實例,比如做兩張圖紙對比功能。

那它們就會因為單例的對象共享導致沖突,比如改了編輯器 A 的設置屬性會同時改了編輯器 B 的,這不是我們想要的。

類的面向?qū)ο箫L格是比較好的解法,每個對象都要創(chuàng)建一個新的實例,就不會沖突了。

較多的 UI bug。

選中一個元素就能復現(xiàn),此外 UI 也不好看。

監(jiān)聽鼠標事件應該放到 document 下。

放到 SVG 的容器或 SVG 上其實并不是很好的做法,當光標移到這些元素外時,監(jiān)聽就消失了,綁定到 doucment 下即使光標移動到瀏覽器外都能監(jiān)聽。

結(jié)尾

SVGEdit 支持的功能很多,但 UI 比較復古,小 bug 有點多的樣子。

但如果你要做 SVG 編輯器,與其從零開始,不如基于 SVGEdit 做去二次開發(fā)。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2020-09-18 06:00:51

開源Markdown編輯器

2017-05-23 19:19:16

開源Markdown編輯器

2023-12-15 09:59:14

開源GIF編輯器圖片格式

2020-08-22 07:46:58

Photoflare開源圖像編輯器

2022-03-20 18:12:03

Shotcut開源視頻編輯器

2019-06-18 09:40:57

Graviton開源代碼編輯器

2025-02-05 12:01:35

屬性編輯器Web

2018-05-11 14:59:21

LinuxVim編輯器

2024-02-21 16:40:06

Web代碼編輯器開源

2011-01-10 16:17:49

2024-01-16 18:13:46

開源AudacityAI 工具

2022-05-25 10:57:20

文本編輯器Linux應用程序

2022-09-16 09:43:32

開源PhotoDemon

2010-03-24 09:20:07

CentOS vi編輯

2014-06-05 10:34:54

Notepad++

2022-04-15 09:59:08

Lexical開源Meta

2021-06-23 06:12:38

Subtitld編輯器開源

2023-12-26 08:01:06

開源視頻編輯器軟件

2011-08-04 16:26:20

注冊表編輯器

2013-06-18 01:22:46

CocoStudio工Cocos2d-x
點贊
收藏

51CTO技術棧公眾號

一区二区三区四区影院| 亚洲黄色一区二区三区| 国产成人一级片| 红桃成人av在线播放| 欧美人牲a欧美精品| 国产午夜精品视频一区二区三区| 亚洲一二区在线观看| 无码精品人妻一区二区| 视频一区欧美日韩| 久久精品国产2020观看福利| 久久久久免费精品| 黄色av电影在线观看| 成人精品国产免费网站| 国产精品视频yy9099| 精品无码黑人又粗又大又长| 欧美日韩国产免费观看视频| 懂色aⅴ精品一区二区三区蜜月| 欧洲在线视频一区| 亚洲高清精品视频| 蜜臀av国产精品久久久久| 欧美激情综合色综合啪啪五月| 午夜福利123| 黑人巨大精品| 亚洲成人av中文| 咪咪色在线视频| 你懂的在线看| 大陆成人av片| 成人性生交xxxxx网站| 免费黄色网址在线| 黑人一区二区| 久久精品国产久精国产一老狼| 无码人妻aⅴ一区二区三区| 国产 日韩 欧美| 欧美丝袜丝nylons| 成人小视频在线看| 国产精选在线| 亚洲一区二区三区不卡国产欧美| 中日韩在线视频| 国产私拍精品| 久久婷婷国产综合精品青草| 国产一区二区三区无遮挡| 国产精品伦一区二区三区| 中文国产一区| 在线不卡免费欧美| 日韩中文字幕组| 三妻四妾的电影电视剧在线观看| 亚洲一卡二卡三卡四卡无卡久久 | 麻豆精品在线| 欧美老人xxxx18| 国产一级片自拍| 国产欧美自拍| 在线观看免费亚洲| 亚洲欧洲一二三| 岛国在线视频免费看| 久久亚洲综合色一区二区三区| 国产日韩二区| 亚洲 国产 欧美 日韩| 91一区在线观看| 你懂的网址一区二区三区| 青青青草网站免费视频在线观看| www欧美成人18+| 欧美大香线蕉线伊人久久国产精品 | 色综合久久66| 999精品网站| 成人毛片免费| 91精品免费在线| 99er在线视频| 精品视频一二区| 韩国精品在线观看 | 日韩视频一区二区三区四区| 日韩写真欧美这视频| 成人做爰69片免费| 国偷自产av一区二区三区| 日韩av网址在线| 国产一区二区三区四区五区六区| 欧美日韩中字| 久久高清视频免费| 久久精品无码人妻| 久久精品日产第一区二区| 国产精品久久久久久久久久小说| 97超碰人人模人人人爽人人爱| 九九**精品视频免费播放| 亚洲一区中文字幕| 色婷婷视频在线| 国产视频一区二区在线观看| 国产精品美女在线播放| 第一av在线| 国产精品你懂的在线欣赏| 正在播放一区| 天堂中文最新版在线中文| 在线视频一区二区三| 日本网站在线看| 台湾色综合娱乐中文网| 日韩中文av在线| 日本三级中文字幕| 日本不卡123| 99国产超薄肉色丝袜交足的后果| 青青免费在线视频| 日韩理论片一区二区| 日韩国产精品一区二区三区| 老司机精品视频在线观看6| 亚洲超丰满肉感bbw| 男人搞女人网站| 一区二区三区在线资源| 欧美一区在线视频| 国产一二三区av| 国产精品麻豆| 亚洲欧洲美洲在线综合| 亚洲女爱视频在线| 亚洲91精品在线观看| 波多野结衣午夜| 精品日韩欧美一区| 久久999免费视频| 男人天堂视频在线| 成人美女视频在线观看| 亚洲人成影视在线观看| 人在线成免费视频| 日韩一区二区电影在线| 国产伦精品一区二区三区视频女| 青青草手机视频在线观看| 欧美黄色大片网站| 国产精品福利网站| 天天av天天翘| 一区二区三区在线免费| 97公开免费视频| 美国十次av导航亚洲入口| 久久精品国产一区| 无码人妻精品一区二区| 国产成人激情av| 最新不卡av| 欧美视频第一| 亚洲精品第一国产综合精品| 久久久久99精品成人片试看| 蜜臀av一区二区| 日本高清视频一区二区三区| 999av小视频在线| 日韩欧美二区三区| 国产av 一区二区三区| 九色|91porny| 一本色道久久综合亚洲精品婷婷| 欧美不卡高清一区二区三区| 亚洲女人被黑人巨大进入| 日韩免费观看一区二区| 成人综合婷婷国产精品久久| 300部国产真实乱| 中文字幕综合| 欧美精品亚洲二区| 国产精品国产三级国产专业不| 亚洲综合不卡| 久久综合精品一区| 在线看的毛片| 亚洲美女自拍视频| 91丝袜一区二区三区| 久久在线观看免费| 久久精品午夜福利| 黄色不卡一区| 成人a在线视频| a篇片在线观看网站| 欧美一区二区国产| 欧美日韩成人免费观看| 国产传媒一区在线| 又大又硬又爽免费视频| 久久精品国产亚洲5555| 欧美一区二区.| 一区二区三区免费在线视频| 国产精品色呦呦| 三级性生活视频| 午夜不卡一区| 国产亚洲成av人在线观看导航| 黄色av网址在线播放| 久9re热视频这里只有精品| 91精品国产91久久久久福利| 青青草免费在线视频| 日本精品免费观看高清观看| www.日本一区| 亚洲人成免费网站| 99精品国产高清一区二区| 6699嫩草久久久精品影院| 亚洲精品自拍第一页| 波多野结衣一区二区三区四区| 国产精品五月天| 乳色吐息在线观看| 亚洲日本国产| 天堂一区二区三区| 日韩免费成人| 奇米成人av国产一区二区三区| 999在线视频| 日韩女优毛片在线| 国产综合精品视频| 亚洲欧美一区二区视频| 亚洲欧美日韩色| 亚洲国产精品成人| 国产成+人+综合+亚洲欧洲| 91欧美在线视频| 精品捆绑美女sm三区| 亚洲中文一区二区| 一区二区三区高清| 手机在线免费毛片| 国产亚洲激情| 一本—道久久a久久精品蜜桃| 99re8这里有精品热视频8在线| 日本电影亚洲天堂| 污片在线免费观看| 一区二区三区视频在线| 国产成人手机在线| 欧美精品777| 亚洲GV成人无码久久精品 | 欧美自拍偷拍午夜视频| 久草视频手机在线观看| 欧美精彩视频一区二区三区| 中文字幕天堂网| 激情综合网最新| av丝袜天堂网| 一区二区三区国产在线| 国产日韩第一页| 欧美日韩在线播放视频| 精品欧美一区二区在线观看视频| 国产95亚洲| 国产伦精品一区二区三区精品视频| 毛片电影在线| 欧美激情精品久久久久久蜜臀 | 97免费在线视频| 4438x成人网全国最大| 中文字幕日韩欧美在线 | 日韩在线视频播放| 免费在线视频一级不卡| 亚洲丁香久久久| www.我爱av| 欧美一区二区三区思思人| 国产黄色免费视频| 色综合天天综合狠狠| 99精品视频99| 亚洲成人激情av| 日本熟妇一区二区| 亚洲一区二区三区小说| 国产极品国产极品| 亚洲色图在线播放| 夫妻性生活毛片| 亚洲桃色在线一区| 亚洲欧美精品aaaaaa片| 亚洲同性gay激情无套| 自拍偷拍第9页| 国产精品国产三级国产有无不卡 | 日韩啪啪电影网| 婷婷久久青草热一区二区| 国产成人短视频在线观看| 久久久久久99| 亚洲深夜福利在线观看| 欧美日韩国产高清视频| 国产九一精品| 日韩精品一区二区三区外面| 成人在线免费观看视频| 亚洲精品成人三区| 我不卡影院28| 国产成人生活片| 一区在线免费观看| 少妇av一区二区三区无码| av成人黄色| 欧美日韩一区二区在线免费观看| 天堂成人免费av电影一区| 日韩欧美在线免费观看视频| 美女视频黄a大片欧美| 日韩av片免费观看| 风流少妇一区二区| aaaaa一级片| 中文字幕乱码亚洲精品一区| 中国一级片在线观看| 亚洲国产婷婷综合在线精品| 欧美在线观看不卡| 欧美婷婷六月丁香综合色| 国产乱淫a∨片免费观看| 欧美sm极限捆绑bd| 天堂av电影在线观看| 国产亚洲欧美aaaa| 国产黄色在线网站| 韩国精品久久久999| 色香欲www7777综合网| 91色视频在线导航| 里番精品3d一二三区| 日韩精品成人一区二区在线观看| 羞羞答答成人影院www| 成年人网站国产| 欧美aaaaaa午夜精品| 美女被艹视频网站| 99re视频精品| 国产一二三四视频| 亚洲一区二区在线免费观看视频| 久久久久久久久久久久久av| 欧美日韩午夜在线视频| 欧美一级在线免费观看| 一本一道久久a久久精品逆3p| 中文在线字幕免费观看| 秋霞av国产精品一区| 国产精品成人3p一区二区三区| 国产一区二区三区四区hd| 成人婷婷网色偷偷亚洲男人的天堂| 成人一区二区av| 日韩av中文字幕一区二区 | 91视频一区二区三区| 四虎地址8848| 一本色道亚洲精品aⅴ| 精品国产亚洲av麻豆| 国产一区二区三区直播精品电影| 色yeye免费人成网站在线观看| 国产精品久久久久免费a∨| 999国产精品一区| 伊甸园精品99久久久久久| 国产欧美日本| 日本女人性视频| 国产精品欧美久久久久一区二区| 少妇一级淫片免费放中国 | 欧美视频免费一区二区三区| 久久伊人精品视频| 国产区av在线| 久久久久久成人精品| 亚洲成人a级片| 日本高清不卡三区| 亚洲综合精品| 久久免费精品国产| 亚洲精品水蜜桃| 97caocao| 日韩视频欧美视频| 日本精品裸体写真集在线观看| 久久久久久久久久久久久久一区| 欧美不卡在线| 色网站在线视频| 亚洲视频免费在线观看| 在线观看毛片av| 亚洲天堂一区二区三区| 中文字幕影音在线| 九色综合婷婷综合| 亚洲麻豆一区| 亚洲图片欧美另类| 亚洲一区二区精品久久av| 精品乱子伦一区二区| 久热精品视频在线观看| 91精品麻豆| 免费看av软件| 国产一区欧美一区| 美国一级片在线观看| 亚洲女同ⅹxx女同tv| 91亚洲国产成人久久精品麻豆 | bt在线麻豆视频| 成人国内精品久久久久一区| 日韩欧美不卡| 999这里有精品| 亚洲日本欧美天堂| 国产又黄又粗又硬| 美女av一区二区| 久久伦理中文字幕| 久久久久久av无码免费网站下载| 国产乱人伦精品一区二区在线观看| 青青草成人免费| 精品日韩av一区二区| 超碰高清在线| 免费电影一区| 免费高清视频精品| 国产在线免费看| 日韩欧美一级在线播放| 国产丝袜精品丝袜| 精品综合在线| 日本在线观看不卡视频| 懂色av粉嫩av蜜臀av一区二区三区| 欧美一区二区在线视频| 在线中文字幕视频观看| 国产精品一区二区三区四区五区| 一区二区国产精品| 日韩一区二区a片免费观看| 欧美日韩国产免费| av片在线观看网站| 精品免费国产| 美国一区二区三区在线播放| 欧美成人一区二区三区高清| 日韩精品一区二区三区第95| av成人在线观看| 白白操在线视频| 91麻豆国产自产在线观看| 91porny九色| 久久99精品国产99久久6尤物| 久久男人av| 国产精品久久久毛片| 一区二区三区加勒比av| 男女污污视频在线观看| 91精品免费视频| 国产精品久久久久久久久久妞妞 | 一区二区三区蜜桃| 亚洲AV成人无码一二三区在线| 国产精品免费看久久久香蕉| 欧美日韩亚洲一区二区三区在线| 香蕉网在线播放| 欧美一区二区三区免费观看视频| 欧美sm一区| 欧美 国产 精品| 国产日韩欧美高清| 亚洲产国偷v产偷v自拍涩爱| 国产福利视频一区| 午夜激情一区| 9.1片黄在线观看| 亚洲护士老师的毛茸茸最新章节| 精品三级在线|