關於我轉換框架這件事
本身我經歷了2次框架轉換,所以我自認我是能理解在框架轉換上的痛點。第一次是由冷門框架Mithril轉換到Vue,第二次是由Vue 轉換到React。這兩次都帶給我很多不同的感受,也切確體會到不同框架開發理念很大的不同。
Mithril 是個什麼樣的框架
我大概簡單描述 Mithril 是怎麼樣的框架,以後再另外寫一篇更詳細的。
它是一個基於「事件」驅動diff演算的框架,也就是你綁在DOM上各種事件被觸發時都進行檢查。缺點很明顯,你如果不是基於事件就不驅動,所以api請求是另外的方法去驅動,甚至可能發生要「手動」驅動。撰寫邏輯既不是template 系統,也不是 JSX系統,是更加JavaScript味道的「渲染函式」。比React更加JavaScript,完全沒有語法糖的那種。它渲染邏輯採用的是 class component 的生命週期,也有自己的 lifecycle hook,每一個生命週期也可以透過回傳 Promise 來達到渲染堵塞和延遲更新。
從渲染函式跳進 Vue 的碰撞
更詳細的就不贅述了,大體我可以了解到框架是基於「資料變化」來同步更新畫面,這也是框架的精髓。但突然間從強烈JS 味道的寫法進入 Vue 就有很大的碰撞,我在Vue我更偏好寫渲染函式和JSX,但整個生態圈鼓勵採用 template 。再來是 Vue 為人詬病和為人稱頌的 v 系列黑魔法,我不得不說好多語法,記起來很累。模板最討厭的地方是常常會出現讓你看不懂的語法,你又得回頭去查文件。更糟糕的是萬一遇到比較少人寫的語法,那真的會出現不知道怎麼寫的情境。
「Vue 很好學」是被比較出來的
常常有人說 「Vue很好學」,而好學是怎麼來的?其實好學就是被比較出來的,我當時同步學 react class component ,相較之下真的落差很大!最後慢慢我最大得到的感受,就是框架提供五花八門的API真的很方便,能夠解決各種應用上的情境。但也因為底層概念關係,有些api 設計理念是不合適的,進而設計組件有很大的衝突。
寫了三年 Vue,它比較像自助餐
我一路使用 Vue 就是 3年,期間Vue2 和Vue3,也寫過 composition api 和 optional api,甚至連 JSX、TS Class Component 、Render Function 我通通寫過。我並不覺得Vue 是限制很大的框架,我反而覺得它是「自助餐」,它提供了五花八門的解決方案,你可以選擇你喜歡的寫法,喜歡的控制程度,喜歡的自由度。
跳進 React 之後,適應不良的五件事
近幾個月跳入 React,不得不說現實面,以高薪工作還是要選個「很多人用」+「門檻很大」的框架。講講我遇過一些適應不良的狀況,具體描述一些 Case。
- 首先是你要時時刻刻關注 dependencies,因為只要引用到 useEffect 和 useContext 都可能造成不必要的計算,相依的變數都需要一層層處理處理 memoize。
- 每個 Component 並不會自動處理依賴變數,要手動包 memo 並自行處理 dependencies ,這些計算行為必須自行評估計算上的效率價值。
- 在 React Function Component 的 scope 中,不存在「initialization」這件事,只有「first effect」。然而你沒辦法在這個 function 當中定義初始化變數給其他 function 當作狀態。這件事超級違反 OOP 在操作的直覺,狀態不方便儲存。
- 幾乎沒有 global 註冊的方法和策略,需要經常大幅度跨檔案去取用模組。
- 對父層除了porps 下傳溝通外,幾乎沒有方法可以去對父層進行去用與判斷。
以上種種大概是最有感的,再設計組件頻頻遇到瓶頸。
但反過來說,React 的好處也很實在
但反過來說,我也體會到好處。
- React最強的也是那誇張的生態圈,它所支援的套件範圍可以說是非常廣闊,可以說是 React 代表了前端生態。
- 另一個點是 React 非常適合使用 「functional programming」的撰寫方式,讓整個 code 更加簡潔易懂,半而鼓勵採用這種邏輯在處理程式。
- 因為效能這件事是手動操作,也就是你可以縝密的評估要做多少程度的「效能優化」。
- 對於資深 JavaScript 開發者完全可以用「直覺」在寫程式,因為你思考的都是「如何寫JS 」,而不是「如何表現語法」。
- Context 有超多打破規則的玩法,可以從中設計出很多有趣的寫法。
- 對於生命週期的限制與要求更加嚴謹,避免出現很多漏洞。
還有就是⋯⋯不會有人因為你寫 JSX 白眼你XDXD