首页 > 其他分享 >浅析Vite本地构建原理

浅析Vite本地构建原理

时间:2024-06-20 20:00:14浏览次数:25  
标签:文件 vue 构建 Vite ESM 浅析 vite

前言

随着Vue3的逐渐普及以及Vite的逐渐成熟,我们有必要来了解一下关于vite的本地构建原理。

对于webpack打包的核心流程是通过分析JS文件中引用关系,通过递归得到整个项目的依赖关系,并且对于非JS类型的资源,通过调用对应的loader将其打包编译生成JS 代码,最后再启动开发服务器。

了解到webpack的耗时主要花费在打包上,Vite选择跳过打包,直接以 原生 ESM 方式提供源码,这样岂不是可以非常快!

与webpack对比

Vite官网有两张对比图能够非常直观的对比两者的区别。

这张图代表的是基于打包器的构建方式(webpack就是其中之一),它在启动服务之前,需要从入口开始扫描整个项目的依赖关系,然后基于依赖关系构建整个应用生成bundle,最后才会启动开发服务器。 这就是这类构建方式为什么慢的原因,并且整个构建时间会随着项目的变大变的越来越长!

这张图代表的是基于ES Module的构建方式(比如:Vite),这张图是不是能够很直观说明为什么Vite会非常快,因为它上来就直接启动开发服务器,然后在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码,即只在当前页面上实际使用时才会被处理。

也就是它不需要扫描整个项目并且打包,不打包的话那它是如何让浏览器拿到分散在项目中的各个模块呢?

这一切都要得益于浏览器支持ESM的模块化方案,当浏览器识别到模块内的 ESM 方式导入的模块时,会自动去帮我们查找对应的内容

这就是为什么vite项目的模版文件中的script标签需要加上type=module,而webpack项目不需要。

<script type="module" src="/src/main.ts"></script>

vite快的原因

其实上面已经能够说明vite为什么会比webpack快了,但还有另外一个点在上图中并没有表现出来。

Vite会在一开始将项目中的所有模块分为源码依赖两类

  • 源码指的是我们自己写的代码,这类代码可能需要转换(例如 JSX,CSS 或者 Vue/Svelte 组件),并且时常会被编辑。Vite 会以 原生 ESM 方式提供源码,同时并不是所有的源码都需要同时被加载(例如基于路由拆分的代码模块)。
  • 依赖大多为在开发时不会变动的纯 JavaScript。一些较大的依赖(例如有上百个模块的组件库)处理的代价也很高。依赖也通常会存在多种模块化格式(例如 ESM 或者 CommonJS)。Vite 将会使用 esbuild预构建依赖。esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。

总结来说就是:基于ESM模块化方案 + 预构建

使用预构建的原因

Vite使用依赖预构建的原因主要有以下两点:

  • 兼容CommonJS与UMD:在开发阶段中,Vite 的开发服务器将所有代码视为原生 ES 模块。因此,Vite 必须先将以 CommonJS 或 UMD 形式提供的依赖项转换为 ES 模块。
  • 性能:为了提高后续页面的加载性能,Vite将那些具有许多内部模块的 ESM 依赖项转换为单个模块。

可以来看个例子:

我们引入lodash-es工具包中的debounce方法,此时它理想状态应该是只发出一个请求

import  { debounce }  from 'lodash-es'

事实也是这样

但这是预构建的功劳,如果我们对lodash-es关闭预构建呢?

vite配置文件加上如下代码,再来试试:

// vite.config.js
optimizeDeps: {
    exclude: ['lodash-es']
  }

可以看到,此时发起了600多个请求,这是因为lodash-es 有超过 600 个内置模块!

vite通过将 lodash-es 预构建成单个模块,只需要发起一个HTTP请求!可以很大程度地提高加载性能

基本原理

跟着debug来一步一步看vite本地是如何工作的

首先从package.json出发,找到项目启动命令:

可以看到,dev对应的命令直接就是vite,然后我们再找到node_modules下面的vite下面的bin文件夹下面的vite.js文件,这就是vite运行的入口文件。

这里有一个start方法,从这打上断点开始慢慢往下走,就能够知道整个运行的基本原理

从上面我们知道,vite首先是会启动一个本地服务,基于该服务对文件的请求进行处理返回

接着往下走,我们可以看到有一个处理url的方法,此时运行栈里面的address变量也能够看到是127.0.0.1:5173,这就是我们等会要访问的本地服务,当然现在浏览器还什么也看不到,因为还没开始处理/路由,该路由需要返回一个html文件,也就是我们的模版文件(项目基于Vue3)

继续往下走,就可以看到有一个applyHtmlTransforms方法用来处理html文件并返回,可以看到当前请求的原始路径是/,返回的文件是项目根目录下的index.html文件

里面有一个脚本文件<script type="module" src="/src/main.ts"></script>,接下来就该请求并处理入口文件main.ts

