用React實(shí)現(xiàn)支持在線(xiàn)協(xié)同的Excel表格

原文地址

表格是最重要的存儲(chǔ)和計(jì)算數(shù)據(jù)的格式之一猾骡,也是在線(xiàn)協(xié)同辦公中一個(gè)關(guān)鍵組成部分规阀。
本文介紹如何在10行代碼內(nèi),使用React創(chuàng)建一個(gè)功能豐富的Excel表格绪妹。

快速上手

首先庆寺,開(kāi)始先建一個(gè)空的React項(xiàng)目create-react-app
(如果你已經(jīng)有了一個(gè)React項(xiàng)目,可以跳過(guò)這一步)

npx create-react-app my-spreadsheet

如果你用yarn的話(huà)

yarn create react-app my-spreadsheet

之后银择,進(jìn)入my-spreadsheet目錄中多糠,安裝表格庫(kù)

 # using npm
npm install @fortune-sheet/react
 # or using yarn
yarn add @fortune-sheet/react

src/App.js替換為以下內(nèi)容

import { Workbook } from "@fortune-sheet/react";
import "@fortune-sheet/react/dist/index.css"

function App() {
  return <Workbook data={[{ name: "Sheet1" }]} />
}

export default App

并且,在src/index.css中增加一下代碼

html, body, #root {
  height: 100%;
} 

至此浩考,所有準(zhǔn)備工作做完了夹孔,可以直接啟動(dòng)項(xiàng)目了!使用以下命令

# using npm
npm start
 # or using yarn
yarn start

可以盡情玩轉(zhuǎn)并嘗試各種功能了~

本地運(yùn)行效果演示

關(guān)于表格庫(kù)

本文中的表格庫(kù)FortuneSheet是一個(gè)用原生React實(shí)現(xiàn)的表格組件析孽,將來(lái)還會(huì)支持Vue搭伤,它是完全開(kāi)源的,沒(méi)有任何使用限制袜瞬。
Github地址: https://github.com/ruilisi/fortune-sheet
在線(xiàn)體驗(yàn)Demo:https://ruilisi.github.io/fortune-sheet-demo/
協(xié)同版Demo:https://xiemala.com/s/mkAyPu
官方文檔:FortuneSheet Document (ruilisi.github.io)

優(yōu)化點(diǎn)

本組件源于另一個(gè)開(kāi)源項(xiàng)目Luckysheet怜俐,它使用jQuery實(shí)現(xiàn),但在團(tuán)隊(duì)的使用過(guò)程中吞滞,發(fā)現(xiàn)其在設(shè)計(jì)層面的諸多問(wèn)題佑菩,同時(shí)項(xiàng)目臃腫,難以維護(hù)裁赠,導(dǎo)致修改Bug和二次開(kāi)發(fā)非常困難殿漠。團(tuán)隊(duì)思考再三,毅然決定扎入這數(shù)十萬(wàn)行代碼的項(xiàng)目中佩捞,從中創(chuàng)建出一個(gè)全新的绞幌,設(shè)計(jì)合理,易于維護(hù)的表格組件一忱,并同樣完全開(kāi)源莲蜘。

FortuneSheet在Luckysheet的基礎(chǔ)上做了很多優(yōu)化谭确,其中解決的核心痛點(diǎn):

  1. 使用 Typescript 編寫(xiě)
  2. 項(xiàng)目庫(kù)可以使用 import / require 導(dǎo)入了
  3. 同頁(yè)面支持多個(gè)實(shí)例
  4. 去掉了 jQuery 的依賴(lài), 用原生 React / Vue + immer 來(lái)管理Dom和狀態(tài)。

其余優(yōu)化包括:

  1. 重新設(shè)計(jì)了協(xié)同模塊票渠。
  2. 剝離出公式模塊逐哈,用一個(gè)修改過(guò)的 handsontable/formula-parser 來(lái)處理公式計(jì)算。
  3. 優(yōu)化dom結(jié)構(gòu)问顷。
  4. 用SVG代替iconfont的圖標(biāo)昂秃,因?yàn)閕confont的圖標(biāo)對(duì)其他開(kāi)發(fā)者而言很不方便改動(dòng)。
  5. 容器外面不創(chuàng)建可見(jiàn)的頁(yè)面元素杜窄。
  6. 避免在window對(duì)象上存儲(chǔ)數(shù)據(jù)肠骆。

