vite和webpack的区别是什么

区别:1、webpack服务器启动速度比vite慢;由于vite启动的时候不需要打包,也就无需分析模块依赖、编译,所以启动速度非常快。2、vite热更新比webpack快;vite在HRM方面,当某个模块内容改变时,让浏览器去重新请求该模块即可。3、vite用esbuild预构建依赖,而webpack基于node。4、vite的生态不及webpack,加载器、插件不够丰富。

vite和webpack的区别是什么

本教程操作环境:windows7系统、vue3版,DELL G3电脑。

写在开头

最近的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";var _test = _interopRequireDefault(require("./test1.js"));function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }console.log(test1);' },  './test1.js':   { dependencies: { './test2.js': './test2.js' },     code:      '"use strict";var _test = _interopRequireDefault(require("./test2.js"));function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }console.log('this is test1.js ', _test["default"]);' },  './test2.js':   { dependencies: {},     code:      '"use strict";Object.defineProperty(exports, "__esModule", {  value: true});exports["default"] = void 0;function test2() {  console.log('this is test2 ');}var _default = test2;exports["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也就大概率意味着被大家慢慢开始接受了

总结

webpack服务器启动速度比vite慢

由于vite启动的时候不需要打包,也就无需分析模块依赖、编译,所以启动速度非常快。当浏览器请求需要的模块时,再对模块进行编译,这种按需动态编译的模式,极大缩短了编译时间,当项目越大,文件越多时,vite的开发时优势越明显

vite热更新比webpack快

vite在HRM方面,当某个模块内容改变时,让浏览器去重新请求该模块即可,而不是像webpack重新将该模块的所有依赖重新编译;

vite使用esbuild(Go 编写) 预构建依赖,而webpack基于nodejs, 比node快 10-100 倍

vite生态不及webpack,加载器、插件不够丰富

【相关推荐:vuejs视频教程、vuejs视频教程】

以上就是vite和webpack的区别是什么的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2922034.html

(0)
上一篇 2025年3月11日 18:34:20
下一篇 2025年2月26日 03:22:25

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue中用到es6特性有哪些

    特性:1、let和const关键字,用于声明变量;2、“for…of”循环,可迭代数据;3、Iterable,是实现可迭代协议的任何对象;4、Generator;5、默认参数;6、解构赋值语法,可以将属性/值从对象/数组中取出;7、剩余/展…

    2025年3月11日
    200
  • vue怎么在元素上增加样式

    增加方法:1、用“:class=”[‘类名’]”语句添加;2、用“:class=”[‘类名1′,’类名2’,{属性名(类名):’属性…

    2025年3月11日
    200
  • vue数据冻结有什么用

    在vue中,数据冻结“Object.freeze()”方法用于冻结对象,禁止对于该对象的属性进行修改(由于数组本质也是对象,因此该方法可以对数组使用)。对象冻结后,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不…

    2025年3月11日 编程技术
    200
  • .vue格式文件用什么软件打开

    可打开“.vue”格式文件的软件:1、webStorm,是一款JavaScript 开发工具;2、Visual Studio Code,是微软出的一款轻量级代码编辑器,免费而且功能强大,对JavaScript和NodeJS的支持非常好;3、…

    2025年3月11日
    200
  • vue的内置指令有哪些构成

    内置指令有16个:v-text、v-html、v-show、v-if、v-else、v-else-if、v-for、v-on、v-bind、v-model、v-slot、v-pre、v-cloak、v-once、v-memo、v-is;其中…

    2025年3月11日 编程技术
    200
  • vue路由有哪几种模式有什么区别

    vue路由有三种模式:Hash、History、Abstract。区别:1、hash模式的url路径会出现#字符,其他模式不会;2、hash值的改变会触发hashchange事件,其他模式不会;3、history模式整个地址重新加载,可以保…

    2025年3月11日
    200
  • vue3改了几个生命周期函数

    vue3改了4个生命周期函数。Vue3组合式api取消了beforeCreated和created钩子函数,采用steup钩子代替,且里面不能使用this。Vue3里面的组件销毁的钩子函数由destroyed和beforeDestroy换成…

    2025年3月11日
    200
  • vue插槽解决什么问题

    vue插槽解决的问题:引入的子组件标签中间不允许写内容的。插槽(Slot)是vue为组件的封装者提供的能力;允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽;可以把插槽认为是组件封装期间,为用户预留的内容的占位符。 本教程…

    2025年3月11日 编程技术
    200
  • vue的优缺点是什么?为什么使用它?

    优缺点是:简单、快速、强大、对模块友好;但不支持IE8,且对于搜索引擎不友好,会影响seo。使用原因:Vue是一款能降低开发成本、提升开发效率的工具,它能帮助开发者从繁琐的DOM操作中解脱出来;开发中设定好正确视图和数据的规则后,只需要关注…

    2025年3月11日
    200
  • vue项目中怎么用echarts

    使用方法:1、用“yarn add echarts”或“npm install echarts -S”或“cnpm install echarts -S”命令安装Echarts;2、在main.js中用“import echarts fro…

    2025年3月11日 编程技术
    200

发表回复

登录后才能评论