新手的對於前端組件化開發的一些疑問?

我是一個前端組件化開發的小白,從接觸前端到現在,寫頁面的基本上都遵從以下順序:

  1. 把HTML頁面布局寫出來,在寫布局的同時邊寫邊加入CSS

  2. 頁面的整體布局和樣式出來之後,寫js來實現各種css不能實現的交互效果

  3. 看項目js文件的複雜程度,有必要的會分模塊寫,目前經常在用AMD寫法,引入require.js

最近看了一些Vue的文檔,入門了一下Vue,趁熱打鐵就用Vue實現了一個很簡單的TodoMVC,其實這是一個很小的項目,可以不用劃分很多組件就能實現,但是為了練習組件化開發,我還是把它劃分了幾個模塊,在實現這個項目的過程中,遇到了一些問題,希望前端大大們能夠幫我解答:

  • 組件該如何劃分?

就拿TodoMVC來說,有人劃分的很細,TodoItem、TodoList、Input ,然後TodoItem和TodoList在一塊又組成了ManSection,最後還有一個TodoFooter。而只分一個Input和TodoList以及TodoFooter也能完成項目。所以我想問組件到底該怎麼劃分,在都能實現的前提下,是應該更細的劃分還是都可以,或者有沒有一個約定的大家都喜歡用的做法?

  • 組件的方法歸屬?

在實現todo的過程中,有些方法既可以綁在Input組件上,又可以綁在根組件上,舉個例子來說addNewTodo和removeTodo,這兩個方法,可以直接寫在根組件的methods中,又可以寫在Input和TodoList裡面,這又該怎麼取捨?

  • 組件的布局和樣式?

拿到一個項目之後,是直接劃分完組件就開始編寫,還是先用HTML把視圖實現一遍,然後再開始寫組件把視圖套進去?

感謝閱讀。


我之所以一直說對custom element持謹慎態度,是因為正如本問題所表達出來的,大多數工程師對組件如何設計劃分是缺乏經驗的。相對來說基於 is 屬性對原有html元素做擴展比較不容易出偏。

組件設計說到底是要做某種抽象。難就難在這種抽象要考慮很多的因素,比如適應UI設計師的建模、工程上的可維護性要求、常見用例和邊緣用例的矛盾、自定義組件和標準html元素的穿插交互、適應將來需求變化發展的可擴展性和可定製性……其中很多點是在開始設計開發時很難確定的,或者隨著業務發展經常會變化。這就是為什麼組件領域比其他技術領域更容易出現抽象泄漏的悲劇。

以這個最簡單的TodoList為例,題主疑惑的一點是組件的粒度,是只要個單一的 TodoList 好,還是要 TodoList、TodoItem、Input ?這其實並沒有一個確定的答案。TodoMVC 項目的目標是通過實現略微複雜一點的 hello world 來展示各種框架或開發方法的大體樣子,本身並沒有其他確定的標準可以輔助你判斷。

所以一方面,前者用起來很簡單,只要用 & 一行代碼就完了;而後者用起來就複雜一些,還要配合組件框架的 for 循環。另一方面,前者基本沒有可定製的餘地,比方說對 todo item 的樣式做一些設置(但也不是說完全沒有可能,比如可以通過css變數暴露一些可定製的點,但也只能針對所有的 todo item,很難具體到某一條 todo item);而後者也許可以直接對每一條 TodoItem 單獨設置屬性(但也不好說一定就很自由,比方說設置樣式方面,組件本身也許已經具有一些限制)。

到底哪種好,就必須回歸到具體的場景具體的需求里了。

關於粒度,我們也可以看看 html 原生組件。如 select 組件,看起來 select, optgroup, option 是比較接近後者的。但也有如 video/audio 這樣的組件,其 controls 只有一個屬性控制,並沒有提供任何進一步的定製餘地,因而比較類似前者。你可以考慮下為什麼 html 是這樣設計的?

BTW,如果觀察 html 原生組件的設計,你還會發現向前向後兼容性、無障礙性等因素。一個很有意思的例子是 datalist 的用法(摘自 spec):

&
Sex:
&
&

&
&
or select from the list:
&