Vite 与 Webpack 的区别
在前端开发中,构建工具是不可或缺的,Webpack 和 Vite 是当前最流行的选择之一。尽管它们的目标相似,但在实现方式和开发体验上却有显著差异。本文将探讨 Vite 和 Webpack 的主要区别,以便于根据项目需求选择合适的工具。
1. 构建方式
1.1 Webpack
Webpack 是一个基于模块的打包工具,采用了传统的“打包”方式。在开发时,Webpack 会将所有模块打包到一起,经过一系列转换和优化,生成最终的文件。其构建过程大致分为三个阶段:
- 初始化阶段:设置配置参数,创建 Compiler 和 Compilation 对象,并初始化插件。
- 构建阶段:从入口文件开始,使用 Loader 转换文件,生成模块依赖关系图。
- 生成阶段:将模块拆分成不同的 Chunk,经过优化后生成最终产物。
1.2 Vite
Vite 则采用了“未打包”(unbundle)的开发模式。它利用浏览器原生对 ES 模块的支持,避免了在开发时的打包过程。Vite 的工作流程如下:
- 用户启动开发服务器后,Vite 通过中间件拦截请求,并对源文件进行解析、加载和转换。
- 模块之间的依赖关系由浏览器处理,而文件的转换则由 Vite 的开发服务器进行,并进行缓存。
2. 原生 ESM 支持
Vite 的核心优势之一是其对原生 ESM 的支持。在开发过程中,它依赖于浏览器直接加载模块,而不是通过打包的方式。这种方式虽然提升了开发速度,但在本地文件系统中直接打开 HTML 文件时可能会遇到跨域问题。
示例
为了避免 CORS 问题,通常需要通过 HTTP 服务器提供服务。例如,使用 Express.js 创建一个简单的服务器:
const express = require('express');
const app = express();
app.use(express.static('public')); // 'public' 是静态文件目录
app.listen(3000, () => console.log('Server is running on port 3000'));
运行此服务器后,可以通过 localhost:3000 访问应用,避免跨域问题。
3. 模块处理与性能
3.1 Webpack
Webpack 的强大在于其丰富的功能集,包括代码分割、按需加载、热模块替换(HMR)、Tree Shaking、Sourcemap、持久化缓存等。它能够处理复杂的依赖关系,并提供高度可定制的打包过程。
代码分割与动态导入
Webpack 支持代码分割,允许开发者将代码拆分为多个块,按需加载。例如,使用动态导入:
import(/* webpackChunkName: "home" */ './pages/Home.vue').then(module => {// 使用模块});
3.2 Vite
Vite 在开发模式下不执行打包,依赖浏览器处理模块。它的性能优势主要体现在:
- 快速启动:由于不需要打包,Vite 的开发服务器启动速度更快。
- 即时热更新:模块更新后,Vite 只需替换相关模块,而不是重新打包整个应用。
Vite 还支持代码分割,但主要是在生产构建时使用 Rollup 进行优化。
4. 缓存机制
4.1 Vite 的缓存
Vite 的缓存策略包括强缓存和协商缓存:
- 强缓存:对第三方依赖使用
Cache-Control: max-age=31536000, immutable,一旦命中,将不会发起请求。 - 协商缓存:通过
Last-Modified和Etag进行资源的版本控制,避免不必要的请求。
4.2 Webpack 的缓存
Webpack 也提供持久化缓存和模块联邦等特性,但由于开发时需要打包,冷启动时可能会较慢。在大型项目中,Webpack 的持久化缓存能够显著提升性能。
持久化缓存示例
Webpack 5 引入了持久化缓存,能够在再次构建时复用以前的构建结果。配置示例如下:
module.exports = {cache: {type: 'filesystem', // 使用文件系统缓存},// 其他配置...
};
5. 插件生态
5.1 Webpack 插件
Webpack 拥有成熟的插件生态,支持多种功能扩展,如:
- 代码压缩:
terser-webpack-plugin用于代码压缩和优化。 - 环境变量:
DefinePlugin用于定义环境变量。 - CSS 处理:
mini-css-extract-plugin用于提取 CSS。
5.2 Vite 插件
Vite 的插件系统也在快速发展,常见插件包括:
- @vitejs/plugin-vue:支持 Vue 3 的开发。
- vite-plugin-react:支持 React 的开发。
- vite-plugin-windicss:集成 Windi CSS。
示例配置
在 vite.config.js 中使用 Vue 插件:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';export default defineConfig({plugins: [vue()]
});
6. 开发体验
6.1 Vite 的开发体验
Vite 提供快速的开发体验,尤其是在小型项目中。其未打包模式使得开发过程更为灵活,支持热更新,减少了等待时间。Vite 的配置相对简单,适合快速上手。
6.2 Webpack 的开发体验
Webpack 的配置虽然灵活,但可能会变得复杂,尤其是在大型项目中。其强大的功能和插件生态使得开发者能够实现高度自定义的构建,但学习曲线较陡。
7. 适用场景
7.1 选择 Vite 的场景
- 小型或中型项目,尤其是需要快速迭代的应用。
- 需要使用现代 JavaScript 特性,如 ES 模块。
- 对开发速度和热更新体验有较高要求的项目。
7.2 选择 Webpack 的场景
- 大型项目,尤其是需要复杂构建配置的应用。
- 需要使用持久化缓存、模块联邦等高级特性。
- 需要精细控制资源管理和构建过程的场景。
8. 总结
8.1 开发体验
- Vite:由于其未打包模式,Vite 在开发时提供了更快的启动和热更新体验,适合小型和中型项目。
- Webpack:功能强大,适合需要复杂构建配置和优化的大型项目,尤其是在冷启动时提供更稳定的性能。
8.2 选择建议
- 对于简单项目或快速原型开发,建议使用 Vite。
- 对于大型应用或需要精细化控制的项目,Webpack 可能是更佳选择。
相关文章:
Vite 与 Webpack 的区别
在前端开发中,构建工具是不可或缺的,Webpack 和 Vite 是当前最流行的选择之一。尽管它们的目标相似,但在实现方式和开发体验上却有显著差异。本文将探讨 Vite 和 Webpack 的主要区别,以便于根据项目需求选择合适的工具。 1. 构建…...
基于32单片机的RS485综合土壤传感器检测土壤PH、氮磷钾的使用(超详细)
1-3为RS485综合土壤传感器的基本内容 4-5为基于STM32F103C8T6单片机使用RS485传感器检测土壤PH、氮磷钾并显示在OLED显示屏的相关配置内容 注意:本篇文件讲解使用的是PH、氮磷钾四合一RS485综合土壤传感器,但里面的讲解内容适配市面上的所有多合一的RS…...
【从零开始入门unity游戏开发之——C#篇11】一个标准 C# 程序介绍、新的值类型——枚举
文章目录 一、一个标准 C# 程序1、文件名(Program.cs):2、 using 语句:3、命名空间(namespace)4、类(class):4、入口函数(Main 方法)5、程序运行流…...
vue 签名校验 md5 uuid
import CryptoJS from crypto-js import uuid from /utils/uuid import { SECRET_KEY } from /utils/config // 签名校验 const nonceStr uuid.uuid() const timestamp new Date().getTime() // const sign CryptoJS.MD5(nonceStr nonceStr &secretKey SECRET_KEY …...
CSS系列(16)-- 架构与模式详解
前端技术探索系列:CSS 架构与模式详解 🏗️ 致读者:探索 CSS 架构的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 架构与设计模式,学习如何构建可维护的样式系统。 CSS 架构方法论 🚀 OO…...
【go语言】reflect包与类型推断
reflect 包的核心概念 Go 中的反射涉及两个核心概念: Type:表示一个类型的结构体,reflect.Type 是类型的描述。Value:表示一个值的结构体,reflect.Value 是一个具体值的包装。 反射让我们能够动态地访问对象的类型和…...
3.python运算符
Python 提供了多种运算符,用于执行算术、比较、逻辑等各种操作。以下是 Python 中常见的运算符类型及其用法: 文章目录 1. 算术运算符2. 比较运算符3. 逻辑运算符4. 赋值运算符5. 位运算符6. 成员运算符7. 身份运算符8. 运算符优先级 1. 算术运算符 算…...
【竞技宝】CS2-上海major:spirit力克MOUZ niko梦碎
北京时间2024年12月15日,CS2上海major正在如火如荼的进行中,昨日迎来两场半决赛MOUZ对阵spirit以及FAZE对阵G2。Spirit和MOUZ和各自赢下了自己的选图之后,spirit双子星在图三抗住压力帮助队伍杀入决赛。而G2和FAZE的比赛中,FAZE依然延续上一场的火热手感完全压制了G2,G2的明星选…...
【Leetcode 每日一题】3266. K 次乘运算后的最终数组 II
问题背景 给你一个整数数组 n u m s nums nums,一个整数 k k k 和一个整数 m u l t i p l i e r multiplier multiplier。 你需要对 n u m s nums nums 执行 k k k 次操作,每次操作中: 找到 n u m s nums nums 中的 最小 值 x x x&a…...
etcd集群常见日志
1、节点失去领导者 {"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"raft.node: 9afce9447872453 lost le…...
【漫话机器学习系列】005.神经网络的结构(architecture on the neural network)
神经网络(Neural Network)是一种模拟人脑神经系统的计算模型,由大量相互连接的神经元(节点)组成,广泛应用于深度学习和机器学习领域。以下是神经网络的基本结构及关键组成部分。 1. 神经网络的基本组成 一…...
基于 Couchbase 数据仓库元数据管理的可行性方案
在大数据体系中,元数据管理是数据治理的关键一环。以下是一套元数据管理的可行性方案,适合你的当前架构设计(基于 Couchbase 数据仓库)并支持高效管理数据的分层与结构。 1. 元数据管理的目标 统一数据管理:清晰描述 …...
SpringBoot:快速构建微服务应用
一、SpringBoot简介 什么是SpringBoot 是由Pivotal团队提供的快速开发框架。它基于Spring框架,可以用于快速构建微服务应用程序。SpringBoot提供了一种快速、便捷的方式来启动和配置一个基于Spring的应用程序,它封装了很多常用的配置,简化了开…...
汽车嵌入式软件构建高效技术团队的全面思考
在汽车嵌入式软件开发领域,构建一支高效的通用技术团队至关重要。这类团队负责为各种项目提供可复用、标准化的技术基石,从而提高开发效率、降低成本并确保产品质量。构建这样的团队需要从技术能力、角色分工、标准化与复用、流程管理与质量保证、工具和…...
【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列
文章目录 一、跨库方式1:跨库导航二、手动跨库查询三、同服务器:自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器:自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配…...
智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析
随着工业化程度的提高,生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间,人员误入或违规进入将带来严重的安全隐患。为了解决这一问题,迈尔微视推出了智能人体安全检测解决方案,为企业提供全方位的人员安全监…...
第24周:文献阅读
目录 摘要 Abstract 一、现有问题 二、提出方法 三、创新点 模型结构创新 强化学习与GAN结合 属性特征与通顺性优化 四、方法论 生成对抗网络(GAN) 强化学习(RL) 模型组件 五、实验研究 数据集 数据预处理 评价指…...
yolov8 转华为昇腾om脚本
目录 yolov8 转华为昇腾 om脚本 测试ok 推理demo: yolov8 转华为昇腾 om脚本 测试ok import sys import osos.chdir(os.path.dirname(os.path.abspath(__file__)))import torchcurrent_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(__file__)…...
分布式事物XA、BASE、TCC、SAGA、AT
分布式事务——Seata 一、Seata的架构: 1、什么是Seata: 它是一款分布式事务解决方案。官网查看:Seata 2.执行过程 在分布式事务中,会有一个入口方法去调用各个微服务,每一个微服务都有一个分支事务,因…...
域名信息收集(小迪网络安全笔记~
附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.1 域名信息收集 引子:上一章介绍了服务器的信息收集。本篇则介绍在面对存在Web资产企业时,其域名信息该如何收…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
