vite和webpack的区别

2023-09-14 22:31:22

1、前言

WebpackVite是现代前端开发中非常重要的工具,有助于改善开发者的工作流程和提高生产力。从底层原理上来说,Vite是基于esbuild预构建依赖。而esbuild是采用go语言编写,因为go语言的操作是纳秒级别,而js是以毫秒计数,所以vite比用js编写的打包器快10-100倍。下面这篇博客将对比WebpackVite的区别,并探讨在什么样的项目中选择哪一个工具。

2、Webpack

2.1 Webpack简述

Webpack是一个模块打包工具,使得工程中的各种资源能够被打包成一个整体的bundle.js文件。Webpack具有很高的可配置性和灵活性,使得开发者可以使用各种插件和配置文件来优化它们的工作流程。Webpack适用于大型、复杂的项目,它可以处理多种不同类型的文件(如jscss、图片等),并根据需求进行转换、压缩和打包。但是,Webpack的配置可能比较复杂,需要花费一定的时间和精力进行学习和调试。

webpack原理图:

在这里插入图片描述

2.2 Webpack常用插件

html-webpack-plugin:将一个页面模板打包到dist目录下,默认都是自动引入js or css;

clean-webpack-plugin:用于每次打包dist目录删除;
extract-text-webpack-plugin:将css样式从js文件中提取出来最终合成一个css文件,该插件只支持webpack4之前的版本,如果你当前是webpack4及以上版本那么就会报错;
mini-css-extract-plugin:该插件与上面的exract-text-webpack-plugin的一样,都是将css样式提取出来, 唯一就是用法不同,本插件的webpack4版本之后推荐使用;
webpack.optimize.CommonsChunkPlugin:用于将页面里的公共代码提取出来,从而进行优化加载速度,该CommonsChunkPlugin只支持Webpack4之前;
optimization.SplitChunks:该功能与上面的webpack.optimize.CommonsChunkPlugin一样,只不过optimization.SplitChunks是webpack4之后推荐使用的;
DefinePlugin:用于注入全局变量,一般用在环境变量上;
ProvidePlugin:用于定义全局变量,如100个页面都引入vue,每个页面都引入只会增加工作量,直接在webpackProvide挂载一个变量就行,不用再去一一引入;
hot-module-replacement-plugin:开启热模块更新;
IgnorePlugin:用于过滤打包文件,减少打包体积大小;
uglifyjs-webpack-plugin:用于压缩js文件,针对webpack4版本以上;
copy-webpack-plugin:用于将文件拷贝到某个目录下;
optimize-css-assets-webpack-plugin:用于压缩css样式;
imagemin-webpack-plugin:用于压缩图片;
friendly-errors-webpack-plugin:美化控制台,良好的提示错误;

3、Vite

3.1 Vite简述

Vite是一个快速、轻量级的现代Web开发构建工具,它利用现代浏览器的原生ES模块加载功能,实现了开发环境中的快速冷重载和构建速度。Vite的开发体验非常好,因为它能够在开发时实时更新页面,而不需要对整个项目进行重新构建。相比于Webpack的构建过程,Vite的开发速度更快,也更适合小型、简单的项目。但是,Vite目前还不支持像Webpack那样的插件生态系统,因此其可扩展性还有待提高。

Vite原理图:

在这里插入图片描述

3.2 Vite插件推荐

Vite 是一个功能强大的开发构建工具,在插件方面也有很多的选择。以下是一些常用的 Vite 插件库推荐:

@vitejs/plugin-vue :官方提供的 Vue 插件,用于在 Vite 中编译 Vue 单文件组件。
unplugin-vue-components :一个可插拔的 Vue 组件库,支持按需加载、自动导入组件等。
vite-plugin-postcss :一个 PostCSS 插件,可以在 Vite 中使用 PostCSS 进行 CSS 预处理。
vite-plugin-style-import :一个样式导入插件,支持在 VueReact 等框架中按需加载样式文件。
vite-plugin-typescript :官方提供的 TypeScript 插件,用于在 Vite 中编译 TypeScript 文件。
vite-tsconfig-paths :一个 TypeScript 路径别名插件,可以在 Vite 中使用路径别名。
vite-plugin-md :一个 Markdown 插件,用于在 Vite 中编译 Markdown 文件。
vite-plugin-eslint :一个 ESLint 插件,可以在 Vite 中使用 ESLint 进行代码检查。

4、区别

4.1 开发模式不同

  • Webpack在开发模式下依然会对所有模块进行打包操作,虽然提供了热更新,但大型项目中依然可能会出现启动和编译缓慢的问题;
  • Vite则采用了基于ES Module的开发服务器,只有在需要时才会编译对应的模块,大幅度提升了开发环境的响应速度。

4.2 打包效率不同

  • Webpack在打包时,会把所有的模块打包成一个bundle,这会导致初次加载速度较慢;
  • Vite则利用了浏览器对ES Module的原生支持,只打包和缓存实际改动的模块,从而极大提高了打包效率。

4.3 插件生态不同

  • Webpack的插件生态非常丰富,有大量社区和官方插件可以选择,覆盖了前端开发的各个方面;
  • Vite的插件生态尽管在不断发展,但相比Webpack来说还显得较为稀少。

