二、Redux 演變過程01:組件化過程

一、React+Redux 項目結構
二、Redux 演變過程

  1. 混亂結構 -> 組件化結構
  2. 插件引用 -> 模塊化工程
  3. MVC -> MVVM
  4. 零散狀態管理 -> 全局狀態管理
  5. 雙向數據流 -> 單向數據流

前言

? ? ? ?Web 前端近十年的技術革新和巨變可謂是讓人膛目結舌。其外在表現是很多團隊和公司提出了一個又一個新興技術和解決方案,各家爭鳴,百花齊放。而其內在,則是技術專家們在實踐中,對原有問題的不斷改進,是互聯網蓬勃發展過程中的必然經歷。
? ? ? ?接下來的時間,我們主要將探討,一些技術結構形成演變的過程,及其出現的必然性。

1. 混亂結構 -> 組件化結構

? ? ? ?在 組件化結構 問世之前,Web 項目的開發模式通常是簡單粗暴的將問題一鍋燉,最顯著的表現就是 View 部分結構的胡亂拼湊。我們姑且稱其為混亂時代。

image

? ? ? ?示例中很明顯的可以看到,有數個頁面都需要填充一個新聞列表。在混亂時代,我們會很粗暴的將重復代碼 Ctrl + C,在需要的另一個頁面中 Ctrl + V 。這樣的復制粘貼,在初步構建頁面應用時顯得非常“快捷、方便”,但是一旦我們發現這個新聞列表無法完全適用于其他頁面而需要調整改動,或者所有頁面的新聞列表都需要變更時(通常幾乎所有項目都會需要這樣的調整和維護更新),工作量就變得無法想像。假設你有 20 個頁面都擁有這樣的新聞列表,那么就需要變更 20 個頁面。
? ? ? ?在混亂時代,這樣的應用維護問題也是被人們所詬病的。因此出現了三種解決方案:frame框架動態網頁動態渲染插件

1.1 frame框架

? ? ? ?frame框架主要包含兩種使用方式:frameset結構 和 iframe內嵌結構。由于缺陷太多因此 HTML5 已不再支持使用,因此我們僅進行簡單介紹。
? ? ? ?frameset是一個框架集,主要用于規劃組成當前主頁面的子頁面構成,實際會鑲嵌多個子窗口在主頁面部分,比如我們有這樣的一個 index.html 頁面文件:

<html>

<frameset rows="25%,*">

  <frame src="/example/html/frame_a.html">
  <frameset cols="30%,*">
    <frame src="/example/html/frame_b.html">
    <frame src="/example/html/frame_c.html">
  </frameset>

</frameset>

</html>

它的呈現結果是:


image

即便是現在,也許我們還能在一些古老的項目中看到以frameset分層的頁面結構??。

? ? ? ?而iframe,則是一個內聯(行內)框架,其作用與 frameset 相似,也是將其他的頁面窗口引入至一個主窗口中:

<html>
    <body>
    
        <iframe src="/example/html/frame_a.html"></iframe>
        
        <p>這里是主頁面窗口!</p>
        
        <iframe src="/example/html/frame_b.html"></iframe>

    </body>
</html>

它的呈現效果是:


image

二者最顯著的區別就是,frameset 作為 frame 的父結構,規范 frame 的呈現方式,frame 不可脫離 frameset 獨立使用。而 iframe,則可以以獨立的標簽方式嵌入到任何地方。其相同點是,都用于嵌入其他頁面窗口。

? ? ? ?利用 frame 框架,我們可以將上述問題這樣設計,新聞列表寫在一個獨立的頁面,由需要的頁面進行內嵌引用:

image

解決了我們的維護問題,可以一處開發,各處鑲嵌。但使用 frame 過程中,卻會引發其他的問題。主要的缺陷有:

  • 樣式/腳本需要額外鏈入,增加請求頻次;
  • 搜索引擎難以抓取內容,獲取搜索排名困難;
  • 鏈接導航困難,腳本中需要觸發父級頁面(或更高層級)的頁面跳轉;
  • ...

1.2 動態網頁

? ? ? ?動態網頁通常是指一些網頁模版,通過編譯之后會生成靜態的 html 頁面。常見的如 php 、jsp、asp、cgi 等。
? ? ? ?動態網頁主要的作用是通過模板實現數據動態化,通常由服務器端進行構建。同時,動態網頁技術往往提供了頁面嵌套方案,拿 jsp 舉例:

<!-- index.jsp -->

<!-- jsp指令:靜態包含 -->
<%@ include file="a.jsp"%>

<!-- jsp動作:動態包含 -->
<jsp:include page="b.jsp"/>