main.ts文件如下:

import { createApp } from 'vue'
// import './style.css'
import  { debounce }  from 'lodash-es'

console.log('--lodash--', debounce)
import App from './App.vue'

createApp(App).mount('#app')

经过处理之后变成了:

它其实也没做啥处理,只是把依赖的引用路径处理成了预构建下的路径(.vite/deps/),把源码的引用路径处理成了绝对路径。

标签:文件,vue,构建,Vite,ESM,浅析,vite
From: https://www.cnblogs.com/songyao666/p/18259444

相关文章

  • 食品安全无小事:EasyCVR+AI技术助力食品加工厂管理透明化,构建食品安全防线
    一、背景需求近期有新闻记者曝光某省禽类屠宰加工厂脏乱差问题严重,工人脚踩鹅肠鸭肠混杂洗地水、烟头随手扔进鸭肠筐、污水捞出死鸭再上生产线…卫生情况十分堪忧。食品卫生安全频频出现负面新闻,如何实现源头治理?如何将各类食品安全风险隐患消灭在萌芽状态?随着社会的不断发展和......
  • 智慧城市低空+AI视频智能监控:构建新时代安全防线
    随着科技的飞速发展,智能监控技术已经广泛应用于各个领域,从城市治理到工业生产,从公共安全到环境监测,都发挥着越来越重要的作用。而在低空领域,AI视频智能监控方案的建设更是成为了一个热点话题。一、低空AI视频智能监控方案的特点低空AI视频智能监控方案的核心在于结合无人机、摄......
  • 构建网络图 (JavaScript)
    前序:在工作中难免有一些千奇百怪的需求,如果你遇到构建网络图,或者学习应对未来,请看这边文章,本文以代码为主。网络图是数据可视化中实用而有效的工具,特别适用于说明复杂系统内的关系和连接。这些图表有助于理解各种背景下的结构,从社交网络到企业层级。在本教程中,我们将深入研究......
  • 构建高效的大数据量延迟任务调度平台
    目录引言系统需求分析系统架构设计总体架构任务调度模块任务存储模块任务执行模块任务调度算法时间轮算法优先级队列分布式锁数据存储方案关系型数据库NoSQL数据库混合存储方案容错和高可用性主从复制数据备份与恢复故障转移性能优化水平扩展缓存机制异步处理监......
  • 数据提取与治理:构建企业数据战略的基石
    数据提取与治理:构建企业数据战略的基石在当今这个数字化时代,数据已成为企业竞争的核心资产。一个强大的数据战略不仅能够为企业带来深刻的市场洞察,还能驱动业务决策,提升运营效率。而数据提取与治理,正是构建这一战略不可或缺的基石。数据提取:解锁企业数据潜力的关键数据提取,......
  • 技术革新引领钢材质量智能化检测新纪元,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3sp
    随着人工智能(AI)技术的迅猛发展,其应用领域不断拓宽,正深刻改变着传统产业的运作模式。在钢材生产这一基础工业领域,AI的引入正为钢材的质量检测带来革命性的变革。在传统的钢材生产流程中,质量检测是确保产品质量的关键环节。然而,这一环节长期以来主要依赖于经验丰富的工人通过肉......
  • 免构建安装 nginx php-fpm 快速运行 php 项目
    文档说明:只记录关键地方;发布时间:2024-06-20需求:linux、macos环境下,免构建安装nginxphp-fpm快速运行php项目运行环境:linux、macos状态:已完成实现原理:静态编译nginx、php-fpm下载nginx、php-fpm脚本和运行时gitclonehttps://gitee.com/jingjingxy......
  • npm ERR! network request to https://registry.npmmirror.com/create-vite failed,
    npmERR!networkrequesttohttps://registry.npmmirror.com/create-vitefailed,  npmverbnpmv9.5.1npmERR!codeETIMEDOUTnpmERR!syscallconnectnpmERR!errnoETIMEDOUTnpmERR!networkrequesttohttps://registry.npmmirror.com/create-vitefailed,reas......
  • Jenkins教程-4-gitlab自动化测试任务构建
    上一小节我们学习了Jenkins构建github自动化测试任务的方法,本小节我们讲解一下公司gitlab自动化测试任务的构建方法。接下来我们以Mac系统为例,讲解一下构建实际自动化测试任务的具体步骤。安装git和gitlab插件点击进入Jenkins插件管理页面安装完插件,http://localhost:8......
  • 在AMD GPUs上构建解码器Transformer模型
    BuildingadecodertransformermodelonAMDGPU(s)—ROCmBlogs在这篇博客中,我们展示了如何使用PyTorch2.0和ROCm在单个节点上的单个和多个AMDGPU上运行AndrejKarpathy精美的PyTorch重新实现的GPT。我们使用莎士比亚的作品来训练我们的模型,然后进行推理,看看我们的模......