從零搭建一款PC頁(yè)面編輯器PC-Dooring

之前一直忙著調(diào)研lowcode平臺(tái)和開發(fā)以下兩個(gè)項(xiàng)目:

沒有太多時(shí)間做PC端搭建化項(xiàng)目, 好在搭建平臺(tái)很多原理都是通用的, 所以早在去年我就開發(fā)好了面向PC端的編輯器PC-Dooring, 雖然在設(shè)計(jì)上還有些不足(在后面的內(nèi)容中會(huì)提到)
, 但是基本模型已經(jīng)實(shí)現(xiàn), 接下來就和大家一起分享一下具體的實(shí)現(xiàn).

為了保證文章整體的邏輯性和條理性, 我將可視化搭建平臺(tái)的具體的實(shí)現(xiàn)劃分為了以下幾個(gè)部分:

  • PC編輯器效果展示
  • 整體技術(shù)架構(gòu)
  • 可視化搭建技術(shù)實(shí)現(xiàn)方式
  • 編輯器核心思路
  • 編輯器架構(gòu)模型
  • 如何開發(fā)標(biāo)準(zhǔn)物料組件
  • 編輯器后期規(guī)劃

PC編輯器效果展示

chrome-capture.gif

在上面的演示中, 組件庫(kù)方式和H5-Dooring類似, 只不過組件庫(kù)筆者采用了PC端專屬的組件庫(kù)antd, 所以我們可以將antd支持的任何組件集成進(jìn)PC-Dooring.

整體技術(shù)架構(gòu)

整體技術(shù)架構(gòu)和H5-Dooring類非常相似, 也是遵循筆者的產(chǎn)品設(shè)計(jì)哲學(xué)—— 不要讓用戶思考. 降低一切拖拽復(fù)雜度, 采用智能網(wǎng)格的交互模式來實(shí)現(xiàn)(這種設(shè)計(jì)方式有一定的局限, 僅供大家參考, 當(dāng)然也可以使用V6.Dooring的自由布局模式). 整體架構(gòu)如下圖所示:

image.png

由上圖我們可以看出編輯器主要分為如下幾個(gè)部分:

  • 組件物料
  • 畫布區(qū)
  • 屬性編輯區(qū)
  • 功能輔助
  • 其他

目前組件物料主要實(shí)現(xiàn)了基礎(chǔ)組件, 可視化組件媒體組件, 其他類的組件實(shí)現(xiàn)也類似, 技術(shù)整體實(shí)現(xiàn)我們會(huì)在下面介紹.

可視化搭建技術(shù)實(shí)現(xiàn)方式

image.png

前端框架我們還是使用的React, 當(dāng)然大家也可以使用Vue3.0, 原理都是相通的, 不同插件之間也提供了多框架的支持. 編輯器核心的一環(huán)就是組件拖拽, 這里筆者使用了社區(qū)比較強(qiáng)大且穩(wěn)定的庫(kù)react-dnd, 其拖拽分為兩個(gè)部分, 一個(gè)是從組件區(qū)拖拽到畫布區(qū), 另一個(gè)是畫布區(qū)內(nèi)部組件的自由拖拽. 我們可以用原生H5的拖放API來實(shí)現(xiàn)第一部分的功能, 本質(zhì)是將拖動(dòng)源攜帶的數(shù)據(jù)傳到畫布制定區(qū)域, 目標(biāo)源監(jiān)聽事件拿到攜帶的數(shù)據(jù)動(dòng)態(tài)渲染出實(shí)際的組件. 過程如下:

image.png

當(dāng)然深入研究過react-dnd的朋友都知道, 以上兩個(gè)功能通過react-dnd都可以實(shí)現(xiàn), 大家可以參考它的官網(wǎng)react-dnd官網(wǎng)學(xué)習(xí)研究具體實(shí)現(xiàn)流程, 也可以直接參考PC-Dooring源碼.

至于組件庫(kù), 我們可以采用任何我們熟悉的組件庫(kù), 比如antd, element, zant等, 組件物料需要遵循我們約定的DSL協(xié)議, 這里大家可以參考工業(yè)級(jí)協(xié)議標(biāo)準(zhǔn)odata規(guī)范.
有了一定的規(guī)范, 我們就可以包裝標(biāo)準(zhǔn)的組件物料從而集成第三方組件庫(kù)了.

至于功能輔助模塊和狀態(tài)管理, 我們可以采用如mobx, redux, dva等來實(shí)現(xiàn), 最終目的就是讓編輯器不同部分能相互關(guān)聯(lián), 實(shí)時(shí)更新組件狀態(tài), 以及數(shù)據(jù)回傳能力.

編輯器核心思路

編輯器核心實(shí)現(xiàn)思路筆者之前也分析了幾個(gè)現(xiàn)有方案, 發(fā)現(xiàn)字節(jié)魔方的思路很貼切, 這里附上一個(gè)原理圖:

image.png

核心就是通過編輯器產(chǎn)生的有效詞法數(shù)據(jù), 讓渲染器能解析渲染成可用的HTML頁(yè)面.

編輯器整體架構(gòu)模型

編輯器整體架構(gòu)模型主要是為了讓大家全局的了解可視化編輯器的實(shí)現(xiàn)思路, 以及未來的規(guī)劃方向, 筆者做了一個(gè)基本的草圖, 如下:

image.png

如何開發(fā)標(biāo)準(zhǔn)物料組件

開發(fā)標(biāo)準(zhǔn)組件物料需要遵循我們編輯器內(nèi)部的數(shù)據(jù)協(xié)議和組件開發(fā)規(guī)范, 在PC-Dooring中開發(fā)組件主要由以下幾部分組成:

  • 組件代碼
  • schema定義
  • template定義

