從一個開源項目到龐大的開源矩陣,他是怎么做到的?

大家好,我卡頌。

很多開源作者都經(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

作者:卡頌


歡迎關注微信公眾號 :魔術師卡頌