特色功能介紹

協(xié)同編輯

“協(xié)同”是在線(xiàn)表格最為核心的功能。傳統(tǒng)表格軟件和網(wǎng)頁(yè)組件相比塞耕,最大的區(qū)別就是對(duì)協(xié)同編輯的支持和協(xié)同編輯的體驗(yàn)蚀腿。因此,我們?cè)陂_(kāi)發(fā)FortuneSheet時(shí)扫外,非常重視這一功能莉钙,在項(xiàng)目開(kāi)始之初的架構(gòu)階段就思考好了具體的方案,并在版本更新迭代中優(yōu)先加入畏浆。同時(shí)胆胰,提供了一個(gè)簡(jiǎn)單的后端demo來(lái)實(shí)現(xiàn)數(shù)據(jù)交互、存儲(chǔ)刻获。


協(xié)同編輯效果演示

支持多實(shí)例

多實(shí)例支持

API的Demo展示

一個(gè)優(yōu)秀的開(kāi)源項(xiàng)目蜀涨,詳細(xì)的文檔是必不可少的。我們?cè)诿恳淮伟姹靖聲r(shí)蝎毡,都會(huì)相應(yīng)地去更新Readme和API文檔厚柳。為了方便其他Developer更舒適地使用組件和貢獻(xiàn)代碼,我們?cè)诮o出詳細(xì)的API文檔之外沐兵,還在Online Demo 中暴露出了API别垮,并做了簡(jiǎn)單的演示,極大程度地方便開(kāi)發(fā)者定制和接入功能扎谎。

API Demo

通過(guò)測(cè)試保證質(zhì)量

由于新上線(xiàn)的功能復(fù)雜度越來(lái)越高碳想,參與開(kāi)發(fā)的成員越來(lái)越多,在這樣龐大體量的項(xiàng)目中毁靶,Quality Assurance(質(zhì)量控制)就成了必不可少的一環(huán)胧奔。本項(xiàng)目的質(zhì)量控制流程包括嚴(yán)格的Pull Request代碼評(píng)審、CICD和針對(duì)功能的Jest覆蓋预吆。
截至撰寫(xiě)時(shí)龙填,已經(jīng)有了22個(gè)test suites和99個(gè)test,并且還在持續(xù)增加、補(bǔ)充當(dāng)中岩遗。越復(fù)雜的功能扇商,越需要嚴(yán)格的測(cè)試覆蓋。例如我們的核心功能—協(xié)同編輯宿礁,開(kāi)發(fā)者就寫(xiě)了多達(dá)十六個(gè)測(cè)試(jest)來(lái)保障其正確性案铺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窘拯,隨后出現(xiàn)的幾起案子红且,更是在濱河造成了極大的恐慌,老刑警劉巖涤姊,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嗤放,居然都是意外死亡思喊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)次酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恨课,“玉大人,你說(shuō)我怎么就攤上這事岳服〖凉” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵吊宋,是天一觀的道長(zhǎng)纲辽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)璃搜,這世上最難降的妖魔是什么拖吼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮这吻,結(jié)果婚禮上吊档,老公的妹妹穿的比我還像新娘。我一直安慰自己唾糯,他們只是感情好怠硼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著移怯,像睡著了一般香璃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芋酌,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天增显,我揣著相機(jī)與錄音,去河邊找鬼。 笑死同云,一個(gè)胖子當(dāng)著我的面吹牛糖权,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炸站,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼星澳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了旱易?” 一聲冷哼從身側(cè)響起禁偎,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阀坏,沒(méi)想到半個(gè)月后如暖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忌堂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年盒至,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士修。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枷遂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棋嘲,到底是詐尸還是另有隱情酒唉,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布沸移,位于F島的核電站痪伦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阔籽。R本人自食惡果不足惜流妻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笆制。 院中可真熱鬧绅这,春花似錦、人聲如沸在辆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匆篓。三九已至浑度,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸦概,已是汗流浹背箩张。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人先慷。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓饮笛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親论熙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子福青,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容