vite源碼學習

源碼地址,目前版本是

image.png

核心目錄主要是vite\packages下的幾個包
image.png

image.png

vite 支持的配置

配置 Vite | Vite 官方中文文檔 (vitejs.dev)

啟動

image.png

image.png

image.png

dev

首先是sever文件下的createServer,先試整合配置文件vite.config.js 和 命令行里的配置到config中并對解析插件并排序抱完。


image.png

image.png

先處理httpserver的相關配置然后啟動一個http(s)server,并升級為websocket


image.png

image.png

使用 chokidar監(jiān)聽文件變化(這是進行熱更新的基礎)


image.png

常見配置項
  • persistent:bollean,與原生fs.watch一樣,表示是否保護進程不退出持久監(jiān)聽,默認值為true
  • ignored:string,所要忽略監(jiān)聽的文件或者文件夾
  • ignoreInitial:bollean,表示是否對增加文件或者增加文件夾的時候進行發(fā)送事件,默認值為false表示add/addDir會觸發(fā)事件
  • cwd:string類型蔚晨,沒有默認值握恳,類似于appBasepath紊选,監(jiān)聽的paths所相對的路徑。
  • usePolling:bollean卸勺,表示是否使用前面提到的fs.watchFile()進行輪詢操作,由于輪詢會導致cpu飆升烫扼,所以此選項通常在需要通過網(wǎng)絡監(jiān)視文件的時候才設置為true即使用fs.watchFile()曙求,默認值為false
  • depth:number類型,沒有默認值,如果設定則表示限定了會遞歸監(jiān)聽多少個子目錄映企。
  • ignorePermissionErrors悟狱,忽略權限錯誤。
  • disableGlobbing堰氓,如果為 true挤渐,所有 globs都被視為字面路徑名稱,即使它們具有特殊字符双絮。

根據(jù)container生成moduleGraph,然后將所有的plugin統(tǒng)一進行處理浴麻,保存到container中。


image.png

moduleGraph主要是將傳入的插件容器container掛載到this上囤攀,并初始化 4 個屬性urlToModuleMap软免、idToModuleMap、fileToModulesMap焚挠、safeModulesPath膏萧,Vite 為每個模塊創(chuàng)建一個ModuleNode對象,對象內包含模塊間的引用關系以及模塊信息。模塊信息包含絕對路徑向抢、轉換后的代碼认境、接收的熱更新模塊等。


image.png
  • resolveUrl挟鸠,調用所有插件的resolveId鉤子函數(shù)叉信,根據(jù)當前被請求模塊的url,獲取該文件的絕對路徑艘希,最后返回[url, 文件絕對路徑]硼身。
  • ensureEntryFromUrl,根據(jù)模塊路徑創(chuàng)建ModuleNode對象覆享,將對象收集到ModuleGraph的屬性中佳遂;最后返回這個對象。


    image.png
  • onFileChange撒顿,根據(jù)傳入的file獲取并清空對應ModuleNode對象的transformResult屬性值丑罪。
  • updateModuleInfo,用于構建和更新模塊之間的引用關系凤壁。

初始化后面要返回的vite-dev-server,綁定了一些屬性和方法

image.png

沒怎么看懂推薦一下這篇博客vite中的vue-dev-server吩屹。

watcher發(fā)生變化的時候,進行相應的熱更新處理


image.png

執(zhí)行vite 鉤子 configureServer,這里postHooks只收集有configureServer的plugin


image.png

中間件的使用


