成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

在之前的文章中介紹了借助 TypeScript AST 語法樹解析,對 React 組件 Props 類型定義及注釋提取,自動生成組件對應(yīng) 截圖、用法、參數(shù)說明、README、Demo 等。在社區(qū)中取得了比較好的反響,同時應(yīng)用在團(tuán)隊中也取得了較為不錯的結(jié)果,現(xiàn)在內(nèi)部組件系統(tǒng)中已經(jīng)累計使用該方案沉淀 1000+ 的 React 組件。

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

之前我們是借助了 webpack + TypeScript 做了一套用于開發(fā) React 組件的腳手架套件,當(dāng)開發(fā)者要組件開發(fā)時,即可直接使用腳手架初始化對應(yīng)項目結(jié)構(gòu)進(jìn)行開發(fā)。

雖然主路徑上確實解決了組件開發(fā)中所遇到的組件無圖無真相、組件參數(shù)文檔缺失、組件用法文檔缺失、組件 Demo 缺失、組件無法索引、組件產(chǎn)物不規(guī)范等內(nèi)部組件管理和沉淀上的問題,但 Webpack 的方案始終還是會讓組件開發(fā)多一層編譯,當(dāng)一個組件庫沉淀超過 300+ 時,引入依賴不斷增長,還是會帶來組件編譯上的負(fù)荷導(dǎo)致開發(fā)者開發(fā)體驗下降。

一 Vite 帶來的曙光

Vite 給前端帶來的絕對是一次革命性的變化,這么說毫不夸張。

或許應(yīng)該說是 Vite 背后整合的 esbuild 、 Browser es modules、HMR、Pre-Bundling 等這些社區(qū)中關(guān)于 JS 編譯發(fā)展的先進(jìn)工具和思路,在 Vite 這樣的整合推動下,給前端開發(fā)帶來了革命性變化。

我很早就說過,任何一個框架或者庫的出現(xiàn)最有價值的一定不是它的代碼本身,而是這些代碼背后所帶來的新思路、新啟發(fā)。所以我在寫文章的時候,也很注重能把我思考最后執(zhí)行的整個過程講清楚。

Vite 為什么快,主要是 esbuild 進(jìn)行 pre-bundles dependencies + 瀏覽器 native ESM 動態(tài)編譯,這里我不做過多贅述,詳細(xì)參考:Vite: The Problems

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

在這個思路的背景下,回到我們組件開發(fā)的場景再看會發(fā)現(xiàn)以下幾個問題高度吻合:

  • 組件庫開發(fā),實際上不需要編譯全部組件。

  • 組件開發(fā),編譯預(yù)覽頁面主要給開發(fā)者使用,瀏覽器兼容可控。

  • HMR(熱更新)能力在 Vite 加持下更加顯得立竿見影,是以往組件開發(fā)和調(diào)試花費時間最多的地方。

  • Vite 中一切源碼模塊動態(tài)編譯,也就是 TypeScript 類型定義和 JS 注釋也可以做到動態(tài)編譯,大大縮小編譯范圍。

那么,以往像 StoryBook 和之前我們用于提取 tsx 組件類型定義的思路將可以做一個比較大的改變。

之前為了獲取組件入?yún)⒌念愋蛿?shù)據(jù)會在 Wwebpack 層面做插件用于動態(tài)分析 export 的 tsx 組件,在該組件下動態(tài)加入一段 __docgenInfo 的靜態(tài)屬性變量,將從 AST 分析得到的類型數(shù)據(jù)和注釋信息注入進(jìn)組件 JS Bundle,從而進(jìn)一步處理為動態(tài)參數(shù)設(shè)置:

TypeScript 對組件 Props 的定義

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

分析注入到 JS Bundle 中的內(nèi)容

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

分析轉(zhuǎn)換后實現(xiàn)的參數(shù)交互設(shè)置

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

所以對于組件來說,實際上獲取這一份類型定義的元數(shù)據(jù)對于組件本身來說是冗余的,不論這個組件中的這部分元數(shù)據(jù)有沒有被用到,都會在 Webpack 編譯過程中解析提取并注入到組件 Bundle 中,這顯然是很低效的。

在 Vite 的思路中,完全可以在使用到組件元數(shù)據(jù)時,再獲取其元數(shù)據(jù)信息,比如加載一個 React 組件為:

import ReactComponent from './component1.tsx'

那么加載其元數(shù)據(jù)即:

