從一個開源項目到龐大的開源矩陣,他是怎么做到的?
大家好,我卡頌。
很多開源作者都經(jīng)歷過如下過程:
有個好的開源點子
擼起袖子加油干
開源項目獲得社區(qū)認可,star數(shù)量就是自己的動力
隨著維護時間變長,遇到挫折(時間上的消耗、伸手黨的不理解...)
心灰意冷,逐漸停止維護
今天要介紹的主人公「Tanner Linsley」是React Table與React Query的作者。
Tanner Linsley
不同于其他開源作者在激情散去后項目逐漸荒廢,「Tanner Linsley」不僅持續(xù)迭代項目,而且隨著維護的項目越來越多,甚至形成了項目矩陣。
上面提到的React Table、React Query,再加上其他四個項目已經(jīng)合并到TanStack項目下,形成了統(tǒng)一的品牌(TanStack):
他是如何做到的?本文來聊聊「Tanner Linsley」的開源之路。
開源的收益
談到「開源」,大家會想到很多標簽 —— 「免費」、「用愛發(fā)電」、「貢獻」......
但事實上,任何工作如果沒有穩(wěn)定的物質(zhì)收益(對,說的就是錢),都是很難持續(xù)的。
傳統(tǒng)意義上,開源作者主要依靠「贊助」(比如Github Sponsor[1])。
相比開源的工作量,「贊助」通常是杯水車薪。所以開源作者很難擴大自己維護項目的規(guī)模。
「Tanner」在Github Sponsor[2]已經(jīng)擁有180個贊助者,算很不錯的了。
Tanner的贊助者
但從「擴大維護項目的規(guī)模」角度看,還遠遠不夠。
那么是什么使得「Tanner」有穩(wěn)定的收益,從而維護更多項目呢?
答案是:課程。
TanStack矩陣中的TanStack Query(即React Query)的官方課程[3]已經(jīng)售出8w份了,按當前的折扣價156刀算,這部分收入有稅前1200w刀了。
雖然實際收入肯定達不到這個數(shù),但數(shù)百萬刀的收益還是有的。
所以,只要持續(xù)產(chǎn)出優(yōu)秀的開源項目,就能獲得穩(wěn)定的課程收益,形成正反饋。
那么,一個優(yōu)秀的開源項目是如何誕生的呢?接下來我們聊聊React Table的發(fā)展史。
React Table發(fā)展史
在2015年時,「Tanner」是一家創(chuàng)業(yè)公司nozzle的聯(lián)合創(chuàng)始人。
nozzle的主營業(yè)務是:反向爬取Google搜索結(jié)果頁的數(shù)據(jù),將這些數(shù)據(jù)整合分析后,提供給有SEO需要的廣告主。
這就需要做很多數(shù)據(jù)可視化相關工作。
當時nozzle的技術棧是Angular,使用ag-grid實現(xiàn)表格。
為了項目的后續(xù)發(fā)展,「Tanner」決定將項目整體遷移到React技術棧。
但當時React技術棧沒有優(yōu)秀的表格組件,于是他決定自己實現(xiàn)一個。
自用與開源的沖突
React Table的最初版完全是為了滿足自用,開源只是順手的事兒。
作為一個開源組件,React Table最初的使用方式如下:
<ReactTable
data={data}
columns={columns}
/>
與「自用組件」不同,「開源組件」需要滿足盡可能多人的需求。
于是,隨著React Table的star越來越多,issues也接踵而至。
比如:
能夠?qū)崿F(xiàn)分頁功能么?
我能給Header組件傳自定義props么?
我能用CSS-In-JS么?
這些定制化需求讓「Tanner」疲于奔命,也導致React Table越來越臃腫。
最終,React Table有了137個props配置項來應對這些定制化需求:
接下來該如何維護,難道任由React Table的配置項不斷膨脹么?
還好,「Tanner」找到了解決方案,那就是render props。改版后的寫法如下:
ReactTable組件只負責表格的核心邏輯,內(nèi)部的邏輯交給render props實現(xiàn)。
想要自定義表頭?自己去實現(xiàn)。
想要分頁?自己去實現(xiàn)。
當render props版本的React Table就快實現(xiàn)時,React核心團隊發(fā)布了Hooks。
于是,React Table重新開發(fā)了基于Hooks的版本:
乍看之下,相比于render props的版本,Hooks的版本只是將ReactTable組件變?yōu)閡seTable方法。
但實際上,這是個巨大的飛躍。
因為,格局一下打開了。
格局打開
render props可以認為是React的一個特性,他是與React相關的。
而Hooks本身僅僅是帶有特殊功能的函數(shù),這意味著他可以脫離React單獨存在。
得益于React Hooks的思想被社區(qū)廣泛接受,越來越多框架都實現(xiàn)了自己的Hooks(比如Vue3中的Composition API)。
所以,新版React Table被設計為「框架不可知」(Framework Agnostic)。
簡單來說,由@tanstack/table-core再加不同框架的adapter就能實現(xiàn)針對不同框架的table組件:
比如,針對Solid.js,只需要適配他的「細粒度更新」與context,就能實現(xiàn)Solid Table:
這種「框架不可知」的開源組件擴大了組件的受眾范圍,也降低了開發(fā)者遷移技術棧后的上手成本。
后記
開源不是打打殺殺,而是人情世故。
按理說,AG Grid應該是Tanstack Table的直接競爭對手。但是,基于「合作共贏」的態(tài)度,兩者形成伙伴關系,共同致力于:
教育前端開發(fā)者這兩個庫之間的差異以及如何選擇
當一個庫不符合需求時,推薦對方。以求兩者共同覆蓋盡可能多的應用場景
AG Grid團隊甚至是Tanstack的大贊助商:
這種「合作共贏,一起把蛋糕做大」(或者說「寡頭壟斷」)的開源模式,值得廣大開源作者借鑒。
你有沒有用過React Table或React Query呢?對于他們發(fā)展至今取得的成績與收益,你怎么看?
參考資料
[1]
Github Sponsor:
https://github.com/sponsors
[2]
Github Sponsor:
https://github.com/sponsors/tannerlinsley
[3]
官方課程:
https://ui.dev/react-query?from=tanstack#pricing-plans
作者:卡頌
歡迎關注微信公眾號 :魔術師卡頌