# 網頁發展 - 前後端 ## web 1.0 * 比較代表的大概是 JSP、ASP 和 PHP * 這時候的前後端互動 * 發送 URL 的請求 * Server 收到後,根據請求「動態地」產生一個靜態的 HTML,回傳給使用者 * 使用者在瀏覽器上看到網頁內容 * 早期的 JavaWeb 開發很簡單,後端產生 HTML 方式其實就是一行一行的把 HTML 刻出來,後來 PHP 與 ASP 則在 HTML 中加入一些語法,來動態的根據資料產生對應的 HTML,JAVA 也跟進,出現了 JSP。 * JavaScript 也是這時候出現,目的是為了與 HTML 頁面互動。 * 當任務越來越複雜時,需要有架構的系統,因此後端開始出現分工 * 後端 MVC 化 ```graphviz digraph hierarchy { nodesep=1.0 node [color=Black,fontname=Courier,shape=box] edge [color=Black] subgraph cluster_S { label = "Server side"; Model->{View} Control->{Model} {rank=same; Control, View} } label = "Client side"; View->{Browser_View} Browser_View->{Control} } ``` ## web 2.0 * 在前面的時代,當使用者瀏覽網頁時,如果想要更新頁面的內容,就必須重新向 Server 發出 Request,以得到新的頁面,然而實際應用時會發現,許多時候我只是想要更新頁面中的部分內容而已 > 例如在 HackMD 中,總不能打一個字就重整頁面吧! * 其實最早在 1995 年,JAVA 就已經實現非同步載入,通過執行網頁中的 JAVA APPLETS 與伺服器交換資料,因此不需要每次都重新整理網頁。 * 到了 1998 年 AJAX 誕生,最大的優點在於只要瀏覽器支援 JaveScript 即可,任何後端語言都可以透過 Request-Response 讓前端達到非同步更新。 * 這時候的前後端互動變成 ```graphviz digraph hierarchy { nodesep=1.0 node [color=Black,fontname=Courier,shape=box] edge [color=Black] subgraph cluster_S { label = "Server side"; Web_Server {rank=same;} } label = "Client side"; Web_Server->{HTML, JS, CSS} JS->{Web_Server} {HTML, JS, CSS}->Browser_View {rank=same;} } ``` ## 前端 MVC * 在這之後又出現了 jQuery,加速了前端開發,雖然到目前看起來一切都好像還不錯,然而前端最大的問題在於過於龐大,因此自然而然地出現了前端框架。 * MVC * Model 數據層:定義各種變數及功能函式,透過閉包來儲存,並對外提供接口。數據層的內容影響了視圖層渲染的結果。 * View 視圖層:當使用者造訪頁面時,根據數據層的內容,進行網頁的初始化,建立整個 HTML 架構樹。 * Control 控制層:連接視圖層與數據層,當視圖層發生的事件時,透過控制層對數據層進行更新。 ```graphviz digraph hierarchy { nodesep=1.0 node [color=Black,fontname=Courier,shape=box] edge [color=Black] subgraph cluster_C { label = "Client side"; View->{Control} Control->{Model} Model->{View} {rank=same; Control, Model} } subgraph cluster_S { Model->{Web_Server} Web_Server->{Model} {rank=same; Web_Server} } } ``` * 過往 jQuery 的操作目標為 DOM,然而前端框架的目標卻是 model,能更有效的維護網頁中的各個部分。 ## MVP * 前面的架構導致數據流的混亂,可以想像今天有多個 View 與 Model,當這些節點之間都有互相構通時,可能產生非常可怕的事情。 * MVP * 在 MVP 架構中,View 與 Model 之間,一律通過 Presenter 擔任中間人,進行一切的溝通。 ```graphviz digraph hierarchy { nodesep=1.0 node [color=Black,fontname=Courier,shape=box] edge [color=Black] View->{Presenter} Presenter->{Model} Model->{Presenter} Presenter->{View} {rank=same; View, Presenter, Model} } ``` * 然而當大部分邏輯都必須通過 Presenter 進行管理時,Presenter 反而會變得過於龐大,難以管理。 ## MVVM * 延伸前面的架構,視圖層與數據層之間透過某種機制綁定。 * 與 MVP 最大的不同在於,ViewModel 與 View 之間的狀態是同步的,因此 View 中的數據修改時,不需要跟任何人溝通。 * MVVM * View 和 Model 是分離的,View 的資料與 ViewModel 同步,因此不需要知道 Model 的存在,同樣 Model 也完全忽略 ViewModel 與 View 的存在。 ```graphviz digraph hierarchy { nodesep=1.0 node [color=Black,fontname=Courier,shape=box] edge [color=Black] View->{ViewModel} ViewModel->{Model} Model->{ViewModel}[style=dashed] ViewModel->{View}[style=dashed] {rank=same; View, ViewModel, Model} } ``` * 根據不同的前端框架,View 與 Model 的數據綁定可能是單向數據流,也可能是雙向數據流。 ## MTV * 典型的 MTV 框架就是 Django,他是一個後端為主的網頁框架。 > 即使是後端框架,仍然會有前端的部分,也就是後端也會處裡試圖渲染等等的任務,如 SSR。 * MTV 中的 TV 分別為 Template 與 View,可以想成原本 MVC 中的 View 被拆成了兩個部分: * Template 負責處理 HTML 的內容,其中也包含了需要動態填入的數據,這些數據會通過 View 得到。 * View 則透過 Model 得到數據,並加以運算,最後配合 Template 渲染出視圖,回傳給前端使用者。 * MTV 可以想成將所有的渲染工作都交由後端處裡,前端只會收到單純的 HTML、JS 及 CSS。 > 並非代表 Django 就一定是 SSR 或者就一定包辦所有前後端的工作,完全看開發者如何設計,你也可以後端使用 Django 進行數據處理,而渲染的工作則另外交由其他 MVVM 的前端框架,也就是完全的前後端分離。