🎋 竹子日誌

關於我轉換框架這件事

本身我經歷了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。

  1. 首先是你要時時刻刻關注 dependencies,因為只要引用到 useEffect 和 useContext 都可能造成不必要的計算,相依的變數都需要一層層處理處理 memoize。
  2. 每個 Component 並不會自動處理依賴變數,要手動包 memo 並自行處理 dependencies ,這些計算行為必須自行評估計算上的效率價值。
  3. 在 React Function Component 的 scope 中,不存在「initialization」這件事,只有「first effect」。然而你沒辦法在這個 function 當中定義初始化變數給其他 function 當作狀態。這件事超級違反 OOP 在操作的直覺,狀態不方便儲存。
  4. 幾乎沒有 global 註冊的方法和策略,需要經常大幅度跨檔案去取用模組。
  5. 對父層除了porps 下傳溝通外,幾乎沒有方法可以去對父層進行去用與判斷。

以上種種大概是最有感的,再設計組件頻頻遇到瓶頸。

但反過來說,React 的好處也很實在

但反過來說,我也體會到好處。

  1. React最強的也是那誇張的生態圈,它所支援的套件範圍可以說是非常廣闊,可以說是 React 代表了前端生態。
  2. 另一個點是 React 非常適合使用 「functional programming」的撰寫方式,讓整個 code 更加簡潔易懂,半而鼓勵採用這種邏輯在處理程式。
  3. 因為效能這件事是手動操作,也就是你可以縝密的評估要做多少程度的「效能優化」。
  4. 對於資深 JavaScript 開發者完全可以用「直覺」在寫程式,因為你思考的都是「如何寫JS 」,而不是「如何表現語法」。
  5. Context 有超多打破規則的玩法,可以從中設計出很多有趣的寫法。
  6. 對於生命週期的限制與要求更加嚴謹,避免出現很多漏洞。

還有就是⋯⋯不會有人因為你寫 JSX 白眼你XDXD

留言