vite为什么编译比webpack快

启动速度:Vite在启动时不需要打包,因为它支持ES模块加载,不需要编译和打包所有模块的依赖。这意味着Vite在启动时不需要像Webpack那样构建整个项目的文件,因此启动速度更快。

1 vite 采用 es 新规范

vite 中的 main.ts 中可以直接使用 import,不需要对此进行解析,不需要将 es6 转成 es5

JavaScript 复制代码
#vite 直接引入了 main.ts
<!DOCTYPE html>
<html lang="zh-CN">
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

#webpack 会将所有的文件编译打包成对应js文件,然后插入到 #app 节点后
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
  <body>
    <div id="app"></div>
    <!--
    <script type="text/javascript" src="/static/js/chunk-vendors.js"></script>
    <script type="text/javascript" src="/static/js/app.js"></script>
    -->
  </body>
</html>

2 基于1,对于 node_modules 中的包文件,vite 会直接请求对应的文件

**xxx.js、xxx.vue **中遇到 import { xxx } from "包名",并且当包名不以 / ./ ../ 开头

会进行字符串转换,将包地址转换为以 /node_modules/.vite 开头的相对或绝对路径

JavaScript 复制代码
xxx.js 或 xxx.vue 转换后的路径
import { xxx } from "/node_modules/.vite/deps/vue.js?v=b3ae5e1f"
import _export_sfc from "/@id/__x00__plugin-vue:export-helper"


#控制台直接请求的路径
http://localhost:5183/node_modules/.vite/deps/moment.js?v=b3ae5e1f
http://localhost:5183/node_modules/.vite/deps/vue-router.js?v=b3ae5e1f
基于直接请求了node_modules中的文件,在编译过程中,也能够直接读取本地缓存(vite 有自己的策略,当包更新时,能够通过改变 xxx.js?v=xxx值的方式请求到最新文件)

3 对于非node_moduels中的部分需要编译的部分,比如 ts 语法,jsx 语,Vite采用按需加载的方式,当请求某个模块时才会对该模块进行编译。

  • Vite 将所有的文件,如 xx.vue 进行路径 hmlrId 值处理
  • vite 将 <script type="module" src="/@vite/client"></script> 置入到 html 页面顶部,开启 websocket监听,监听文件变化
  • 将文件变化后,遍历变化的文件,计算出要更新的模块,发送 socket 信息,触发对应模块 import.meta.hot.accept 函数
JavaScript 复制代码
# 消息列举
# /node_modules/.pnpm/vite@5.0.12/node_modules/vite/dist/client/env.mjs" 中的部分逻辑
# 目前很多时候发送的都是 full-reload,后面值得深究下

async function handleMessage(payload) {
    switch (payload.type) {
      case 'connected':
          break;
      case 'update':
          break;
      case 'custom':
          break;
      case 'full-reload':
          break;
      case 'prune':
          break;
      case 'error':
          break;
      default:
        break
    }
}
相关推荐
梦曦i1 分钟前
uni-app x 0.7.0重磅升级:插件实例化,原生编译彻底打通
前端·uni-app x
开开心心就好10 分钟前
C盘空间不够用?一键扫描清理系统垃圾
前端·javascript·安全·支持向量机·语音识别·etcd·模拟退火算法
爱喝水的小周12 分钟前
实验八 Vue‑Router 路由插件实践
前端·javascript
ℋᙚᵐⁱᒻᵉ鲸落22 分钟前
ETypeError: nameRef.value?.focus is not a functio. 设置el-input自动聚焦时报错
前端·javascript·vue.js·elementui
JavaGuide24 分钟前
为什么越来越多人放弃 Claude Code 转而用 Pi?
前端·后端
SEO_juper27 分钟前
2026年用Python检查多语言站点hreflang:自动揪出“回链缺失/标错语言“等致命错误(附完整代码)
开发语言·前端·seo·独立站·谷歌优化
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·课程设计
半个落月10 小时前
LangChain.js Agent Memory 实战(下):用 Milvus 构建可检索的长期记忆
javascript·langchain
半个落月10 小时前
LangChain.js Agent Memory 实战(上):从内存对话、文件持久化到截断与摘要
javascript·langchain
Nicander11 小时前
我给 Excalidraw 做了一个本地工作区:DrawSpace
前端·开源