当前位置: 首页 > news >正文

Vite 预构建机制深度解析(Vite缺点之一)

Vite 预构建机制深度解析


一、预构建核心目的

  1. 解决 CommonJS 转 ESM
    • 将非 ESM 格式的依赖(如 Lodash)转换为浏览器可识别的 ESM 格式

// 转换前 (CommonJS)
const _ = require('lodash');// 转换后 (ESM)
import _ from '/node_modules/.vite/lodash.js?v=1234'
  1. 合并碎片化请求
    在这里插入图片描述

  2. 性能优化

    • 避免浏览器同时发起数百个 HTTP 请求

二、触发时机

在这里插入图片描述


三、核心工作流程

Browser Vite Server Pre-Bundler File System 请求 main.js 检测依赖变化 扫描 node_modules 返回依赖列表 执行构建 写入缓存 读取缓存 alt [需要预构建] [缓存可用] 返回处理后的 ESM Browser Vite Server Pre-Bundler File System

四、关键技术实现

1. 依赖扫描算法
// 伪代码:依赖扫描
function scanDeps(root) {const deps = new Set();// 1. 查找入口文件const entry = findEntryFiles(root); // 2. AST 快速遍历entry.forEach(file => {const code = fs.readFileSync(file);const ast = parseAST(code);traverse(ast, {ImportDeclaration(path) {if (isNodeModule(path.source.value)) {deps.add(resolveModule(path.source.value));}}});});return deps;
}
2. 构建流程优化
  1. 并发编译

// 使用 esbuild 并行处理
await Promise.all(deps.map(dep => esbuild.build({entryPoints: [dep],format: 'esm',bundle: true,outfile: `cache/${hash(dep)}.js`})
));
  1. 缓存策略
    • 缓存键组成:锁文件内容 + 依赖版本 + vite配置
3. 浏览器请求拦截
是第三方模块?
Request
ViteServer
Yes
重定向到预构建包
返回/node_modules/.vite/lodash.js
No
按需编译

五、性能瓶颈分析

1. 预构建耗时因素

在这里插入图片描述

2. 实测数据对比

在这里插入图片描述


六、高级优化策略

1. 手动优化配置
// vite.config.js
export default {optimizeDeps: {// 强制排除模块exclude: ['vue-demi'], // 提前包含模块include: ['lodash/debounce','axios/dist/axios.min.js'],// 禁用预构建disabled: false}
}
2. 持久化缓存
# 手动锁定预构建版本
vite --force 
3. 依赖预编译
# 提前执行预构建
vite optimize --force
4. 冷启动加速方案
无变化
有变化
首次启动
生成预构建包
后续启动
检测变化
直接复用缓存
增量构建

七、常见问题解决方案

1. 循环依赖处理
// 手动指定入口
optimizeDeps: {entries: ['src/main.ts' // 明确入口文件]
}
2. 动态加载问题
// 手动包含动态依赖
optimizeDeps: {include: ['vue', 'vue > vue-router' // 嵌套依赖]
}
3. 缓存失效场景

在这里插入图片描述


总结:预构建的本质

原生ESM限制
浏览器并发请求瓶颈
模块规范混杂
统一ESM需求
构建性能要求
启动速度优化
预构建机制
现代前端工程化核心创新

技术哲学:用服务端构建成本换取浏览器运行效率,在开发体验和生产性能间取得平衡。随着原生ESM import maps等标准推进,预构建可能逐步弱化,但当前仍是Vite架构的基石。

相关文章:

  • BeckHoff <--> Festo Cmmt AS驱动器 EtherCat通讯
  • C++基础算法————二分查找
  • JavaScript 事件循环
  • CH579 CH573 CH582 CH592 蓝牙主机(Central)实例应用讲解(二)——Central消息事件机制初探
  • Python学习笔记面向对象编程
  • 钉钉机器人-自定义卡片推送快速入门
  • keil一键烧录boot和app程序
  • jojojojojo
  • Hexo-butterfly友情链接页面优化
  • MySQL-DQL数据查询语句深度解析与实战指南
  • 保护地线与串扰-信号完整性分析
  • day 51 python打卡
  • Redis事务与驱动的学习(一)
  • Unity Demo-3DRaceCar详解
  • MiniCPM4端侧AI模型
  • final在java中的作用
  • 清理 Docker 容器日志文件方法
  • 图的遍历模板
  • 嵌入式PADS中生产资料导出操作与实现
  • Python训练打卡Day50
  • 网站建设的市场有多大/宁德市教育局官网
  • 邢台做wap网站的公司/福州360手机端seo
  • 海外网站开发/武汉seo外包平台
  • 网站建设工作情况汇报/福州短视频seo平台
  • 没备案的网站/推广网站公司
  • 政府网站建设自查/网络产品运营与推广