import ComponentTypeInfo from './component1.tsx.type.json';   // or  const ComponentTypeInfoPromise = import('./component1.tsx.type.json');

通過 Vite 中 Rollup 的插件能力加載 .type.json 文件類型,從而做到對應(yīng)組件元數(shù)據(jù)的解析。同時借助 Rollup 本身對于編譯依賴收集和 HMR 的能力,做到組件類型變化的熱更新。

二 設(shè)計思路

以上是看到 Vite 的模塊加載思路,得到的一些靈感和啟發(fā),從而做出的一個初步設(shè)想。

但如果真的要做這樣一個基于 Vite 的 React 、 Rax 組件開發(fā)套件,除了組件入?yún)⒃獢?shù)據(jù)的獲取以外,當(dāng)然還有其他需要解決的問題,首當(dāng)其沖的就是對于 .md 的文件解析。

1 組件 Usage

參照 dumi 及 Icework 所提供的組件開發(fā)思路,組件 Usage 完全可以以 Markdown 寫文檔的形式寫到任何一個 .md 文件中,由編譯器動態(tài)解析其中關(guān)于 jsx、tsx、css、scss、less 的代碼區(qū)塊,并且把它當(dāng)做一段可執(zhí)行的 script 編譯后,運行在頁面中。

這樣既是在寫文檔,又可以運行調(diào)試組件不同入?yún)⑾陆M件表現(xiàn)情況,組件有多少中Case,可以寫在不同的區(qū)塊中交由用戶自己選擇查看,這個設(shè)計思路真是讓人拍案叫絕!

最后,如果能結(jié)合上述提到 Vite 的 esbuild 動態(tài)加載和 HMR 能力,那么整個組件開發(fā)體驗將會再一次得到質(zhì)的飛躍。

所以針對 Markdown 文件需要做一個 Vite 插件來執(zhí)行對 .md 的文件解析和加載,預(yù)期要實現(xiàn)的能力如下:

import { content, modules } from "./component1/README.md";  // content README.md 的原文內(nèi)容 // modules 通過解析獲得的`jsx`,`tsx`,`css`,`scss`,`less` 運行模塊

預(yù)期設(shè)想效果,請點擊放大查看:

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

2 組件 Runtime

一個常規(guī)的組件庫目錄應(yīng)該是什么樣的?不論是在一個單獨的組件倉庫,還是在一個已有的業(yè)務(wù)項目中,其實組件的目錄結(jié)構(gòu)大同小異,大致如下:

components ├── component1 │   ├── README.md  │   ├── index.scss │   └── index.tsx ├── component2 │   ├── README.md │   ├── index.scss │   └── index.tsx

在我們的設(shè)想中你可以在任意一個項目中啟動組件開發(fā)模式,在運行 vite-comp 之后就可以看到一個專門針對組件開發(fā)的界面,在上面已經(jīng)幫你解析并渲染出來了在 README.md 中編寫的組件 Usage,以及在 index.tsx 定義的 interface,只需要訪問不同的文件路徑,即可查看對應(yīng)組件的表現(xiàn)形態(tài)。

同時,最后可以幫你可以將這個界面上的全部內(nèi)容編譯打包,截圖發(fā)布到 NPM 上,別人看到這個組件將會清晰看到其組件入?yún)ⅲ梅ǎ貓D等,甚至可以打開 Demo 地址,修改組件參數(shù)來查看組件不同狀態(tài)下的表現(xiàn)形態(tài)。

如果要實現(xiàn)這樣的效果,則需要一套組件運行的 Runtime 進(jìn)行支持,這樣才可以協(xié)調(diào) React 組件、README.md、TypeScript 類型定義串聯(lián)成我們所需要的組件調(diào)試+文檔一體的組件開發(fā)頁面。