組件代碼就是組件內(nèi)部具體的實(shí)現(xiàn), 如下案例:

import React, { memo } from 'react';
import { ITextConfig } from './schema';
import logo from '@/assets/text.png';
const Text = memo((props: ITextConfig & { isTpl: boolean }) => {
  const { align, text, fontSize, color, lineHeight, isTpl } = props;
  return (
    <>
      {isTpl ? (
        <div>
          <img src={logo} alt=""></img>
        </div>
      ) : (
        <div style={{ color, textAlign: align, fontSize, lineHeight }}>{text}</div>
      )}
    </>
  );
});
export default Text;

schema定義了組件的屬性約束, 可編輯項(xiàng)類型以及默認(rèn)值, 如下:

import {
  IColorConfigType,
  INumberConfigType,
  ISelectConfigType,
  ITextConfigType,
  TColorDefaultType,
  TNumberDefaultType,
  TSelectDefaultType,
  TTextDefaultType,
} from '@/components/FormComponents/types';

export type TTextSelectKeyType = 'left' | 'right' | 'center';
export type TTextEditData = Array<
  ITextConfigType | IColorConfigType | INumberConfigType | ISelectConfigType<TTextSelectKeyType>
>;
export interface ITextConfig {
  text: TTextDefaultType;
  color: TColorDefaultType;
  fontSize: TNumberDefaultType;
  align: TSelectDefaultType<TTextSelectKeyType>;
  lineHeight: TNumberDefaultType;
}

export interface ITextSchema {
  editData: TTextEditData;
  config: ITextConfig;
}
const Text: ITextSchema = {
  editData: [
    {
      key: 'text',
      name: '文字',
      type: 'Text',
    },
    {
      key: 'color',
      name: '標(biāo)題顏色',
      type: 'Color',
    },
    {
      key: 'fontSize',
      name: '字體大小',
      type: 'Number',
    },
    {
      key: 'align',
      name: '對(duì)齊方式',
      type: 'Select',
      range: [
        {
          key: 'left',
          text: '左對(duì)齊',
        },
        {
          key: 'center',
          text: '居中對(duì)齊',
        },
        {
          key: 'right',
          text: '右對(duì)齊',
        },
      ],
    },
    {
      key: 'lineHeight',
      name: '行高',
      type: 'Number',
    },
  ],
  config: {
    text: '我是文本',
    color: 'rgba(60,60,60,1)',
    fontSize: 18,
    align: 'center',
    lineHeight: 2,
  },
};
export default Text;

template主要規(guī)定了組件在畫布中展示的基本方式, 如下:

const template = {
  type: 'Text',
  h: 20,
  displayName: '文本組件',
};
export default template;

當(dāng)然大家也可以擴(kuò)展其定義或者將schematemplate合并. 只要一個(gè)組件符合了以上約定, 都可以被我們編輯器所消費(fèi).

編輯器后期規(guī)劃

PC編輯器目前仍存在一些問題沒有很好的解決, 比如布局方式的局限性導(dǎo)致必須橫向擴(kuò)展很多組件才能滿足不同用戶的個(gè)性化需求, 其次就是組件聯(lián)動(dòng)機(jī)制, 需要統(tǒng)一數(shù)據(jù)中心來管理, 后面會(huì)在H5-Dooring 中展示具體的實(shí)現(xiàn)方式, 大家感興趣也可以實(shí)現(xiàn)一下.

目前PC-Dooring已經(jīng)在github上以MIT協(xié)議完全開源, 如果大家感興趣,也可以貢獻(xiàn)你的一份力量, 幫助社區(qū)解決更多問題.

覺得有用 衅胀?喜歡就收藏劳闹,順便點(diǎn)個(gè)贊吧液肌,你的支持是我最大的鼓勵(lì)!微信搜 “趣談前端”鹃两,發(fā)現(xiàn)更多有趣的H5游戲, webpack,node,gulp构捡,css3独郎,javascript踩麦,nodeJS,canvas數(shù)據(jù)可視化等前端知識(shí)和實(shí)戰(zhàn).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氓癌,一起剝皮案震驚了整個(gè)濱河市谓谦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贪婉,老刑警劉巖反粥,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谓松,居然都是意外死亡星压,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鬼譬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娜膘,“玉大人,你說我怎么就攤上這事优质】⑻埃” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵巩螃,是天一觀的道長(zhǎng)演怎。 經(jīng)常有香客問我,道長(zhǎng)避乏,這世上最難降的妖魔是什么爷耀? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮拍皮,結(jié)果婚禮上歹叮,老公的妹妹穿的比我還像新娘。我一直安慰自己铆帽,他們只是感情好咆耿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爹橱,像睡著了一般萨螺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天慰技,我揣著相機(jī)與錄音椭盏,去河邊找鬼。 笑死惹盼,一個(gè)胖子當(dāng)著我的面吹牛庸汗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播手报,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蚯舱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了掩蛤?” 一聲冷哼從身側(cè)響起枉昏,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揍鸟,沒想到半個(gè)月后兄裂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阳藻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年晰奖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腥泥。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匾南,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛔外,到底是詐尸還是另有隱情蛆楞,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布夹厌,位于F島的核電站豹爹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矛纹。R本人自食惡果不足惜臂聋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望或南。 院中可真熱鬧逻住,春花似錦、人聲如沸迎献。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吁恍。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冀瓦,已是汗流浹背伴奥。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翼闽,地道東北人拾徙。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像感局,于是被迫代替她去往敵國(guó)和親尼啡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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