日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

SVGEdit:老牌開源 SVG 編輯器是如何架構的?

來源: 責編: 時間:2023-11-17 08:50:08 278觀看
導讀大家好,我是前端西瓜哥。這次簡單看看 SVGEdit 的架構。SVGEdit 的版本為 7.2.0。SVGEdit 一款非常老牌的 SVG 圖形編輯器,用于編輯處理 SVG,star 數目前是 5.8k。它的優點在于經過多年的開發,完成度高,較為成熟,功能相當豐

8d928資訊網——每日最新資訊28at.com

大家好,我是前端西瓜哥。這次簡單看看 SVGEdit 的架構。8d928資訊網——每日最新資訊28at.com

SVGEdit 的版本為 7.2.0。8d928資訊網——每日最新資訊28at.com

SVGEdit 一款非常老牌的 SVG 圖形編輯器,用于編輯處理 SVG,star 數目前是 5.8k。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

它的優點在于經過多年的開發,完成度高,較為成熟,功能相當豐富。8d928資訊網——每日最新資訊28at.com

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

缺點是幾乎不維護了,提交很少,大概一個月一提交,最新版 7.2.0 也是 22 年 8 月的時候了。8d928資訊網——每日最新資訊28at.com

UI 比較簡陋,很簡單就能看到一些 UI bug。8d928資訊網——每日最新資訊28at.com

如果要找一個 UI 好看的,可以看看開源項目 :Method-Draw,這個 UI 好看很多。它  fork 了 SVG-Edit 并做了一些改造。8d928資訊網——每日最新資訊28at.com

Method-Draw 標榜簡單易用,所以有意去掉了 SVGEdit 的一些高級功能,比如圖層。8d928資訊網——每日最新資訊28at.com

技術棧

Web Component + SVG + Rollup + i18next8d928資訊網——每日最新資訊28at.com

UI 使用了 Web Component,瀏覽器原生支持的組件方案。8d928資訊網——每日最新資訊28at.com

作為一款 SVG 編輯器,選擇 SVG 沒有毛病,這樣渲染效果就完全交給瀏覽器,不需要根據標準去實現渲染效果,自己專心寫編輯器的業務邏輯即可。8d928資訊網——每日最新資訊28at.com

沒有用 TypeScript,因為是很老的項目,當時 TypeScript 尚未大行其道。如果要做新項目,建議還是上 TypeScript,大型復雜軟件還是很需要類型系統的。8d928資訊網——每日最新資訊28at.com

打包用了 Rollup。國際化用了 i18next。8d928資訊網——每日最新資訊28at.com

模塊設計

UI 層對應 Editor 類,該類繼承了 EditorStartup 類,后者做一些初始化操作。8d928資訊網——每日最新資訊28at.com

編輯器內核對應 SvgCanvas 類。8d928資訊網——每日最新資訊28at.com

SvgCanvas 感覺太多讀寫屬性的方法(getXx 和 setXx)了,學 Java 學的??梢猿閹讉€小類把耦合性強的方法封裝起來。8d928資訊網——每日最新資訊28at.com

有插件機制,插件對象通過 addExtension 方法注入到 SvgCanvas.extensions 對象。8d928資訊網——每日最新資訊28at.com

可以看到注冊了 grid(網格)、markers(標尺)之類的插件。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

關于 UI 層和內核層的通信,UI 層改數據,會直接改內核層,然后再改 UI 層。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

這里的 zoom 有兩個數據源,可能會出現改了一個忘記改另一個的情況。建議只使用一個內核層數據源,改這個數據源后通過事件通知 UI 層或其他層做數據同步。多數據源是壞文明。8d928資訊網——每日最新資訊28at.com

渲染方案

渲染方案是 SVG。8d928資訊網——每日最新資訊28at.com

SVG 編輯器用 SVG,相當合理。8d928資訊網——每日最新資訊28at.com

對于圖形樹的實現、圖形拾?。c選)、圖形渲染,SVGEdit 都交給瀏覽器都去實現。8d928資訊網——每日最新資訊28at.com

SVG 對一般前端開發是非常好上手的,不需要太多圖形知識,本質就是一個有層級的 DOM 元素樹,前端同學再熟悉不過了,只是元素專門用來描述圖形。8d928資訊網——每日最新資訊28at.com

但因為遠離底層,不方便做一些渲染優化和緩存,圖形多的時候很卡,不適合做高性能圖形編輯器。8d928資訊網——每日最新資訊28at.com