@ include 指令用于將希望包含的頁面在編譯之后,與主頁面生成一個頁面,它發生在 Servlet 生成靜態頁面的過程中,index.jspa.jsp 將合并成一個 Servlet 然后產生靜態頁面。而 <jsp:include /> 動作標簽的文件嵌入,則發生在請求過程中,index.jspb.jsp 將分別代表兩個不同的 Servlet 然后進行頁面嵌套。后者往往用于嵌入改動較多的動態頁面內容,可以進行參數傳遞;而前者則往往用于直接嵌入靜態文件,無法直接傳遞參數。但無論使用哪種方案,都可以解決我們的新聞列表可維護性的問題:

image

動態網頁技術很大程度上解決了項目維護性的問題,通過訪問者或訪問方式的不同,生成不同的呈現視圖。動態網頁技術的發展和應用歷史悠久,在客戶需求逐漸從需求供給體驗至上的今天,動態網頁的缺陷也愈發明顯。主要表現在:

  • 訪問速度低于靜態網頁,請求需要通過服務器端才能產生視圖內容;
  • 對搜索引擎不友好,搜索引擎抓取數據困難;
  • 視圖表現耦合度高,第三方編程語言侵入性高;
  • ......

1.3 UI渲染方案

? ? ? ?時間的車輪依舊在向前滾動,技術的改進也依舊在邁步。許多團隊認為,視圖呈現應當與數據計算剝離,Web前后端分工應當更加明確。我們在專注于處理一件事時,才會表現的更加高效精準,技術升級也可以分頭進行的更加深入徹底。
? ? ? ?隨著 Ajax 異步加載技術的成熟應用,Web視圖層逐步開始脫離動態網頁技術,所有計算好的數據都當作是數據模型(Model),服務器端的工作僅僅作為提供數據模型(Model)而不用考慮視圖表現,Web前端的工作則是負責處理這些數據模型(Model),將其渲染成相應視圖。在這個過程中,Web前端涌現了大量的UI渲染插件和解決方案,以便于從另一個層面解決視圖可復用性問題。
? ? ? ?在這個階段,主要的解決思路是這樣的:由UI插件定義視圖表現所需的 html 標簽結構 和 css 樣式結構,通過插件對外暴露的調用方式,以參數的形式接收數據(通常數據格式必須符合UI插件所制定的數據規范),數據通常是一個 js 對象(通常由ajax獲取的數據進行 JSON 反序列化)。代表產品有 jQuery-ui、Bootstrap、ECharts、Layui等等,零散的視圖渲染插件更是數不勝數。應用過程大致變成了這個樣子:

image

1.4 組件化應用

? ? ? ?組件化應用 的構思源于UI渲染插件,是基于該方案的擴展實踐,二者的關系是點和面的關系。如果我們將小規模的渲染插件當作是通過數據構建某一個視圖功能,那么組件化框架的作用便是將全站的所有內容統一當作是零散的視圖功能,通過設計組裝進行全站拼接。優勢在于,全站整體視圖模型都可以復用,并且不限于一個項目。代表產品有React、Vue、Angular。
? ? ? ?組件化應用 通常用于在一個單頁面中拼裝復雜的頁面結構。以 React 為例,我們會逐層級的將子組件于網頁模版 index.html 進行合并:

<!-- index.html 主頁模版 -->
<body>
    <div id="root"></div>
</body>

頂層組件引用:

// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

ReactDOM.render(
    <App />, 
    document.getElementById('root'));

組件的設計是一個由上自下的樹級結構,越向下深入,可拼接的子組件可能越豐富:

// App.js
import React, { PureComponent } from 'react';
import './App.css';

import Topbar from './components/Topbar';
import MainPanel from './components/MainPanel';

class App extends PureComponent{
    render(){
        return (
            <div className="App">
                <header className="App-header">
                    <Topbar items={this.props.items} />
                </header>
                <MainPanel />
            </div>
        );
    
    }
}

組件化UI結構如圖所示:


image

組件化的UI工程具有如下優勢:

  • 高內聚性:每一個組件都具備完整的局部功能實現。
  • 低耦合度:組件之間是互相獨立的,通過狀態或參數進行交互。在團隊協作的過程,也不會產生過多的沖突和影響。
  • 高可復用性:在理想狀態下,每一個組件相當于是一個純函數,渲染結果單一,可在應用多處進行復用。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,154評論 4 61
  • 作者:文苑小學五年級 張顏月 自古以來,許多名人都喜歡櫻花,喜歡它那春風滿面,令人陶醉的外表。有不少文人墨客鐘愛梅...
    顏薜蕊閱讀 1,135評論 5 5
  • ?那個有藍色湖泊般雙眸的女子,當她在樓下大聲叫喊他的名字,而他痛苦,幾乎默默承受一切,我只是無法明白,到底是愛艱難...
    青禾花椒閱讀 705評論 1 0
  • 自從看了初中班主任朱老師每天分享的簡書日記,我也下載了簡書,準備每天寫點東西。雖是最最平凡的記錄生活,卻充滿了生活...
    大大大君君啊閱讀 129評論 0 1