一套程式碼小程式&Web&Native執行的探索(2)

發表於2018-09-29

接上文:一套程式碼小程式&Web&Native執行的探索01,本文都是一些探索性為目的的研究學習,在最終版輸出前,內中的內容可能會有點亂

參考:

https://github.com/fastCreator/MVVM

https://www.tangshuang.net/3756.html

https://www.cnblogs.com/kidney/p/8018226.html

經過之前的學習,發現Vue其實與小程式框架相識度比較高,業內也有mpvue這種還比較成熟的方案了,我們這邊依舊不著急去研究成熟的框架,現在看看自己能做到什麼程度,最近也真正的開始接觸了一些Vue的東西,裡面的程式碼真的非常不錯,研究學習了下Vue的結構,發現其實跟我們要的很類似,這裡想要嘗試初步的方案:提供Html模板->解析Html模板,其實這裡就是Vue裡面Parse部分的邏輯,一小部分程式碼,這樣有很多Vue的程式碼可以借鑑,也變相的學習Vue的原始碼,一舉兩得,於是我們速度開始今天的學習

首先,我們設定一個簡單的目標:設定一段簡單的小程式模板,當我們做完web版本後,他可以在小程式中執行

這裡第一個關鍵便是將html模板轉換為js程式碼,如果是之前我們直接會用這種程式碼:

將上述程式碼做字串處理成字串函式,然後將data傳入,重新渲染即可。然而技術在變化,在進步。試想我們一個頁面某個子節點文字發生了變化,全部重新渲染似乎不太划算,於是出現了虛擬DOM概念(React 導致其流行),他出現的意義就是之前我們使用jQuery操作10次dom的時候瀏覽器會操作10次,這裡render過程中導致的座標計算10次render tree的形成可能讓頁面變得越來越卡,而虛擬DOM能很好的解決這一切,所以這裡我們就需要將我們模板中的程式碼首先轉換為虛擬DOM,這裡涉及到了複雜的解析過程

PS:回到最初Server渲染時代,每次點選就會導致一次伺服器互動,並且重新渲染頁面

Virtual DOM

我們做的第一步就是將模板html字串轉換為js物件,這個程式碼都不要說去實現,光是想想就知道里面必定會有大量的正則,大量的細節要處理,但我們的目標是一套程式碼多端執行,完全沒(能力)必要在這種地方耗費時間,所以我們直接閱讀這段程式碼:https://johnresig.com/blog/pure-javascript-html-parser/,稍作更改後,便可以得到以下程式碼:

這是一段非常牛逼的程式碼,要寫出這種程式碼需要花很多功夫,繞過很多細節,自己寫很難還未必寫得好,所以拿來用就好,不必愧疚……,但是我們需要知道這段程式碼幹了什麼:

他會遍歷我們的字串模板,解析後會有四個回撥可供使用:start、end、chars、comment,我們要做的就是填充裡面的事件,完成我們將HTML轉換為js物件的工作:

這裡輸出了我們想要的結構:

第一個節點便是跟節點,我們可以根據他遍歷整個節點,我們也可以根據陣列(裡面有對應的parent關係)生成我們想要的結構,可以看出藉助強大的第三方工具庫可以讓我們的工作變得更加高效以及不容易出錯,如果我們自己寫上述HTMLParser會比較困難的,什麼時候需要自己寫什麼時候需要藉助,就要看你要做那個事情有沒有現成確實可用的工具庫了,第二步我們嘗試下將這些模板標籤,與data結合轉換為真正的HTML結構

簡單的Virtual DOM TO HTML

這裡需要data加入了,我們簡單實現一個MVVM的類,並且將上述Parser做成一個方法:

這個程式碼非常簡陋,只是對text部分做了處理,沒有對屬性,style等做處理,但是越是功能簡單的程式碼理解起來越容易,後續的style以及屬性大同小異,我們這裡開始處理,介於篇幅,下次繼續。

相關文章