在這樣的 Runtime 中,同樣需要借助 Vite 的模塊解析能力,將其 URL 為 **/*/(README|*).html 的請求,轉(zhuǎn)換為一段可訪問的組件 Runtime Html 返回給瀏覽器,從而讓瀏覽器運行真正的組件開發(fā)頁面。

http://localhost:7000/components/component1/README.html ->  /components/component1/README.html  -> /components/component1/README.md ->  Runtime Html

3 組件 Props Interface

正如我上述內(nèi)容中講到的,如果利用 Vite 添加一個對 tsx 的組件 props interface 類型解析的能力,也可以做成獨立插件用于解析 .tsx.type.json 結(jié)尾的文件類型,通過 import 這種類型的文件,從而讓編譯器動態(tài)解析其 tsx 文件中所定義的 TypeScript 類型,并作為模塊返回給前端消費。

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

其加載過程就可以當(dāng)做是一個虛擬的模塊,可以理解為你可以通過直接 import 一個虛擬的文件地址,獲取到對應(yīng)的 React 組件元信息:

// React Component import Component from './component1.tsx'; // React Component Props Interface import ComponentTypeInfo from './component1.tsx.type.json';  // or const ComponentTypeInfoPromise = import('./component1.tsx.type.json');

由于這種解析能力并不是借助于 esbuild 進(jìn)行,所以在轉(zhuǎn)換性能上無法和組件主流程編譯同步進(jìn)行。

在請求到該文件類型時,需要考慮在 Vite 的 Serve 模式下,新開線程進(jìn)行這部分內(nèi)容編譯,由于整個過程是異步行為,不會影響組件主流程渲染進(jìn)度。當(dāng)請求返回響應(yīng)后,再用于渲染組件 Props 定義及側(cè)邊欄面板部分。

在熱更新過程中,同樣需要考慮到 tsx 文件修改范圍是否涉及到 TypeScript 類型的更改,如果發(fā)現(xiàn)修改導(dǎo)致類型變化時,再觸發(fā) HMR 事件進(jìn)行模塊更新。

三 組件 Build

以上都是在討論組件在 Vite 的 Serve 態(tài)(也就是開發(fā)態(tài))下的情況,我們上文中大量借助 Vite 利用瀏覽器 es module 的加載能力,從而做的一些開發(fā)態(tài)的動態(tài)加載能力的擴(kuò)展。

但是 Vite 在組件最終 Build 過程中是沒有 Server 服務(wù)啟動,當(dāng)然也不會有瀏覽器動態(tài)加載,所以為了讓別人也可以看到我們開發(fā)的組件,能夠體驗我們開發(fā)時調(diào)試組件的樣子,就需要考慮為該組件編譯產(chǎn)出一份可以被瀏覽器運行的 html。

所以在 Vite 插件開發(fā)過程中,是需要考慮在 Build 狀態(tài)下的編譯路徑的,如果是在 Build 狀態(tài)下,Vite 將使用 Rollup 的編譯能力,那么就需要考慮手動提供所有組件的 rollup.input(entries)。

在插件編寫過程中,一定需要遵循 Rollup 所提供的插件加載生命周期,才能保證 Build 過程和 Serve 過程的模塊加載邏輯和編譯邏輯保持一致。

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

我一開始在實現(xiàn)的過程中,就是沒有了解透徹 Vite 和 Rollup 的關(guān)系,在模塊解析過程中依賴了大量 Vite 的 Server 提供的服務(wù)端中間件能力。導(dǎo)致在考慮到 Build 態(tài)時,才意識到其中的問題,最后幾乎重新寫了之前的加載邏輯。

四 總結(jié)

我姑且把這個方案(套件)稱之為 vite-comp,其大致的構(gòu)成就是由 Vite + 3 Vite Pugins 構(gòu)成,每個插件相互不耦合,相互職責(zé)也不相同,也就是說你可以拿到任意一個 Vite 插件去做別的用途,后續(xù)會考慮單獨開源,分別是:

  • Markdown,用于解析 .md 文件,加載后可獲取原文及 jsx、tsx 等可運行區(qū)塊。

  • TypeScript Interface,用于解析 .tsx 文件中對于 export 組件的 props 類型定義。

  • Vite Comp Runtime,用于運行組件開發(fā)態(tài),編譯最終組件文檔。

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

結(jié)合 Vite,已經(jīng)實現(xiàn)了 Vite 模式下的 React、Rax 組件開發(fā),它相比于之前使用 Webpack 做的組件開發(fā),已經(jīng)體現(xiàn)出了以下幾個大優(yōu)勢:

  • 無懼大型組件庫,即使有 2000 個組件在同一個項目中,啟動依舊是 <1000ms。

  • 高效的組件元數(shù)據(jù)加載流,項目一切依賴編譯按需進(jìn)行。

  • 毫秒級熱更新響應(yīng),借助 esbuild 幾乎是按下保存的一瞬間,就可以看到改動效果。

預(yù)覽體驗:

啟動

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

Markdown 組件文檔毫秒級響應(yīng)

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

TypeScript 類型識別

手把手教你如何使用Vite+React進(jìn)行組件開發(fā)(實踐)

Vite 現(xiàn)在還是只是剛剛起步,這種全新的編譯模式,已經(jīng)給我?guī)砹朔浅6嗟拈_發(fā)態(tài)收益,結(jié)合 Vite 的玩法未來一定還會層出不窮,比如 Midway + lambda + Vite 的前端一體化方案也是看得讓人拍案叫絕,在這個欣欣向榮的前端大時代,相信不同前端產(chǎn)物都會和 Vite 結(jié)合出下一段傳奇故事。

我是一個熱愛生活的前端工程師!Yooh!

【相關(guān)教程推薦:React視頻教程】

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
日本少妇ASS浓精PICS| 99久9在线 | 免费| 艳妇乳肉豪妇荡乳AV| 樱花YY私人在线影院| 18禁强伦姧人妻又大又| CAOPORN免费视频国产| 成人区精品人妻人妻AV| 真人作爱试看90分钟免费影视 | 狠狠色噜噜狠狠狠777米奇| 精品一区二区三区无码免费直播 | 18禁无遮挡啪啪无码网站| 办公室的交易完整版| 国产成人无码AV一区二区| 啊轻点灬大巴太粗太长视频| 纯肉高H爽文粗大| 国产嫖妓风韵犹存对白| 久久精品夜色国产亚洲AV| 浓精喷进老师黑色丝袜| 日韩一区二区三区无码免费视频| 无码少妇一区二区三区| 特级欧美AAAAAAA免费观看 | 国内精品免费久久久久电影院97 | 好深啊太粗好烫撑满了| 国产韩国精品一区二区三区| 大欧派拔萝卜游戏| 国产午夜影视大全免费观看 | 久久久久久久99精品国产片| 欧美激情国产精品视频一区| 特级毛片内射WWW无码| 亚洲乱亚洲乱妇无码麻豆| AV天堂永久资源网亚洲高清| 国产精品高潮呻吟AV久久动漫| 久久99精品久久久久久国产| 欧美亚洲综合另类色妞网| 少妇人妻激情乱人伦| 亚洲欧美性爱视频在线| 亚洲精品国产成人精品| 亚洲国产精品久久一线APP| 18禁高潮出水呻吟娇喘蜜芽| 国产AV无码专区亚洲AV手机麻| 丰满熟妇XXXX性久久久| 精品国产亚洲第一区二区三区| 欧美成人WWW免费全部网站| 天天AV天天翘天天综合网| 亚洲综合一区二区三区无码 | 日本又黄又爽又无遮挡的视频| 亚洲AV无码专区在线观看漫画| 亚洲AV纯肉无码精品动漫 | 免费观看高清日本AⅤ| 天堂А√在线最新版中文下载| 一本久久伊人热热精品中文| 大陆极品少妇内射AAAAA| 精品无码一区二区Av蜜桃| 日韩AV片无码一区二区三区不卡| 亚洲国产成人五月综合网| 被CAO的合不拢腿| 久久国产乱子伦精品免费女人| 日本少妇情视频WWW| 亚洲精品成人无码中文毛片| 成人Α片免费视频在线观看| 久久久久精品国产亚洲AV蜜桃| 三级做A全过程在线观看| 亚洲一区制服无码中字| 2019日韩中文字幕MV| 国产深夜男男口爆Gay| 欧美乱人伦中文字幕在线| 日韩在线 | 中韩| 伊人久久大香线蕉AV五月天宝贝| 国产成人精品午夜二三区波多野| 国产午夜片无码区在线观看爱情网| 女人18片毛片免费| 亚洲精品AV中文字幕在线| 夫妇交换性三中文字幕| 内谢少妇XXXXX8老少交| 亚洲国产最大AV| 国产成人免费无码AV在线播放| 女人扒开屁股桶爽6O分钟| 亚洲卡1卡2乱码新区仙踪| 国产超碰人人爽人人做| 欧美午夜性春猛交ⅩXXX| 亚洲一区二区三区偷拍女厕| 国产精品亚洲色婷婷99久久精品| 漂亮人妻洗澡被强人人躁| 一区二区三区熟女少妇小牛| 国产特级毛片AAAAAA毛片| 日本XXXX裸体撤尿| 337P粉嫩胞人体高清视频免费| 极品人妻VIDEOSSS人妻 | 国产办公室秘书无码精品99| 漂亮人妻被强中文字幕久久| 一区二区三区无码在线观看| 国产在线精品一区二区| 麻豆精产国品一二三产区区| 亚洲AV无码精品狠狠爱| 丰满熟妇性ⅩXXOOO69| 欧美性受XXXX人人本视频| 一边摸一边抽搐一进一出视频| 国产午夜三级一区二区三 | 丰满少妇弄高潮了WWW| 欧美日韩免费观看| 中文无码VR最新无码AV专区| 初尝禁果稚嫩宫交H| 欧美成人精品高清在线播放| 一个添下面两个吃奶| 黄到让你下面湿的视频| 午夜.DJ高清在线观看免费8| 国产AV无码专区亚洲AV桃花庵| 日本理伦片午夜理伦片| 99热久RE这里只有精品小草| 麻豆熟妇人妻XXXXXX| 亚洲综合色婷婷七月丁香| 精品国产V无码大片在线观看| 亚洲AV成人无码精品网站色欲| 国产精品久久久天天影视| 神里凌华被焯出白水视频| 成人无码午夜在线观看| 人妻精品一区二区| YELLOW在线资源免费观看| 欧美激情XXXX| HEZYO东京热无码专区| 男男GV白嫩小受GV在线播放| 中文字幕无码人妻少妇免费 | 国精产品一区一区三区有限公司| 无码不卡AV东京热毛片| 国产成人综合色视频精品| 四虎成人精品一区二区免费网站| 儿子第一次送妈妈母亲节礼物| 日韩人妻中文无码一区二区七区| 成码无人AV片在线电影网站| 日本适合十八岁以上人群的护肤品 | 亚洲 欧美精品SUV| 国偷自产视频一区二区久| 亚洲AV无码专区亚洲AV紧身裤| 国精产品W灬源码1688在线| 亚洲AV无码一区二区三区少妇 | 亚洲精品乱码久久久久久按摩| 黑人性狂欢在线播放| 亚洲日韩电影久久| 久久婷婷人人澡人人爽人人爱 | 国产精品天干天干| 性FREE毛茸茸VIDEOS| 国产妇女馒头高清泬20P多毛| 无码抽搐高潮喷水流白浆| 国产无遮挡裸体免费视频在线观看 | 欧美精品九九99久久在免费线| JAPANESE五十路熟妇| 日本人妻熟妇丰满成熟HD系列| 纯爱无遮挡H肉动漫在线播放| 特级欧美ZOOXX| 国模精品一区二区三区| 亚洲国产精品无码专区成人| 久久久久AV综合网成人| 1000部啪啪未满十八勿入不卡| 欧美自拍亚洲综合在线| 纯肉无遮挡H肉动漫在线观看3D| 他的舌头探入蜜源毛毛虫说说| 国产精品免费看久久久无码| 亚洲精华液一二三产区| 噜噜狠狠色综合久色AⅤ五区| CHINESE勾搭VIDEOS| 色欲丰满熟妇人妻av一区二区| 国产精品普通话国语对白露脸| 亚洲国产精品18久久久久久 | 99RE免费99RE在线视频| 久久99精品国产麻豆婷婷| 伊人久久亚洲精品一区| 欧美性猛交XXXXX按摩欧美| 东北少妇大叫高潮XXXⅩ| 午夜三级A三级三点自慰| 久久99热这里只有精品国产| 97久久精品亚洲中文字幕无码 | 绯色精品人妻av一区二区| 性色AV免费网站| 久久综合伊人中文字幕| 办公室被绑奶头调教羞辱OL| 内射人妻无码色AB麻豆| 成人精品视频99在线观看免费| 午夜精品久久久久久久无码| 久久精品亚洲综合专区 | 人妻无码久久精品| 国产精品免费_区二区三区观看| 亚洲日韩丝袜熟女变态夜夜爽| 欧美丰满熟妇BBB久久久| 东京热无码AV一区二区| 亚洲第一狼人天堂网亚洲AV| 哦┅┅快┅┅用力啊┅警花少妇| 丰满少妇人妻久久久久久| 亚洲精品无码久久久久SM| 欧美一级 片内射黑人B| 国产欧美另类久久精品蜜芽| 在线视频夫妻内射| 少妇AV一区二区三区无码久久| 精品国偷自产在线视频| IJZZIJZZIJ亚洲大全| 午夜性影院爽爽爽爽爽爽| 美女露胸 0无挡挡| 国产成人一区二区三区视频免费| 一本大道香蕉大L在线吗视频| 日韩一区无码视频| 久久久久亚洲AV无码专区桃色|