Vue-框架設計思維

更新於 發佈於 閱讀時間約 6 分鐘
七星山

七星山

如果前人已經走出一條最佳路徑,我們只顧著欣賞也會到山頂

關注點的改變

一個好的架構都會希望讓開發者能專注在”業務邏輯”的實現,可以提高專案的開發效率、減少開發者非關業務邏輯的事情而煩惱。例如:

開發者A: 請問元件的對話窗如何在確認時控制關閉或開啟狀態?

form validation

form validation

這個實際案例是架構師認為對話窗的動作皆會再按下”確定”後關閉視窗,因此由底層自動處理關閉可以讓開發者不用煩惱,也少寫一段 Code 相當方便! 這種設計雖然方便,但缺少了彈性,例如:若檢核失敗必須保持開啟,因此設計時要考慮 :

  • 預設自動關閉對話視窗
  • 可以自由控制關閉或開啟狀態
  • 學習使用元件的成本需小於自己做


若單個需求去看待,我們都能給出一個很好的解決方案,不過要綜合考量時,就必須在要各個解決方案中找出平衡、汲取各項優點,我認為這才是設計的難點,同時也是它有趣之處。因為他不會是一個答案,而有很多可能性,取決於你的角度和思維。

如果架構能解決整體開發上的 80% 問題,我認為已經是很好的結果了。 若嘗試把所有問題都能一起處理,很容易變成過度設計(Over-design)

Vue的權衡

會用關注點改變當開頭的原因是初次使用Vue時很明顯感受到這個差異,也讓我被框架的魅力吸引,到後來才知道是 「命令式」、「聲明式」寫法帶來的不同

命令式

const btn = document.getElementById('btnEle');
const div = document.getElementById('divEle')
btn.addEventListener("click", (e)=>{
div.textContent = 'click!'
})

聲明式

<button @click="()=> divEle.textCotent='click!'">Click</button>

從上述比較,聲明式更關心結果,並把實現的過程隱藏。(兩段程式碼就給了我們不同角度切入思考)

早期將Vue引進公司使用也主要是他有更好的維護性。以前維護過大型專案,滿滿的Javascript,就算切出共用元件、方法,如果沒有良好的開發文件,後續要持續沿用是很不容易的。常以新增 JS 檔案引用,利用Javascript全域特性覆寫以前的元件或功能,最後成了一堆不知道可不可以移除或使用的程式碼。


選擇聲明式之後?

既然聲明式是我們期望的開發方式,那我們考量了什麼? 權衡了什麼?

簡單命令式寫法來說,我們是挑不出多餘的執行負擔,它是效能最好的寫法。

div.textContent = 'click!'
// 命令式只需修改過程
div.textContent = 'hello world!'

聲明式寫法則多出了改變結果的過程,例如:

<button @click="()=> divEle.textCotent='click!'">Click</button>
<!-- click! 改為 hello world! -->
<button @click="()=> divEle.textCotent='hello world!'">Click</button>

因此我們可以得知

聲明式執行成本 = 找出結果差異成本 + 命令執行成本
※聲明式只是封裝命令式

公式中有了一個具體目標 — "找出結果差異成本”最佳化,使效能趨近於命令式。

找出利弊後,將弊處的影響減少到最低就成了架構的目標,而框架本體也若有似無的漸漸浮現


工作上常遇到各種大大小小的需求與專案,以複雜度、流量、專案目標去設計出相對應適合的架構。曾遇過有同事把網路上提供的架構模板Copy/Paste到專案上,前面開發得很開心,後續客戶需求變動後就不敷使用。我們應謹慎的評估每次的需求,設計出相對應適合的框架。


Virtual DOM

最一開始知道Vue使用Virtual DOM技術來實現框架,但直到讀了這本書(參考文末)才了解到,並不是因為這個技術而產生框架,而是權衡利弊後的解決方案可以利用Virtual DOM實現。

Virtual DOM概念很簡單,使用Javascript物件資料渲染出畫面

const root = document.getElementById("#app")
const vdom = {
tag:"div",
child:{
tag:"span",
child:"Hello Vue!"
}
}

render(vdom, root)

<body>
<div id="app">
<div>
<span>Hello Vue!</span>
<div>
</div>
</body>

前面提及的 “找出結果差異成本”很適合這個概念,因為透過遞迴物件找尋差異一定優於搜尋整個DOM Tree。

實現策略

