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

Vite 的基本原理,和 webpack 在开发阶段的比较

目录

  • 1,webpack 的流程
  • 2,Vite 的流程
    • 简单编译
  • 3,总结

主要对比开发阶段。

1,webpack 的流程

开发阶段大致流程:指定一个入口文件,对相关的模块(js css img 等)先进行打包,接着启动一个开发服务器,浏览器请求时返回打包后的文件。

以 vue-cli 创建的项目为例

这样做的特点是:

  1. 如果项目比较大,依赖项比较多,打包速度会降低,会影响到启动速度
  2. 热更新时,被修改模块所依赖的其他模块都会重新打包。

以 vue-cli 创建的项目为例:

初次打包时间 3866ms

在这里插入图片描述

二次打包 1733ms

在这里插入图片描述

2,Vite 的流程

并不会先打包文件,而是直接启动开发服务器(使用的 koa),所以无论项目多大,启动速度都不太会受到影响

以 Vite 创建的项目为例,虽然现在看和 webpack 的差距没有很大,但项目越大越明显!

初次打包

在这里插入图片描述

二次打包

在这里插入图片描述

Vite 拿到所有的资源的步骤如下:

  1. 当访问服务器地址时,会请求 index.html
<!doctype html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" type="image/svg+xml" href="/vite.svg" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Vite + Vue</title></head><body><div id="app"></div><script type="module" src="/src/main.js"></script></body>
</html>

注意到 script 使用了 type="module",所以浏览器会自动请求对应的模块 main.js,由开发服务器返回。

// main.js 源代码
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'createApp(App).mount('#app')
  1. main.js 中引入的模块,浏览器又会自动请求vuestyle.cssApp.vue,以此类推。

注意,在开发阶段,虽然 Vite 比 webpack 发送的请求还多,但这是在本地发送的请求,速度极快,至少比 webpack 打包的速度快。

在这里插入图片描述

简单编译

值得注意的是,开发服务器会对请求的内容做一些简单的编译后返回,比如:

  1. js 文件,会对路径做变化。这样做的目的是,方便开发服务器寻找对应的内容。

在这里插入图片描述

2,css 文件,会将 css 编译为字符串,并将 css 文件处理为 ESModule 的形式。

在这里插入图片描述

3,vue 组件,也编译为纯 js,并且还是 ESModule 。

同时该组件中,还会再次请求带后缀的同名 vue 文件,这是 vue 编译 css 的结果。

在这里插入图片描述

3,总结

  1. webpack 会先打包,再启动开发服务器,浏览器请求服务器时直接返回打包结果。
    vite 是直接启动开发服务器,浏览器请求哪个模块,再对该模块进行实时编译。

  2. 由于现代浏览器本身就支持 ES Module,会自动向依赖的 Module 发出请求。而vite充分利用这一点,将开发环境下的模块文件,作为浏览器要执行的文件(所以 vite 项目中不可以使用 CommonJS),而不是像 webpack 那样进行打包合并。

  3. 由于 vite 在启动的时候不需要打包,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快。
    当浏览器请求某个模块时,再根据需要对模块内容进行编译。这种按需动态编译的方式,极大的缩减了编译时间,项目越复杂、模块越多,vite的优势越明显。

  4. 在HMR方面,vite 在改动了一个模块后,仅需让浏览器重新请求该模块即可,不像 webpack 那样需要把该模块的相关依赖模块全部编译一次,效率更高。

  5. 当需要打包到生产环境时,vite 使用传统的 rollup 打包,因此 vite 的主要优势在开发阶段。


以上。

http://www.lryc.cn/news/219694.html

相关文章:

  • [开源]免费开源MES系统/可视化数字大屏/自动排班系统
  • python如何使用gspread读取google在线excel数据?
  • 线程同步——互斥量解锁、解锁
  • 数据结构(c语言版) 顺序表
  • Springboot 集成 RocketMq(入门)
  • Elasticsearch:ES|QL 中的数据丰富
  • 【linux编程】linux文件IO高级I/O函数介绍和代码示例
  • jQuery获取地址栏GET参数值
  • JAVA应用中线程池设置多少合适?
  • .Net Core 3.1 解决数据大小限制
  • 【音视频 | opus】opus编码的Ogg封装文件详解
  • 【微信小程序】自定义组件(一)
  • 如何通过一条数字人三维动画宣传片,打造出数字文旅
  • 【MongoDB】索引 - 数组字段的多键索引
  • 2023.11.5 关于 Spring 创建 和 使用
  • 3D目标检测实战 | 图解KITTI数据集评价指标AP R40(附Python实现)
  • 制作一个ros2机器人需要学习的课本(还不全面)
  • Qt OpenGL相机系统
  • 英语语音识别,语言评测,语音打分实践与代码实现
  • 【SpringBoot篇】SpringBoot整合Mybatis实战
  • android c++ 硬编码硬解码官方demo
  • Python之Excel数据相关
  • Ubuntu网络IP地址一直显示127.0.0.1
  • Vulnhub-DC-3 靶机复现完整过程
  • Dubbo篇---第三篇
  • Redis-使用java代码操作Redis->java连接上redis,java操作redis的常见类型数据存储,redis中的项目应用
  • react 使用笔记
  • Ubuntu下启动Apache对.htaccess 的支持步骤, 利用.htaccess绑定域名到子目录
  • C++常用格式化输出
  • QCC TX 音频输入切换+提示声音