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

前端面试宝典---vite原理解析

开发过程

1. 启动开发服务器

2. 依赖预构建

如果:有metaData.json文件就说明之前以及预构建过了
否则:扫描第三方依赖并对其进行预构建,并把每个第三方库变成ESM格式以及打成一个包

在这里插入图片描述

下面是vite官网自己的描述
vite 执行时所做的“依赖预构建”。这个过程有两个目的:

  1. CommonJS 和 UMD 兼容性: 在开发阶段中,Vite 的开发服务器将所有代码视为原生 ES 模块。因此,Vite 必须先将以 CommonJS 或 UMD 形式提供的依赖项转换为 ES 模块。
    在转换 CommonJS 依赖项时,Vite 会进行智能导入分析,这样即使模块的导出是动态分配的(例如 React),具名导入(named imports)也能正常工作:
  2. 性能: 为了提高后续页面的加载性能,Vite 将那些具有许多内部模块的 ESM 依赖项转换为单个模块。有些包将它们的 ES 模块构建为许多单独的文件,彼此导入。例如,lodash-es 有超过 600 个内置模块!当我们执行 import { debounce } from ‘lodash-es’ 时,浏览器同时发出 600 多个 HTTP 请求!即使服务器能够轻松处理它们,但大量请求会导致浏览器端的网络拥塞,使页面加载变得明显缓慢。
    通过将 lodash-es 预构建成单个模块,现在我们只需要一个HTTP请求!

3. 请求资源拦截编译

原因:

  1. 对于esm是不支持 import {createApp} from ‘vue’,它只认识绝对或者相对路径
  2. 浏览器只认识js文件,而不认识vue文件
  1. 对浏览器请求进行拦截
  2. 判断是否有缓存,有的话直接返回,没有则执行步骤3
  3. 处理文件路径为系统文件路径
  4. 对不同文件进行解析成浏览器认识的js css格式
    在这里插入图片描述

热更新

在构建例如App.vue文件时,会注入一段热更新代码如下:

import.meta.hot = __vite__createHotContext("/node_modules/reset.css/reset.css");
import {updateStyle as __vite__updateStyle, removeStyle as __vite__removeStyle} from "/@vite/client"
const __vite__id = "G:/FE_code/vue3/cesium-test/node_modules/reset.css/reset.css"
const __vite__css = "/* http://meyerweb.com/eric/tools/css/reset/ \n   v2.0 | 20110126\n   License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed, \nfigure, figcaption, footer, header, hgroup, \nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfont-size: 100%;\n\tfont: inherit;\n\tvertical-align: baseline;\n}\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure, \nfooter, header, hgroup, menu, nav, section {\n\tdisplay: block;\n}\nbody {\n\tline-height: 1;\n}\nol, ul {\n\tlist-style: none;\n}\nblockquote, q {\n\tquotes: none;\n}\nblockquote:before, blockquote:after,\nq:before, q:after {\n\tcontent: '';\n\tcontent: none;\n}\ntable {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}"
__vite__updateStyle(__vite__id, __vite__css)
import.meta.hot.accept()
import.meta.hot.prune( () => __vite__removeStyle(__vite__id))

vite 支持热更新功能,在开发过程中只针对编辑了的文件进行更新,而不需要整个页面重新构建,内部的原理是使用了 websocket机制。

http://www.xdnf.cn/news/12067.html

相关文章:

  • Numpy——结构化数组和Numpy文件
  • 【电赛培训课程】电子设计竞赛工程基础知识
  • 使用qt 定义全局钩子 捕获系统的键盘事件
  • 《人性的弱点》核心总结
  • AI基础认知
  • 【Python连接数据库基础 06】Pandas与SQL协同:解锁大规模数据处理新境界,让分析效率飙升10倍
  • 代理IP:6G标准化进程中的隐形推手
  • 如何在 React 中监听 div 的滚动事件
  • Pendulum:优雅处理 Python 中的日期与时间
  • vue3动态插入iframe,内容被取消的原因
  • pack 布局管理器
  • 第十三节:第三部分:集合框架:Map集合的遍历方式
  • 数码相片冲印规格参考表
  • Docker load 后镜像名称为空问题的解决方案
  • 国芯思辰ADE芯片成功替代ADS1296R,除颤仪核心部件实现自主可控
  • git删除本地分支和远程分支
  • 非对称加密
  • MuLogin浏览器如何使用Loongproxy?
  • 【AI系列】DPO 与 PPO 的比较与分析
  • 民锋视角下的资金流效率与账户行为建模
  • 解决fastadmin、uniapp打包上线H5项目路由冲突问题
  • Netty内存池之内存分配算法
  • 字符串接龙
  • Java 大视界 — Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制
  • 未来的AI 终端
  • 系统性学习C语言-第十四讲-深入理解指针(4)
  • 《仿盒马》app开发技术分享-- 商品搜索页(顶部搜索bar热门搜索)(端云一体)
  • 中级统计师-经济学基础知识-第一章 经济学基础
  • android与Qt类比
  • 重要通知:6月申报纳税期限延至6月16日(附2025年办税日历 图文版)