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

目录

  • [1,webpack 的流程](#1,webpack 的流程)
  • [2,Vite 的流程](#2,Vite 的流程)
  • 3,总结

主要对比开发阶段。

1,webpack 的流程

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

这样做的特点是:

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

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

初次打包时间 3866ms

二次打包 1733ms

2,Vite 的流程

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

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

初次打包

二次打包

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

  1. 当访问服务器地址时,会请求 index.html。
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,由开发服务器返回。

js 复制代码
// main.js 源代码
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

createApp(App).mount('#app')
  1. 在 main.js 中引入的模块,浏览器又会自动请求vue,style.css,App.vue,以此类推。

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

简单编译

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

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

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

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

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

3,总结

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

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

  3. 由于 vite 在启动的时候不需要打包,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快。

    当浏览器请求某个模块时,再根据需要对模块内容进行编译。这种按需动态编译的方式,极大的缩减了编译时间,项目越复杂、模块越多,vite的优势越明显。

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

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


以上。

相关推荐
原则猫7 小时前
UDP 到底怎么实现可靠的
前端
Java后端的Ai之路7 小时前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
裕晟资质规划9 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
ShineWinsu9 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
月夏9 小时前
Vue3 转 React:18 项对照表 + 5 个必踩的坑(附 7 天上手路线)
前端
广州华水科技9 小时前
单北斗GNSS位移监测系统的应用与维护解析
前端
梦曦i9 小时前
uni-storage 0.1.0 发布:TTL过期管理+多实例隔离
前端·storage·uni-app x
猫头_10 小时前
AI 流式传输工程指南:模型吐出半截 JSON,前端如何边收边渲染?
前端·javascript·llm
console.log('npc')11 小时前
第 1 章 项目概述与环境搭建
前端·人工智能·大模型
定栓11 小时前
Webpack迁到Vite第七节(二):全家桶移除 — Babel 全家桶深度分析
前端·webpack·node.js