image.png
  • baseMiddleware拧抖,用來處理配置項中的 base 選項(開發(fā)或生產環(huán)境服務的公共基礎路徑)煤搜。我們的代碼在部署到生產環(huán)境時,一般會部署到某一個特定的目錄下唧席,這時訪問請求的 url 會帶上這個特定目錄的前綴擦盾,也就是這里的 base 選項。baseMiddleware 會刪除 base 前綴淌哟。
  • servePublicMiddleware迹卢,響應 public 文件夾下的請求。vite 默認會將 public 文件夾下的文件當作項目根目錄下的文件绞绒,且不做任何轉義處理婶希。
  • transformMiddleware,用來轉義處理 js蓬衡、ts喻杈、css、png 等資源文件狰晚,這是 vite 最核心的代碼實現(xiàn)筒饰。在這個中間件中會執(zhí)行 resolveId、load壁晒、transform 這三個鉤子函數(shù)瓷们。如果我們想對代碼做些什么,可以通過寫插件的方式實現(xiàn)這三個鉤子。
  • serveStaticMiddleware谬晕,用來響應不需要轉義的的資源文件請求碘裕,比如頁面中的 img 標簽發(fā)出的圖片請求。
  • indexHtmlMiddleware攒钳,用來處理 html 文件請求帮孔。

執(zhí)行posHooks里的plugins


image.png

幾個重要的插件:

  • importAnalysisPlugin,實現(xiàn)了 transform 鉤子不撑,當請求的是 js 腳本時文兢,會通過 es-module-lexer 這個庫分析出所有 import 語句。如果是裸導入焕檬,就分析出這個裸導入真正要導入的文件地址姆坚,然后轉換為正確的導入 url。這個插件還會對 import.meta 進行增強实愚,實現(xiàn)一些標準沒有的功能兼呵,比如import.meta.hot
  • assetPlugin爆侣,實現(xiàn)了 load 鉤子萍程,讓我們可以在代碼中通過import imgUrl from './logo.png';的方式獲得資源的 url。通過 import 導入的 png 圖片兔仰,服務器不直接返回圖片的數(shù)據(jù),而是返回一個 js 模塊蕉鸳,在模塊中通過 export default ${imgUrl}的方式導出要請求的圖片的 url乎赴。
  • resolvePlugin潮尝,實現(xiàn)了 resolveId 鉤子榕吼,是一個比較重要的插件,用來轉換 url 為真實路徑勉失。importAnalysisPlugin 插件中獲取裸導入真正的文件地址的功能就是調用了這個插件實現(xiàn)的羹蚣。
  • esbuildPlugin,實現(xiàn)了 transform 鉤子乱凿,使用 esbuild 將ts顽素、tsx 轉換為 js。

轉換index.html


image.png

在listen()之前執(zhí)行vite鉤子 buildStart徒蟆,和runOptimize(),進行啟動前的優(yōu)化胁出。然后返回server。


image.png

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末段审,一起剝皮案震驚了整個濱河市全蝶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖抑淫,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绷落,死亡現(xiàn)場離奇詭異,居然都是意外死亡始苇,警方通過查閱死者的電腦和手機砌烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埂蕊,“玉大人往弓,你說我怎么就攤上這事⌒钛酰” “怎么了函似?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喉童。 經(jīng)常有香客問我撇寞,道長,這世上最難降的妖魔是什么堂氯? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任蔑担,我火速辦了婚禮,結果婚禮上咽白,老公的妹妹穿的比我還像新娘啤握。我一直安慰自己,他們只是感情好晶框,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布排抬。 她就那樣靜靜地躺著,像睡著了一般授段。 火紅的嫁衣襯著肌膚如雪蹲蒲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天侵贵,我揣著相機與錄音届搁,去河邊找鬼。 笑死窍育,一個胖子當著我的面吹牛卡睦,可吹牛的內容都是我干的。 我是一名探鬼主播蔫骂,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼么翰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辽旋?” 一聲冷哼從身側響起浩嫌,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檐迟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后码耐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體追迟,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年骚腥,在試婚紗的時候發(fā)現(xiàn)自己被綠了敦间。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡束铭,死狀恐怖廓块,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情契沫,我是刑警寧澤带猴,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站懈万,受9級特大地震影響拴清,放射性物質發(fā)生泄漏。R本人自食惡果不足惜会通,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一口予、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涕侈,春花似錦沪停、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至调违,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泻轰,已是汗流浹背技肩。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浮声,地道東北人虚婿。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像泳挥,于是被迫代替她去往敵國和親然痊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容