mvvm, mvc, vc-胡大師開講(筆記)

  • 329
  • 0
  • 2018-08-27

mvvm, mvc

胡先生開講: https://medium.com/@hulitw/introduction-mvc-spa-and-ssr-545c941669e9

  1. 程式碼如何更好讀懂,更好維護
  2. 小明重構第一步
    1. 他把任何跟資料有關的操作都放到一個叫做 Model 的地方去,所以你要改任何跟資料有關的東西,都到那邊就對了。
    2. 他也把所有跟顯示畫面有關的東西都放到其他地方去,我們就叫做 View 吧,View 裡面用一個 template 來塞入資料,不做任何跟資料有關的處理
    3. 如此一來,他就把資料跟畫面顯示這兩者切開了,並且讓開頭那段 PHP code 把這兩者連接起來,先去 Model 拿資料,再把資料塞入 View 裡面輸出。那這個「連接兩者」的角色,就叫做 Controller 吧!於是,MVC 就這樣出現了。
  3. MVC 就這樣出現了。為的就是要把原來亂七八糟的程式碼理出一個頭緒來。你要存取資料庫就是去 Model 裡面,你要寫 HTML 就去 View,絕對不會出現在 View 裡面下 SQL Query 這種事情。
  4. 所以 MVC 是什麼?就是一種設計模式,你只要把你的 code 像這樣子切開,都可以叫做 MVC
  5. 問自己三個問題
    1. 為什麼要有 MVC : 寫出容易維護的code,而不是想到什麼就寫什麼,把一堆code混在一起
    2. 有 MVC 跟沒有 MVC 的差別在哪:
    遵守MVC之後,code的職責變的清楚很多
    3. 所以 MVC 是什麼?MVC就是一個架構,後端可以遵照MVC的架構去開發,前端也可以
  6. 問題又來了
    我每次留言之後頁面都會刷新,我家網速又慢,每次都要等個十幾秒,有沒有可能不要重新整理頁面?你看人家 Gmail我寄完信它也沒有重新整理啊!人家做得到你應該也做得到吧
    --->小明乖乖的去研究 Gmail 到底是如何做到的,發現秘訣就在於一個神奇的東西:Ajax​
    ---> JavaScript 裡面可以非同步的去呼叫 Server 的 API 並且拿資料回來
    ---> 在 Ajax 出現之前,你要把資料帶過去都必須透過 Form 的方式,一定要換頁。可是有了 Ajax 以後,不換頁也能跟 Server 溝通
  7. 問題又來了
    原本我新增留言之後重新整理頁面就可以看到新的留言了,因為 Server 會把最新的結果傳回去;可是我現在用 Ajax,我要怎麼在不刷新頁面的前提下在畫面上新增留言
    --->直覺的解法:「阿我就用 JavaScript 來新增就好啦!」
  8. 問題又來了
    我看 Gmail 無論做什麼操作都不會換頁,你的留言板也可以改成這樣嗎?這樣比較方便,謝謝。
    ---> 他發現了 Gmail 跟其他網站不同的地方就是:「無論做什麼操作都不會換頁」,換頁指的是「你會有一段時間看到整個畫面全白,因為瀏覽器正在等待 Server 的 Response 才能載入 HTML」。
    --->你在用 Gmail 的時候,無論你是寫信、讀信、整理信件或是切換到設定頁,儘管你的網路跟烏龜一樣,你還是看不到任何全白畫面為什麼?因為 Gmail 所有跟 Server 溝通的地方都是用 Ajax
  9.  Ajax 跟後端同步資料,並且在前端用 JavaScript 更改畫面,所以你無論做什麼操作都不會換頁,也可以保證前後端的資料是同步的。
  10. 只要是任何原本用到 Form 的地方,現在全部都用 Ajax 拿資料並搭配 JavaScript 來做畫面上的處理。
  11. 小明驚
    咦,如果我全部畫面都是由前端利用 JavaScript 動態產生的話,那我原本後端的 View 要幹嘛
    ---> 咦,對啊,既然現在所有畫面都是在前端由 JavaScript 動態產生,那我後端不就永遠都輸出同一個檔案就好?如此一來,使用者看到的其實都是同一個頁面,而我們利用 JavaScript 在這個頁面上做變化。
    --->這個概念就叫做 SPA,全名是 Single Page Application,單頁式應用。
  12. 前端如果利用 SPA 來實作的話,會把原本應該是後端處理的一部份職責給搬到前端去,例如說狀態的管理路由
    ---> 以前(MPA): Server 根據不同的路徑對應到不同的 Controller,進而渲染出不同的 View
    ---> 現在(SPA): Server 無論什麼路徑都會輸出同一個檔案,所以你在前端也要判斷現在的網址是哪個,才能決定在前端應該渲染出哪個畫面
  13. 我相信 SPA 的使用者體驗一定很不錯,因為用起來就跟你在用 Native App 差不多嘛,但你必須付出的代價是前端變得超級複雜,有一堆非同步的問題要考慮還有一大堆事情要做,在這種時候,前端也可以參考我們前面所說的 MVC 架構或是其他相關架構來讓程式碼的職責變得更分明,讓整個專案更好維護。所以你可以又有 MVC 又有 SPA,或是沒有 MVC 但有 SPA,這兩者是完全不同的概念
  14. 最後我舉一個一定要用 SPA 的例子:音樂播放網站。
    所以唯一的解法就是:播放器永遠都在頁面上,只有其他部分的內容換掉。而這一切都是在前端用 JavaScript 來處理的。
  15. SEO: 由於 SPA 是由前端的 JavaScript 動態產生內容,因此如果你對 SPA 的網站按下右鍵 -> 檢視原始碼,只會看到空蕩蕩的一片,只看得到一個 JavaScript 檔案跟一些最基本的 tag。
    --->因此無論是哪個頁面,你檢視原始碼看不到動態新增後的內容。
  16. 解決SEO
    1. 既然問題出在「第一次渲染」,那我們只要在第一次渲染的時候把該輸出的資料都輸出就好啦,對使用者來說還是一個 SPA,舉例來說,假設使用者拜訪顯示所有留言的頁面,我在 Server Side 先把所有留言都準備好然後 render 出來,這樣使用者一收到 Response 的時候就能夠看到所有留言,搜尋引擎也能順利地爬到。後續的操作還是由 JavaScript 來處理,依舊能保持 SPA 的優點。
  17. 或者我們能用一句話來總結:
  18. CSR vs SSR
    對網路爬蟲來說你有沒有用 SPA 都無所謂,他所抓到的內容都是一樣的。可是對使用者來說,一樣能享受到 SPA 所帶來的好處(不用換頁)。
  19. 最終幕:
    1. 小明在深夜裡邊刷著 leetcode 邊回憶起前端的發展
    2. 在 Mobile 的流量漸漸超越 Desktop 之後,前端的目標就邁向「可以逼近 Native App」的體驗。又像是個 App 可是又不用安裝,那該有多好,省了安裝這個步驟轉換率大幅提升,使用者開心公司也開心。
    3. 於是大家開始提倡 PWA,Progressive Web App。Web 不再單純只是 Web,而是要用起來像個 App,看起來也像個 App。甚至利用 Service Worker 搭配快取,在沒有網路時也能夠使用部分功能,也可以用 Skeleton 先把畫面的骨架顯示出來。
    4. 這一切的一切都為了一個目的:增進使用者體驗。
    5. 一個技術的出現絕對是有其理由的。而不是簡單一句:「前端現在就是這麼複雜」,我認為只要能理解他出現的脈絡,就能更輕易的從宏觀的角度去理解這項技術。
  20. 一切都是有理由的,一切都是有原因的。你可以不懂它怎麼實作,但你一定要懂它是為了什麼而生。
    程式是工具,工具的目的是解決問題,
    重要的不是工具本身,而是背後要解決的那個問題。

 

mvvm, mvc 最大的差別在資料流

vm 視覺資料處理   graphql

redux ?? 自己的資料流??