靈活性也較差,比如一個 0.5 線寬的直線還把畫布縮小了,根本就點不中好不好,希望點擊區域可以外擴一些,或想點中一個設置為不可見的圖形點擊區域。這個做不了。8d928資訊網——每日最新資訊28at.com

當然一個可以考慮的方案是 SVG 只是單純做渲染,圖形拾取自己實現。8d928資訊網——每日最新資訊28at.com

但 SVG 有一個強大的優點:方便做功能擴展,進行二次開發。8d928資訊網——每日最新資訊28at.com

比如你要在圖形編輯器里加一個新的模塊,比如倒計時、一個表單組件,網上找到輪子集成進去會很方便。因為 SVG 里面可以嵌入 DOM 元素,DOM 元素里也可以嵌入 SVG。8d928資訊網——每日最新資訊28at.com

UI 層

UI 層原本是基于 jQuery UI 的,但后面丟棄  jQuery 改用 Web Component 進行了重構。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

順帶一提,有個叫做 jPicker 的基于 jQuery 的拾色器插件,也做了魔改,去掉對 jQuery 的依賴。8d928資訊網——每日最新資訊28at.com

它沒有用 React、Vue 這些 UI 框架,而是選擇 Web Component,我認為這是一個糟糕的決策。8d928資訊網——每日最新資訊28at.com

Web Component 雖然被 瀏覽器原生支持,但并不是主流,生態一般,輪子不如 React 和 Vue 豐富。8d928資訊網——每日最新資訊28at.com

我們繼續看代碼。8d928資訊網——每日最新資訊28at.com

以左側欄 LeftPanel 為例,HTML 為:8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

這里的 se-button 就是一個 Web Component 組件,里面有局部樣式和交互邏輯,類似 React 和 Vue。8d928資訊網——每日最新資訊28at.com

全局樣式文件是 svgedit.css。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

LeftPanel 類初始化后會調用 init 方法。8d928資訊網——每日最新資訊28at.com

該方法會:8d928資訊網——每日最新資訊28at.com

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

8d928資訊網——每日最新資訊28at.com

$id 這些是工具類方法。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

下面代碼的作用是,給選擇工具按鈕綁定方法,該方法更改編輯器的模式為選擇模式。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

LeftPanel 的 init 方法是在 EditorStartUp 類(這個是 Editor 的父類)的 init 方法中被調用的。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

圖形拾取

點選 圖形的圖形拾取是交給瀏覽器,監聽鼠標按下事件的方式,讀取 mouseEvent.target。8d928資訊網——每日最新資訊28at.com

因為可能有組的存在,所以會不斷地讀 parentNode 找最頂層的 group 元素,直到當前 group 結束。8d928資訊網——每日最新資訊28at.com

框選 會在點中空白區域出現,并將當前模式(currentMode)臨時切換為 multiselect。8d928資訊網——每日最新資訊28at.com

期間產生的選區矩形元素保存在 svgCanvas.rubberBox 屬性中。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

拖拽修改選區矩形寬高時,會遞歸 SVG 樹,計算它們的 bbox,判斷是否和選區矩形相交。將相交的圖形放到 selectedElements 屬性中。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

工具管理

切換工具使用 SvgCanvas.setMode('line') 的方式。8d928資訊網——每日最新資訊28at.com

不同工具都有各自實現的事件響應函數,當用戶進行鼠標操作時,會執行 mouseDownEvent、mouseMoveEvent、mouseUpEvent,會根據 mode 執行不同的工具的方法。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

鋼筆工具對應 svgCanvas.pathActions 屬性,對應 pathActionsMethod 方法,沒有用類,而是用了閉包的方式進行邏輯封裝。8d928資訊網——每日最新資訊28at.com

圖形工具的邏輯倒沒有抽一個對象出來,直接寫在 ouseDownEvent、mouseMoveEvent、mouseUpEvent 里。8d928資訊網——每日最新資訊28at.com

操作的歷史記錄

兩個棧等價于一個數組或雙向鏈表中,加上一個指針,該指針指向多個命令中的當前命令。8d928資訊網——每日最新資訊28at.com

撤銷就是把指向往左移動,重做往右移,新操作則把指針后面的命令丟掉,然后把這個新的操作加到數組中,并將指針后移。8d928資訊網——每日最新資訊28at.com

SVGEdit 的歷史命令都保存在 UndoManager 類的 undoStack 數組中,并用 undoStackPointer 指針指向最新命令的位置。8d928資訊網——每日最新資訊28at.com