4.4 配置复杂度不同

  • Webpack的配置相对复杂,对新手不够友好;
  • Vite在设计上更注重开箱即用,大部分场景下用户无需自己写配置文件。

4.5 热更新机制不同

  • Webpack的热更新需要整个模块链重新打包和替换,对于大型项目可能会有延迟;
  • Vite的热更新则只会针对改动的模块进行更新,提高了更新速度

5、总结

综上所述,ViteWebpack 都是构建 Web 应用的工具,它们在开发模式、打包效率、插件生态、配置复杂度和热更新机制方面存在差异。如果你的应用程序规模较大,那么 Webpack 可能更适合你;如果你想要更快的开发和调试速度,那么 Vite 则是更好的选择。

更多推荐

数据分析的-五种常用方法实例

一、对照俗称对比,单独看一个数据是不会有感觉的,必需跟另一个数据做对比才会有感觉。比如下面的图a和图b。图a毫无感觉图b经过跟昨天的成交量对比,就会发现,今天跟昨天实则差了一大截。这是最基本的思路,也是最重要的思路。在现实中的应用非常广,比如选产品丶监控增量等,这些过程就是在做【对照】,决策BOSS们拿到数据后,如果数

websocket php教程

WebSocket是HTML5提供的一种网络通讯协议,用于服务端与客户端实时数据传输。广泛用于浏览器与服务器的实时通讯,APP与服务器的实时通讯等场景。相比传统HTTP协议请求响应式通讯,WebSocket协议可以做到实时的双向通讯,服务端可以在任何时候向客户端推送数据(HTTP协议需要客户端发起请求后才能推送)。PH

Spring高手之路14——深入浅出:SPI机制在JDK与Spring Boot中的应用

文章目录1.SPI解读:什么是SPI?2.SPI在JDK中的应用示例3.SPI在Spring框架中的应用3.1传统Spring框架中的SPI思想3.2SpringBoot中的SPI思想4.SPI在JDBC驱动加载中的应用5.如何通过SpringBoot自动配置理解SPI思想6.SPI(ServiceProviderIn

Ajax学习笔记

目录Ajax介绍Ajax概述同步异步原生Ajax演示AxiosAxios的基本使用Axios快速入门Axios请求方法别名Axios案例Ajax介绍Ajax概述我们前端页面中的数据应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序,所以必须涉及到2个程序的交互

Golang net/http 包中的 RoundTripper 接口详解

RoundTripper是什么?RoundTripper是net/http包中的一个接口,定义了处理HTTP请求返回和响应的方法,是http.Client结构体中执行http请求的核心部分。接口定义如下:typeRoundTripperinterface{RoundTrip(*Request)(*Response,er

深入分析Spring的IoC容器:从底层源码探索

前言:博主在最近的几次面试中,大中小厂都问到了Spring的ioc容器相关问题,这块知识确实是面试中的重点内容,因此结合所看的书籍,在这篇文章中总结下。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读,感谢大佬的关注。如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~小威在此先感谢各位小伙

Flink窗口

窗口(Window)6.1.1窗口的概念Flink是一种流式计算引擎,主要是来处理无界数据流的,数据源源不断、无穷无尽。想要更加方便高效地处理无界流,一种方式就是将无限数据切割成有限的“数据块”进行处理,这就是所谓的“窗口”(Window)。注意:Flink中窗口并不是静态准备好的,而是动态创建——当有落在这个窗口区间

OpenCV自学笔记二十一:视频处理

一、VideoCapture类在OpenCV中,`VideoCapture`类提供了一系列函数来读取和控制视频流。以下是一些常用的`VideoCapture`类函数说明:1.`isOpened()`:检查视频是否成功打开。返回一个布尔值,True表示成功打开,False表示未成功打开。2.`open(filenameo

React 窗口防抖_ 提升网页性能的利器

React窗口防抖是一种优化网页性能的技术,它能够有效地减少浏览器中不必要的渲染和计算,从而提高网页的响应速度和用户体验。在本文中,我们将探讨React窗口防抖的原理、应用场景以及如何在你的React项目中使用它。引言随着互联网的发展,越来越多的网页应用需要处理大量的数据和复杂的交互逻辑。而这些复杂的操作往往会导致网页

深度学习修炼(三)卷积操作 | 边界填充、跨步、多输入输出通道、汇聚池化

文章目录1.卷积基本操作2现代卷积进阶武器操作2.1边界填充2.2跨步步幅2.3多输入输出通道2.4汇聚池化3.卷积层设计之前我们讲了线性分类器深度学习修炼(一)线性分类器|权值理解、支撑向量机损失、梯度下降算法通俗理解_Qodi的博客-CSDN博客又讲了基于线性分类器的全连接神经网络深度学习修炼(二)全连接神经网络|

ElasticSearch从入门到精通(一)

1.初识ElasticSearch传统数据库查询的问题:如果使用模糊查询,左边有通配符,不会走索引,全表扫描,效率比较慢倒排索引将文档进行分词,形成词条和id的对应关系即为反向索引。以唐诗为例,所处包含“前”的诗句正向索引:由《静夜思》-->窗前明月光--->“前”字反向索引:“前”字-->窗前明月光-->《静夜思》反

热文推荐