好久沒寫過技術類的文章了,此次給你們分享一個近期的項目,採用react+mobx+jquery構建的大型工具類項目。查看項目網址。javascript
若是用過易企秀,maka或者百度H5,搜狐快站的朋友應該對這個工具是很是熟悉的,用戶經過托拉拽等操做,便可輕鬆實現HTML5代碼的編輯工做,大大節約了開發成本,也能夠對模板進行二次編輯,快速生成新的H5頁面,今天的主角是H5DS (全稱:HTML5 Design software) 這是一款WEB的H5製做工具。讓不會寫代碼的人也能輕鬆快速上手製做H5頁面。
作產品前,規劃很重要,這將直接決定項目的成敗!有的項目須要1年,2年或者更長的時間去規劃,規劃 好了才能厚積薄發!這時候咱們須要逃離程序員的思惟,不要單純的從程序開發的角度去看待整個項目!
兼顧以上幾點,咱們不只是一個優秀的程序員,仍是一個優秀的產品經理,更是一個接地氣的運營人員,當咱們作項目的前期,不管是產品,程序員,運營推廣,這些方面的都得考慮到,雖然一我的不能作所有的工做,可是懂點不至於被別人忽悠。若是你的目標是作管理而不只僅是一個程序員,那這些能力,多少應該掌握一點。
技術選型以下:前端
前端:react, mobx, less, jquery後端:nodejs, mysql, ngnixjava
工具:babel, webpack, gulp, eslintnode
H5DS的技術選型基本上是JS的技術棧,只能說這套技術很前端。接下來我解釋下,爲何要這樣選型。mysql
整個H5頁面製做的思路是這樣的:生成後的H5頁面雖然是單頁,可是單頁下面仍是有多個子頁面,咱們能夠大體的能夠分爲3個類。APP包含了整個頁面的內容。Page包含了單個子頁面的內容,Layer是每一個子頁面裏面的元素。這樣理解咱們的思路就很清晰了。每一個H5頁面對應有一個JSON文件,而JSON轉化爲JSX模板,再經過renderToStaticMarkup將JSX轉化爲HTML, 我以爲這幅圖是最有效的說明,react強大的服務端渲染函數,能夠直接吧JSX轉化爲HTML。沒有任何人說過,服務器渲染方法就只能在服務器端使用,這裏我直接拿到前端使用,並且效果還很是棒,具體的方法renderToStaticMarkupreact
// 這個JSON 文件大體格式 { ..., "name": "H5頁面名稱", "desc": "H5頁面描述信息", "pic": "主圖URL", "pages": [ // H5由多個子頁面組成 { ..., layers: [] // 子頁面由多個圖層組成 } ] } // JSX -> HTML 的方法 import { renderToStaticMarkup } from 'react-dom/server'; renderToStaticMarkup(JSX);
我是個野蠻的開發者,喜歡用最簡單的代碼,去實現業務,而mobx更加靈活多變,沒有那麼多限制和約束,而redux比如墨守成規的名門子弟,雖然約束是可讓代碼更加規範,若是是以大量的代碼堆積出來的規範,我仍是以爲已經脫離了技術的實際意義,一樣是增長維護成本的,我絕對不是一個合格的程序員,若是能 code less,do more,我寧願犧牲規範不擇手段。jquery
以前不少朋友這樣對我說:用了react就不要用jquery了,jquery能作的事情react也能作,爲何還要用其餘庫?一點也不規範。其實個人回答每每是這樣的:我比較任性,並且喜歡jquery!爲何都廣泛認爲jquery和react不要共存,大體有如下幾點:webpack
可是實際的業務變幻無窮,有哪一個框架能說本身能輕鬆實現全部業務?jquery是工具庫,react是ui庫,若是運用得當,我的以爲配合起來仍是很是不錯的選擇!有時候用jquery操做DOM,在性能方面能完勝react。好比拖動排序功能!git
技術選型的問題說完了,接下來聊聊整個項目的架構吧!程序員
第三個模塊你們仔細看會發現,其實是和中間的業務層獨立開的,這樣更有利於項目的擴展和二次開發。第三個模塊這裏咱們把他定義爲內核,基於這個內核,咱們能夠作web層,server層,以及擴展layer層,內核更像ueditor那樣的存在,能夠直接在項目中引用,讓內核再也不依賴任何server,能夠獨立使用。
作工具類的項目,性能是很是大的挑戰,我總結了如下幾個常見的性能優化點:
由於編輯器中,圖片裁剪是經常使用的功能,若是採用傳統裁剪模式(前端把裁剪信息傳到服務器,由服務器完成裁剪,返回新的url)對服務器的壓力很是大,爲了節約這些性能開銷,咱們自創了一個裁剪的方法,圖片裁剪後,並無直接丟到服務器去,該方法大大節約了服務器的開銷。具體業務流程以下:
拖動排序若是用純react去實現。業務應該是這樣的:
若是用jquery + react 去實現:
第二種結合jquery的方式,大大減小了react中render函數的執行,不用屢次執行diff操做,實現了高性能的拖動方案。
咱們固定了顯示區域大小爲 320 x 514,要兼容全部機型,就要對其進行縮放處理,要麼高100%,要麼是寬100%,經過JS去計算顯示區域的縮放比例,而後居中處理,就可作到最大化的兼容各類機型。背景是全局的,示意圖分別表示手機經常使用尺寸的實例,高度超出的處理,寬度超出的處理,紅色部分是顯示區域,灰色部分是320*486的原始尺寸比例,黑色陰影部分是灰色部分進行scale縮放填充的區域。
項目已經在github( https://github.com/h5ds/h5ds ) 上面開源,供你們學習使用,擁抱開源是咱們的選擇,可是但願你們能遵照使用規範,針對我的,咱們是免費的,可是針對商業使用,咱們是收費的,這個決定相信你們都能理解。
歡迎加入QQ羣交流:549856478