SVGEdit 使用了 patch(打補?。┑姆绞接涗洑v史操作,沒有使用圖形樹快照的方式。8d928資訊網——每日最新資訊28at.com

下面是移動一個矩形產生的操作命令,它記錄了修改圖形屬性的命令,該命令保存了一個元素修改前后的屬性。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

這里有個特殊的 BatchCommand 批量命令對象,它的 stack 數組記錄了一次操作要執行的多個子命令。8d928資訊網——每日最新資訊28at.com

其實就是 宏命令。宏命令的作用是將多個命令組合在一起批量執行。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

各種命令類保存在 svgCanvas.history 中。8d928資訊網——每日最新資訊28at.com

8d928資訊網——每日最新資訊28at.com

簡評

UI 框架應該選擇 React 或 Vue。8d928資訊網——每日最新資訊28at.com

這樣項目才會有更多人使用,作為一款比較古早的編輯器才可能煥發第二春。8d928資訊網——每日最新資訊28at.com

最好是 Vue3,國內很多中小廠在用,那里的程序員不喜歡造輪子,這樣他們就會用你這個編輯器,然后社區繁榮,贏。當然最好 React 和 Vue 都做。8d928資訊網——每日最新資訊28at.com

SVGEdit 丟掉 jQuery 用 Web Component,我不是很理解,外國比較流行這個?這樣就不好集成進公司的項目中,不利于項目的持續發展。8d928資訊網——每日最新資訊28at.com

不要使用單例。8d928資訊網——每日最新資訊28at.com

我看不少地方用了單例,單例模式有個問題,如果頁面需要同時有多個編輯器實例,比如做兩張圖紙對比功能。8d928資訊網——每日最新資訊28at.com

那它們就會因為單例的對象共享導致沖突,比如改了編輯器 A 的設置屬性會同時改了編輯器 B 的,這不是我們想要的。8d928資訊網——每日最新資訊28at.com

類的面向對象風格是比較好的解法,每個對象都要創建一個新的實例,就不會沖突了。8d928資訊網——每日最新資訊28at.com

較多的 UI bug。8d928資訊網——每日最新資訊28at.com

選中一個元素就能復現,此外 UI 也不好看。8d928資訊網——每日最新資訊28at.com

監聽鼠標事件應該放到 document 下。8d928資訊網——每日最新資訊28at.com

放到 SVG 的容器或 SVG 上其實并不是很好的做法,當光標移到這些元素外時,監聽就消失了,綁定到 doucment 下即使光標移動到瀏覽器外都能監聽。8d928資訊網——每日最新資訊28at.com

結尾

SVGEdit 支持的功能很多,但 UI 比較復古,小 bug 有點多的樣子。8d928資訊網——每日最新資訊28at.com

但如果你要做 SVG 編輯器,與其從零開始,不如基于 SVGEdit 做去二次開發。8d928資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-27604-0.htmlSVGEdit:老牌開源 SVG 編輯器是如何架構的?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 快速探索 Tetragon:基于 eBPF 的安全可觀察性和執行工具

下一篇: 簡潔編程之道,十個Python Itertools方法助你事半功倍

標簽:
  • 熱門焦點
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 微軟邀請 Microsoft 365 商業用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態LT(ID:LingTai_LT)2023年,出海市場戰況空前,中國創業者在海外紛紛摩拳擦掌,以期能夠把中國的商業模式、創業理念、戰略打法輸出海外,他們依
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之“想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!”曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對“勢”的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 機構稱Q2國內智能手機銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據市場調查機構Counterpoint Research公布的最新報告,2023年第2季度中國智能手機銷量同比下降4%,創新自2014年以來第2季度銷量新低。報
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
Top 主站蜘蛛池模板: 太谷县| 台南市| 长垣县| 百色市| 景东| 都江堰市| 五华县| 聂荣县| 淄博市| 安达市| 神木县| 霍邱县| 潞西市| 大石桥市| 忻城县| 鄂尔多斯市| 望城县| 车险| 焦作市| 婺源县| 广丰县| 平邑县| 鄢陵县| 商丘市| 固阳县| 嘉荫县| 尚志市| 静海县| 寿阳县| 永城市| 临西县| 荔波县| 云梦县| 贵定县| 锡林郭勒盟| 南岸区| 祁连县| 瑞安市| 云林县| 连州市| 东海县|