我們有了夢想(聲明式)、工具(Virtual DOM),下一步就是實現的策略。聲明式很明顯是Browser無法解析,所以我們需要轉化成可解析的樣子 — 編譯。而編譯後,就是”執行”期間的事情了。

像是現在超商賣的雞胸肉,調味都幫你用好,我們只要微波或煎一下就可以吃了

雞胸肉

雞胸肉

Javascript純執行的特性變成 ⇒ 編譯期 + 執行期 (實現策略)

編譯是多出來的成本(開發期間),也會需要最佳化。不過目前都有工具在處理,例如: Webpack、rollup,身為開發者真的很慶幸有這些工具,開發體驗提升,多出來的成本還不用擔心,調整設定檔就能優雅的使用

結論

使用Vue也有3、4年的時間,直到最近才看了「Vue.js 設計實戰」。中間透過自己摸索框架,心中也有很多疑惑,有些在開發中得到答案,有些則還一直尋找,而這本書給我了這些答案。雖然比較慢才閱讀這本書,但也是一個不錯的時機點,過程中回想到很多的開發情境,透過情境相互印證也讓我更快吸收內容。

玉山指標

玉山指標

理解Vue框架設計思維,找出夢想的樣子,列出實現的方法,權衡方法選出適合的,解決因設計而多出來的成本。吸收完這本書的思維,平日設計專案架構路上如同多了指標,看來我也能邊欣賞邊到山頂了?🤣

參考

  • Vuejs設計實戰 - 霍春陽 著
Vuejs設計實戰

Vuejs設計實戰




avatar-img
1會員
4內容數
紀錄閱讀Vue3框架思維、設計實戰的過程
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
Vue.js是一種基於MVVM的前端JavaScript框架,類似的框架有React、Angular等。 架設環境 安裝Visual Studio Code(https://code.visualstudio.com/) 安裝Node.js(https://nodejs.org/en/
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
Thumbnail
Vite 是由 Vue 開發者 Evan You 所開發出來,用來加快、優化程式碼打包的工具,在這裡我們不免會需要提到大部分前端開發者可能都會聽過、使用過的前端工具:Webpack。 在那之前,我們先來聊聊為什麼前端會需要所謂的打包工具呢?
Thumbnail
v-model 指令是 Vue 中一個非常重要的功能,它實現了表單輸入和應用狀態之間的雙向綁定。本文將介紹如何使用 v-model 指令。
Thumbnail
指令(Directives)是 Vue 中一個重要的概念,它們提供了一種簡單的方式來操作 DOM 元素。本文將介紹 Vue 的兩個常用指令:v-if 和 v-show,並通過實際範例來解釋它們的不同之處和使用場景。
Thumbnail
Vue 是尤雨溪所開發的一個前端框架,Vue 提供了響應式數據綁定和組件化的開發模式,能方便開發者構建出具有良好交互性的前端應用。而 Vite 則是一個前端構建工具,用途是提供更快的開發體驗。然後,本文將介紹如何使用 Vite 建立一個 Vue 專案的開發環境,這是你學習 Vue 的第一步。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
Vue.js是一種基於MVVM的前端JavaScript框架,類似的框架有React、Angular等。 架設環境 安裝Visual Studio Code(https://code.visualstudio.com/) 安裝Node.js(https://nodejs.org/en/
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
Thumbnail
Vite 是由 Vue 開發者 Evan You 所開發出來,用來加快、優化程式碼打包的工具,在這裡我們不免會需要提到大部分前端開發者可能都會聽過、使用過的前端工具:Webpack。 在那之前,我們先來聊聊為什麼前端會需要所謂的打包工具呢?
Thumbnail
v-model 指令是 Vue 中一個非常重要的功能,它實現了表單輸入和應用狀態之間的雙向綁定。本文將介紹如何使用 v-model 指令。
Thumbnail
指令(Directives)是 Vue 中一個重要的概念,它們提供了一種簡單的方式來操作 DOM 元素。本文將介紹 Vue 的兩個常用指令:v-if 和 v-show,並通過實際範例來解釋它們的不同之處和使用場景。
Thumbnail
Vue 是尤雨溪所開發的一個前端框架,Vue 提供了響應式數據綁定和組件化的開發模式,能方便開發者構建出具有良好交互性的前端應用。而 Vite 則是一個前端構建工具,用途是提供更快的開發體驗。然後,本文將介紹如何使用 Vite 建立一個 Vue 專案的開發環境,這是你學習 Vue 的第一步。