:Views 視圖與 Fetchers 數(shù)據(jù)源設(shè)計(jì)解析)
深入 HTML5 Word Cloud 架構(gòu)Views 視圖與 Fetchers 數(shù)據(jù)源設(shè)計(jì)解析【免費(fèi)下載鏈接】wordcloudHTML5 Word Cloud項(xiàng)目地址: https://gitcode.com/gh_mirrors/word/wordcloudHTML5 Word Cloud 是一款完全基于瀏覽器運(yùn)行的開(kāi)源詞云生成工具無(wú)需安裝任何軟件打開(kāi)網(wǎng)頁(yè)即可把文本、文件甚至維基百科詞條一鍵變成漂亮的詞云圖。它把「數(shù)據(jù)獲取」與「界面展示」徹底解耦構(gòu)成了清晰的Views 視圖層 Fetchers 數(shù)據(jù)源層雙核心架構(gòu)。本文將從源碼層面帶你拆解這套設(shè)計(jì)的精髓幫助你快速理解并二次開(kāi)發(fā)屬于自己的 HTML5 詞云工具。一圖看懂整體架構(gòu)狀態(tài)機(jī)驅(qū)動(dòng)一切在 assets/app.js 中項(xiàng)目用一個(gè)極其精妙的UIStateViewMap數(shù)組來(lái)管理所有界面狀態(tài)。它本質(zhì)是一張「狀態(tài) → 視圖組合」的映射表狀態(tài)常量含義顯示的視圖UI_STATE_SOURCE_DIALOG輸入數(shù)據(jù)源canvas source-dialogUI_STATE_WORKING正在處理loading dashboardUI_STATE_DASHBOARD詞云展示canvas dashboardUI_STATE_LIST_DIALOG編輯詞頻列表canvas dashboard list-dialog當(dāng)狀態(tài)切換時(shí)switchUIState() 會(huì)遍歷所有已注冊(cè)的視圖逐個(gè)調(diào)用show()或hide()。這意味著新增一個(gè)界面只需要注冊(cè)視圖并在映射表中加一行耦合度極低。Views 視圖層輕量級(jí)的原型繼承體系整個(gè)視圖層建立在不到 50 行的 View 基類(lèi)之上見(jiàn) assets/views.js堪稱(chēng)極簡(jiǎn)設(shè)計(jì)的典范load()從配置對(duì)象注入屬性并把element等*Element結(jié)尾的屬性自動(dòng)轉(zhuǎn)換成 DOM 節(jié)點(diǎn)引用show()/hide()在切換hidden屬性前后預(yù)留了beforeShow/afterShow/beforeHide/afterHide鉤子讓子類(lèi)可以?xún)?yōu)雅地插入自定義邏輯。核心視圖逐個(gè)看LoadingView 加載視圖承擔(dān)了「下載中 → 解析中 → 出錯(cuò)」全流程的文案切換通過(guò)updateLabel()配合 l10n 國(guó)際化機(jī)制assets/views.js讓多語(yǔ)言支持變得非常簡(jiǎn)單。對(duì)話(huà)框類(lèi)視圖包括輸入來(lái)源的 SourceDialogView、編輯詞頻的 ListDialogView、分享用的 SharerDialogView 以及關(guān)于頁(yè) AboutDialogView。以 ListDialogView 為例assets/views.js它的submit()會(huì)把詞頻列表編碼成 base64 寫(xiě)入 URL hash從而支持通過(guò)鏈接直接分享詞云配置。DashboardView 儀表盤(pán)則負(fù)責(zé)主題切換、形狀選擇、字體重繪等交互與 assets/dashboard-view.js 配合把用戶(hù)操作實(shí)時(shí)同步到詞云畫(huà)布上。Fetchers 數(shù)據(jù)源層六種輸入一網(wǎng)打盡如果說(shuō) Views 是「前端展示的皮」Fetchers 就是「數(shù)據(jù)供給的血」。所有數(shù)據(jù)源都繼承自同一個(gè) Fetcher 基類(lèi)通過(guò)types數(shù)組聲明自己能處理的 hash 類(lèi)型并由 addFetcher() 注冊(cè)進(jìn)app.fetchers字典。四類(lèi)數(shù)據(jù)源設(shè)計(jì)解析Fetcher支持的 hash 類(lèi)型數(shù)據(jù)來(lái)源TextFetchertext、base64文本框輸入FileFetcherfile本地文件FileReaderListFetcherlist、base64-list詞頻列表詞 權(quán)重JSONPFetcherjsonp、wiki等遠(yuǎn)程 API 數(shù)據(jù)TextFetcherassets/fetchers.js最有趣的是用setTimeout(..., 0)把數(shù)據(jù)處理強(qiáng)制變成異步回調(diào)避免阻塞 UI 線(xiàn)程。ListFetcherassets/fetchers.js會(huì)解析詞\t權(quán)重格式的文本并計(jì)算體積權(quán)重供后續(xù)詞頻縮放使用同時(shí)巧妙過(guò)濾掉空行和非法數(shù)據(jù)。FileFetcherassets/fetchers.js基于FileReader.readAsText()讀取本地文件還支持用戶(hù)指定 UTF-8 等編碼并且stop()時(shí)可以中止讀取體驗(yàn)細(xì)節(jié)拉滿(mǎn)。JSONP 下載器Script 與 Worker 雙引擎JSONPFetcher 是這套架構(gòu)中最有技術(shù)含量的一環(huán)。它設(shè)計(jì)了兩種下載引擎JSONPScriptDownloaderassets/fetchers.js動(dòng)態(tài)插入script標(biāo)簽用隨機(jī)回調(diào)名規(guī)避跨域限制并帶 30 秒超時(shí)兜底JSONPWorkerDownloaderassets/fetchers.js優(yōu)先把請(qǐng)求丟給 assets/downloader-worker.js 的 Web Worker 處理徹底不阻塞主線(xiàn)程。當(dāng)瀏覽器支持 Worker 時(shí)自動(dòng)啟用后者assets/fetchers.js這種漸進(jìn)增強(qiáng)策略非常值得借鑒。WikipediaFetcherassets/fetchers.js是 JSONPFetcher 的子類(lèi)它拼接維基百科 API 請(qǐng)求拉取詞條正文后通過(guò)正則剔除 HTML 標(biāo)簽與引用標(biāo)記讓用戶(hù)輸入一個(gè)詞條名就能生成詞云是數(shù)據(jù)源擴(kuò)展的完美范例。數(shù)據(jù)流全景從 URL 到畫(huà)布的完整旅程理解了雙核心后再看完整的數(shù)據(jù)流就一目了然了用戶(hù)輸入文本或選擇數(shù)據(jù)源route() 解析 URL hash 中的數(shù)據(jù)類(lèi)型根據(jù)類(lèi)型從app.fetchers找到對(duì)應(yīng) Fetcher調(diào)用getData()拉取數(shù)據(jù)Fetcher 把結(jié)果交給handleData()/handleList()assets/app.js數(shù)據(jù)經(jīng) wordfreq 分詞統(tǒng)計(jì)后調(diào)用 draw() 讓 CanvasView 渲染成詞云期間任何時(shí)刻點(diǎn)擊刷新或修改 hash都會(huì)觸發(fā)hashchange事件重新 route形成完整的閉環(huán)。這套流程把「URL 即狀態(tài)」的思想發(fā)揮到了極致——刷新頁(yè)面、分享鏈接、前進(jìn)后退都能保持詞云狀態(tài)這也是 HTML5 Word Cloud 相比傳統(tǒng)桌面工具最亮眼的體驗(yàn)優(yōu)勢(shì)。寫(xiě)在最后通過(guò)本文的拆解可以看到HTML5 Word Cloud 用極簡(jiǎn)的原型繼承、狀態(tài)機(jī)驅(qū)動(dòng)的視圖切換、以及高度可插拔的 Fetcher 體系構(gòu)建了一個(gè)優(yōu)雅且擴(kuò)展性極強(qiáng)的詞云架構(gòu)。無(wú)論你是想學(xué)習(xí)前端架構(gòu)設(shè)計(jì)還是打算在此基礎(chǔ)上接入新的數(shù)據(jù)源比如 Twitter、新聞 API只要繼承 Fetcher 并實(shí)現(xiàn)getData()再往視圖映射表里加一行就能輕松完成擴(kuò)展??烊?dòng)手試試吧【免費(fèi)下載鏈接】wordcloudHTML5 Word Cloud項(xiàng)目地址: https://gitcode.com/gh_mirrors/word/wordcloud創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考