Vite 和Webpack 的核心差异

Vite 和Webpack 的核心差异写在开头最近的 vite 比较火 而且发布了 2 0 版本 vue 的作者也是在极力推荐在之前的文章里面我提到过 vite 的缺点在于目前的生态不够 webpack 成熟 但是只要能弥补这个缺点 便有很大

写在开头

  • 最近的vite比较火,而且发布了2.0版本,vue的作者也是在极力推荐
  • 在之前的文章里面我提到过,vite的缺点在于目前的生态不够webpack成熟,但是只要能弥补这个缺点,便有很大概率能替代目前webpack的大部分市场

全方位对比vite和webpack

webpack打包过程
  • 1.识别入口文件
  • 2.通过逐层识别模块依赖。(Commonjs、amd或者es6的import,webpack都会对其进行分析。来获取代码的依赖)
  • 3.webpack做的就是分析代码。转换代码,编译代码,输出代码
  • 4.最终形成打包后的代码
webpack打包原理
  • 1.先逐级递归识别依赖,构建依赖图谱
  • 2.将代码转化成AST抽象语法树
  • 3.在AST阶段中去处理代码
  • 4.把AST抽象语法树变成浏览器可以识别的代码, 然后输出

重点:这里需要递归识别依赖,构建依赖图谱。图谱对象就是类似下面这种

{ './app.js':    { dependencies: { './test1.js': './test1.js' },      code:       '"use strict";\n\nvar _test = _interopRequireDefault(require("./test1.js"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }\n\nconsole.log(test 1);' },   './test1.js':    { dependencies: { './test2.js': './test2.js' },      code:       '"use strict";\n\nvar _test = _interopRequireDefault(require("./test2.js"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }\n\nconsole.log(\'th is is test1.js \', _test["default"]);' },   './test2.js':    { dependencies: {},      code:       '"use strict";\n\nObject.defineProperty(exports, "__esModule", {\n  value: true\n});\nexports["default"] = void 0;\n\nfunction test2() {\n  console.log(\'this is test2 \');\n}\n\nvar _default = tes t2;\nexports["default"] = _default;' } }  

Vite 和Webpack 的核心差异

vite原理
  • 当声明一个 script 标签类型为 module 时

如:

 
    
   
    
    
    
    
     
    
  • 浏览器就会像服务器发起一个GET
http://localhost:3000/src/main.js请求main.js文件:

// /src/main.js:
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
  • 浏览器请求到了main.js文件,检测到内部含有import引入的包,又会对其内部的 import 引用发起 HTTP 请求获取模块的内容文件
  • 如:GET http://localhost:3000/@modules/vue.js
  • 如:GET http://localhost:3000/src/App.vue
  • Vite 的主要功能就是通过劫持浏览器的这些请求,并在后端进行相应的处理将项目中使用的文件通过简单的分解与整合,然后再返回给浏览器,vite整个过程中没有对文件进行打包编译,所以其运行速度比原始的webpack开发编译速度快出许多!
webpack缺点一。缓慢的服务器启动
  • 当冷启动开发服务器时,基于打包器的方式是在提供服务前去急切地抓取和构建你的整个应用。
vite改进
  • Vite 通过在一开始将应用中的模块区分为 依赖 和 源码 两类,改进了开发服务器启动时间。
  • 依赖 大多为纯 JavaScript 并在开发时不会变动。一些较大的依赖(例如有上百个模块的组件库)处理的代价也很高。依赖也通常会以某些方式(例如 ESM 或者 CommonJS)被拆分到大量小模块中。
  • Vite 将会使用 esbuild 预构建依赖。Esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。
  • 源码 通常包含一些并非直接是 JavaScript 的文件,需要转换(例如 JSX,CSS 或者 Vue/Svelte 组件),时常会被编辑。同时,并不是所有的源码都需要同时被加载。(例如基于路由拆分的代码模块)。
  • Vite 以 原生 ESM 方式服务源码。这实际上是让浏览器接管了打包程序的部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入的代码,即只在当前屏幕上实际使用时才会被处理。
webpack缺点2.使用的是node.js去实现

Vite 和Webpack 的核心差异

vite改进
  • Vite 将会使用 esbuild 预构建依赖。Esbuild 使用 Go 编写,并且比以 Node.js 编写的打包器预构建依赖快 10-100 倍。
webpack致命缺点3.热更新效率低下
  • 当基于打包器启动时,编辑文件后将重新构建文件本身。显然我们不应该重新构建整个包,因为这样更新速度会随着应用体积增长而直线下降。
  • 一些打包器的开发服务器将构建内容存入内存,这样它们只需要在文件更改时使模块图的一部分失活[1],但它也仍需要整个重新构建并重载页面。这样代价很高,并且重新加载页面会消除应用的当前状态,所以打包器支持了动态模块热重载(HMR):允许一个模块 “热替换” 它自己,而对页面其余部分没有影响。这大大改进了开发体验 – 然而,在实践中我们发现,即使是 HMR 更新速度也会随着应用规模的增长而显著下降。
