詳細(xì)解析Vite的ESM請(qǐng)求處理流程
一、項(xiàng)目結(jié)構(gòu)示例
my-project/ ├─ node_modules/ ├─ src/ │ ├─ main.js # 入口文件 │ ├─ App.vue # 根組件 │ ├─ utils/ │ │ └─ math.js # 工具模塊 ├─ index.html # 基礎(chǔ)HTML
二、完整請(qǐng)求處理流程
- 瀏覽器請(qǐng)求ESM
當(dāng)訪問(wèn)http://localhost:3000時(shí),瀏覽器加載index.html并解析到:

``` <script type="module" src="/src/main.js"></script> ``` 觸發(fā)對(duì)`main.js`的ESM請(qǐng)求
Vite攔截請(qǐng)求
Vite服務(wù)器攔截到/src/main.js請(qǐng)求,檢查發(fā)現(xiàn):- 該文件未被預(yù)構(gòu)建(非
node_modules內(nèi)容) - 未在內(nèi)存緩存中找到編譯結(jié)果
進(jìn)入實(shí)時(shí)編譯流程
- 該文件未被預(yù)構(gòu)建(非
預(yù)構(gòu)建(Pre-Bundling)
- 僅針對(duì)`node_modules`中的第三方依賴
- 將CommonJS/UMD模塊轉(zhuǎn)換為ESM格式
- 產(chǎn)物存儲(chǔ)在`.vite/deps`目錄并建立依賴圖譜
實(shí)時(shí)編譯(On-Demand Compilation)
- 處理項(xiàng)目源碼(如`/src/`下的文件)
- 按需進(jìn)行TS轉(zhuǎn)譯、Vue SFC編譯等操作
實(shí)時(shí)編譯處理
Vite對(duì)main.js進(jìn)行以下處理:// 原始main.js import { createApp } from 'vue' import App from './App.vue' createApp(App).mount('#app')將
'vue'重寫(xiě)為預(yù)構(gòu)建路徑/node_modules/.vite/vue.js將
App.vue轉(zhuǎn)換為可執(zhí)行的ESM格式(拆分為script/style/template)
返回編譯結(jié)果
生成帶HMR支持的編譯后代碼:import { createApp } from '/node_modules/.vite/vue.js' import App from '/src/App.vue?import' createApp(App).mount('#app') // 注入HMR客戶端代碼 if (import.meta.hot) { import.meta.hot.accept() }同時(shí)將該結(jié)果存入內(nèi)存緩存
實(shí)際編譯效果如下:

后續(xù)請(qǐng)求處理
當(dāng)瀏覽器請(qǐng)求App.vue時(shí):- 若開(kāi)發(fā)者未修改文件,直接返回緩存結(jié)果
- 若文件已修改,重新編譯并更新緩存
三、關(guān)鍵場(chǎng)景示例
場(chǎng)景1:修改工具函數(shù)
修改
src/utils/math.js:- export const add = (a, b) => a + b + export const add = (a, b) => a + b + 1
Vite檢測(cè)到文件變更:
- 使舊緩存失效
- 僅重新編譯
math.js及其依賴鏈 - 通過(guò)HMR通知瀏覽器更新模塊
場(chǎng)景2:添加新依賴
新增
src/composables/useCounter.js:export default () => { const count = ref(0) const inc = () => count.value++ return { count, inc } }首次導(dǎo)入時(shí)觸發(fā)實(shí)時(shí)編譯,后續(xù)請(qǐng)求直接讀緩存
四、緩存策略對(duì)比
| 文件類(lèi)型 | 緩存策略 | 示例 |
|---|---|---|
| 預(yù)構(gòu)建依賴 | 強(qiáng)緩存(max-age=1年) | /node_modules/.vite/ |
| 業(yè)務(wù)代碼 | 協(xié)商緩存(304) | src/components/*.vue |
| 靜態(tài)資源 | 根據(jù)配置決定 | public/logo.png |
通過(guò)這種機(jī)制,Vite實(shí)現(xiàn)了開(kāi)發(fā)環(huán)境下的秒級(jí)啟動(dòng)和亞秒級(jí)熱更新。生產(chǎn)構(gòu)建時(shí)則切換為Rollup的完整打包流程以保證最佳性能。
到此這篇關(guān)于詳細(xì)解析Vite的ESM請(qǐng)求處理流程的文章就介紹到這了,更多相關(guān)Vite ESM請(qǐng)求處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue 父子組件的數(shù)據(jù)傳遞、修改和更新方法
下面小編就為大家分享一篇Vue 父子組件的數(shù)據(jù)傳遞、修改和更新方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Vue腳手架學(xué)習(xí)之項(xiàng)目創(chuàng)建方式
這篇文章主要給大家介紹了關(guān)于Vue腳手架學(xué)習(xí)之項(xiàng)目創(chuàng)建方式的相關(guān)資料,文中通過(guò)介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Vue3實(shí)現(xiàn)地圖選點(diǎn)組件的示例代碼
這篇文章主要為大家詳細(xì)介紹了Vue3實(shí)現(xiàn)地圖選點(diǎn)組件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
關(guān)于Vue實(shí)例創(chuàng)建的整體流程
這篇文章主要介紹了關(guān)于Vue實(shí)例創(chuàng)建的整體流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Vue3?Suspense實(shí)現(xiàn)優(yōu)雅處理異步數(shù)據(jù)加載
Suspense?是?Vue?3?中用于處理異步數(shù)據(jù)加載的特性,它使得在加載異步數(shù)據(jù)時(shí)可以提供更好的用戶體驗(yàn),下面小編就來(lái)和大家詳細(xì)講講Suspense如何優(yōu)雅處理異步數(shù)據(jù)加載吧2023-10-10
vue3+electron12+dll開(kāi)發(fā)客戶端配置詳解
本文將結(jié)合實(shí)例代碼,介紹vue3+electron12+dll客戶端配置,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
?用Vue?Demi?構(gòu)建同時(shí)兼容Vue2與Vue3組件庫(kù)
這篇文章主要介紹了?用Vue?Demi?構(gòu)建同時(shí)兼容Vue2與Vue3組件庫(kù),我們通過(guò)考慮其功能、工作原理以及如何開(kāi)始使用它來(lái)了解?Vue?Demi,下面我們一起進(jìn)入文章學(xué)起來(lái)吧2022-02-02

