详细解析Vite的ESM请求处理流程

 更新时间:2026年03月09日 09:29:04   作者:拉不动的猪  
本文主要介绍了详细解析Vite的ESM请求处理流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、项目结构示例

my-project/
├─ node_modules/
├─ src/
│  ├─ main.js        # 入口文件
│  ├─ App.vue        # 根组件
│  ├─ utils/
│  │  └─ math.js     # 工具模块
├─ index.html        # 基础HTML

二、完整请求处理流程

  1. 浏览器请求ESM
    当访问http://localhost:3000时,浏览器加载index.html并解析到:

```
<script type="module" src="/src/main.js"></script>
```

触发对`main.js`的ESM请求
  1. Vite拦截请求
    Vite服务器拦截到/src/main.js请求,检查发现:

    • 该文件未被预构建(非node_modules内容)
    • 未在内存缓存中找到编译结果
      进入实时编译流程

预构建(Pre-Bundling)

-   仅针对`node_modules`中的第三方依赖
-   将CommonJS/UMD模块转换为ESM格式
-   产物存储在`.vite/deps`目录并建立依赖图谱

实时编译(On-Demand Compilation)

-   处理项目源码(如`/src/`下的文件)
-   按需进行TS转译、Vue SFC编译等操作

  1. 实时编译处理
    Vite对main.js进行以下处理:

    // 原始main.js
    import { createApp } from 'vue'
    import App from './App.vue'
    
    createApp(App).mount('#app')
    
    • 'vue'重写为预构建路径/node_modules/.vite/vue.js

    • App.vue转换为可执行的ESM格式(拆分为script/style/template)

  2. 返回编译结果
    生成带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()
    }
    

    同时将该结果存入内存缓存

    实际编译效果如下:

  3. 后续请求处理
    当浏览器请求App.vue时:

    • 若开发者未修改文件,直接返回缓存结果
    • 若文件已修改,重新编译并更新缓存

三、关键场景示例

场景1:修改工具函数

  1. 修改src/utils/math.js

    - export const add = (a, b) => a + b
    + export const add = (a, b) => a + b + 1
    
  2. Vite检测到文件变更:

    • 使旧缓存失效
    • 仅重新编译math.js及其依赖链
    • 通过HMR通知浏览器更新模块

场景2:添加新依赖

  1. 新增src/composables/useCounter.js

    export default () => {
      const count = ref(0)
      const inc = () => count.value++
      return { count, inc }
    }
    
  2. 首次导入时触发实时编译,后续请求直接读缓存

四、缓存策略对比

文件类型缓存策略示例
预构建依赖强缓存(max-age=1年)/node_modules/.vite/
业务代码协商缓存(304)src/components/*.vue
静态资源根据配置决定public/logo.png

通过这种机制,Vite实现了开发环境下的秒级启动和亚秒级热更新。生产构建时则切换为Rollup的完整打包流程以保证最佳性能。

到此这篇关于详细解析Vite的ESM请求处理流程的文章就介绍到这了,更多相关Vite ESM请求处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue 父子组件的数据传递、修改和更新方法

    Vue 父子组件的数据传递、修改和更新方法

    下面小编就为大家分享一篇Vue 父子组件的数据传递、修改和更新方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • element-ui下拉菜单组件Dropdown的示例代码

    element-ui下拉菜单组件Dropdown的示例代码

    这篇文章主要介绍了element-ui下拉菜单组件Dropdown,本文详细给大家介绍了我遇到的一个最大的坑,通过结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • vue实现记事本小功能

    vue实现记事本小功能

    这篇文章主要为大家详细介绍了vue实现记事本小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vue脚手架学习之项目创建方式

    Vue脚手架学习之项目创建方式

    这篇文章主要给大家介绍了关于Vue脚手架学习之项目创建方式的相关资料,文中通过介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Vue3实现地图选点组件的示例代码

    Vue3实现地图选点组件的示例代码

    这篇文章主要为大家详细介绍了Vue3实现地图选点组件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 关于Vue实例创建的整体流程

    关于Vue实例创建的整体流程

    这篇文章主要介绍了关于Vue实例创建的整体流程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Vue左滑组件slider使用详解

    Vue左滑组件slider使用详解

    这篇文章主要为大家详细介绍了Vue左滑组件slider的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Vue3 Suspense实现优雅处理异步数据加载

    Vue3 Suspense实现优雅处理异步数据加载

    Suspense 是 Vue 3 中用于处理异步数据加载的特性,它使得在加载异步数据时可以提供更好的用户体验,下面小编就来和大家详细讲讲Suspense如何优雅处理异步数据加载吧
    2023-10-10
  • vue3+electron12+dll开发客户端配置详解

    vue3+electron12+dll开发客户端配置详解

    本文将结合实例代码,介绍vue3+electron12+dll客户端配置,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  •  用Vue Demi 构建同时兼容Vue2与Vue3组件库

     用Vue Demi 构建同时兼容Vue2与Vue3组件库

    这篇文章主要介绍了 用Vue Demi 构建同时兼容Vue2与Vue3组件库,我们通过考虑其功能、工作原理以及如何开始使用它来了解 Vue Demi,下面我们一起进入文章学起来吧
    2022-02-02

最新评论