vite改进
  • 在 Vite 中,HMR 是在原生 ESM 上执行的。当编辑一个文件时,Vite 只需要精确地使已编辑的模块与其最近的 HMR 边界之间的链失效(大多数时候只需要模块本身),使 HMR 更新始终快速,无论应用的大小
  • Vite 同时利用 HTTP 头来加速整个页面的重新加载(再次让浏览器为我们做更多事情):源码模块的请求会根据 304 Not Modified 进行协商缓存,而依赖模块请求则会通过 Cache-Control: max-age=31536000,immutable 进行强缓存,因此一旦被缓存它们将不需要再次请求。
vite缺点1.生态,生态,生态不如webpack
  • wepback牛逼之处在于loader和plugin非常丰富,不过我认为生态只是时间问题,现在的vite,更像是当时刚出来的M1芯片Mac,我当时非常看好M1的Mac,毫不犹豫买了,现在也没什么问题
vite缺点2.prod环境的构建,目前用的Rollup
  • 原因在于esbuild对于css和代码分割不是很友好
vite缺点3.还没有被大规模使用,很多问题或者诉求没有真正暴露出来
  • vite真正崛起那一天,是跟vue3有关系的,当vue3广泛开始使用在生产环境的时候,vite也就大概率意味着被大家慢慢开始接受了

总结

  • Vite,就像刚出来的M1芯片Mac,都说好,但是一开始买的人不多,担心生态问题,后面都说真香
  • 相信vue3作者的大力支持下,vite即将大放异彩!
  • 我已经在我自己项目的生产环境中,开始使用vite!

写在最后

最后

  1. 点个「在看」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)
  2. 欢迎加我微信「huab119」拉你进技术群,长期交流学习…
  3. 关注公众号「前端劝退师」,持续为你推送精选好文,也可以加我为好友,随时聊骚。

Vite 和Webpack 的核心差异

Vite 和Webpack 的核心差异

点个在看支持我吧,转发就更好了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227306.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:36
下一篇 2026年3月16日 下午9:36


相关推荐

  • 【sklearn】利用sklearn训练LDA主题模型及调参详解

    【sklearn】利用sklearn训练LDA主题模型及调参详解sklearn 不仅提供了机器学习基本的预处理 特征提取选择 分类聚类等模型接口 还提供了很多常用语言模型的接口 LDA 主题模型就是其中之一 本文除了介绍 LDA 模型的基本参数 调用训练以外 还将提供两种 LDA 调参的可行策略 供大家参考讨论 考虑到篇幅 本文将略去 LDA 原理证明部分

    2026年3月17日
    22
  • 数据挖掘应用实例分析

    数据挖掘应用实例分析数据挖掘应用实例分析——个性化推荐系统​ 数据挖掘技术,一门基于计算机技术与大数据时代信息处理需求的技术产物,从世纪之交的火热发展以来,不知不觉间,早已应用到我们生活的方方面面:电子邮箱中的垃圾邮件分类、电影院的票房预测、网页上的广告推荐、语音识别、电网语义精确搜索等。还有人工智能、自然语言处理、数据修正等。我们认为,数据挖掘技术将成为互联网时代应用最广泛的技术之一,它有可能为人类社会带来一个新的时代。​ 但是由于笔者才疏学浅,今天我们暂不谈得那么高深,只分析的一个常见的应用实例——个性化推荐系统。

    2022年6月15日
    33
  • 利用instsrv和srvany来手动安装服务

    利用instsrv和srvany来手动安装服务Windows提供了两个小工具instsrv.exe和srvany.exe来把任何应用包装成windows服务。顾名思义instsrv(installservice)是用来安装服务的,而srvany(serviceanything)包装任何服务的外壳。下载instsrv.exe和srvany.exe.由于nginx的windows应用没有服务,使用起来不太方便,这里趁机利用一下把nginx…

    2022年6月6日
    86
  • 计算机专业相关的创意产品,计算机产品创意设计大赛策划.doc

    计算机专业相关的创意产品,计算机产品创意设计大赛策划.doc计算机产品创意设计大赛策划西南科技大学 2014 年计算机产品创意设计大赛项目承办实施策划书项目名称 计算机产品创意设计大赛承办单位 计算机科学与技术学院承办时间 2014 年 11 月 2015 年 1 月西南科技大学计算机产品创意设计大赛工作策划书附 创意设计表一 活动背景大学生科技创新活动是夯实素质 HYPERLINK class free 17 1 shtml 教育的重要途径和有效手段

    2026年3月17日
    2
  • Springboot优点总结

    Springboot优点总结谈到 SpringBoot 就让我们先来了解它的优点 依据官方的文档 SpringBoot 的优点如下 创建独立的 Spring 应用程序 嵌入的 Tomcat Jetty 或者 Undertow 无须部署 WAR 文件 允许通过 Maven 来根据需要获取 starter 尽可能地自动配置 Spring 提供生产就绪型功能 如指标

    2026年3月17日
    2
  • MySql性能测试

    MySql性能测试

    2021年5月23日
    157

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号