前端打包工具简单介绍
前端打包工具简单介绍
一、Webpack 架构与插件机制
1. Webpack 架构核心组成
-
Entry(入口)
指定应用的起点文件,比如 src/index.js。 -
Module(模块)
Webpack 把项目当作模块图,模块可以是 JS、CSS、图片等。 -
Loader(加载器)
负责模块的预处理,比如 Babel 转译、CSS 预处理,Webpack 自身只识别 JS 和 JSON,其他类型靠 Loader 转换。 -
Plugin(插件)
插件用来扩展 Webpack 功能,比如打包优化、资源管理等。插件通过生命周期钩子影响构建过程。 -
Chunk(块)
由模块组成的代码块,Webpack 通过代码分割生成多个 Chunk。 -
Bundle(包)
最终生成的一个或多个文件,供浏览器加载。
2. Webpack 工作流程
-
从 Entry 开始,构建依赖图。
-
递归解析模块依赖。
-
Loader 转换文件内容。
-
Plugin 钩子运行,注入功能。
-
Chunk 生成。
-
Bundle 输出
3、Webpack 基本配置示例
// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js', // 入口output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'), // 输出目录clean: true,},module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: 'babel-loader', // 转译ES6+},{test: /\.css$/,use: ['style-loader', 'css-loader'], // 处理CSS},],},plugins: [new HtmlWebpackPlugin({template: './public/index.html', // 模板文件}),],mode: 'development',devtool: 'source-map', // Source Map 支持devServer: {static: './dist',hot: true, // HMR支持},
};
二、Vite 原理与内部实现(包含 esbuild 与 Rollup)
1. Vite 设计理念
-
开发时:利用浏览器原生 ES 模块,启动快,修改文件只热更新。
-
构建时:用 Rollup 或 Rspack 做打包,兼顾速度与功能
2. 开发模式
-
使用 esbuild 预构建依赖(node_modules),极大提升启动速度。
-
源码不打包,按需请求原始模块,浏览器负责解析。
-
通过 WebSocket 实现 HMR(热模块替换)
3. 构建模式
-
使用 Rollup 进行生产构建,保证代码优化、Tree-shaking 和代码分割。
-
未来支持用 Rspack 或 Rolldown 替代 Rollup 提升性能
4. esbuild 的作用
-
基于 Go 语言实现的超快编译器。
-
Vite 用它做依赖预构建和某些转换。
-
速度快,但功能和插件生态比 Rollup 差
5. Rollup 基本配置示例
// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';export default {input: 'src/index.js',output: {file: 'dist/bundle.js',format: 'esm', // 输出ES模块sourcemap: true,},plugins: [resolve(), // 处理node_modulescommonjs(), // 处理CommonJS模块babel({ babelHelpers: 'bundled', exclude: 'node_modules/**' }),],
};
参数详解
- input
入口文件,告诉 Rollup 从哪里开始打包。 - output.file
打包后的文件路径。 - output.format
指定输出格式,如 ‘esm’(ES模块)、‘cjs’(CommonJS)、‘iife’(立即执行函数)等。 - output.sourcemap
是否生成 Source Map。 - plugins
插件数组,用来扩展 Rollup 的功能,类似 Webpack 的 loader + plugin。
6. esbuild 基本配置示例
// build.js
const esbuild = require('esbuild');esbuild.build({entryPoints: ['src/index.js'],bundle: true,outfile: 'dist/bundle.js',minify: false,sourcemap: true,target: ['es2020'],loader: {'.js': 'jsx','.css': 'css',},
}).catch(() => process.exit(1));
以上参数详解
- entryPoints
指定入口文件。 - bundle
是否将所有依赖打包到一个文件。 - outfile
输出文件路径。 - minify
是否压缩输出文件。 - sourcemap
是否生成调试用的 source map。 - target
输出的 JS 代码目标版本。 - loader
自定义不同后缀文件如何加载,esbuild 自带对多种格式的支持。
7. Vite 基本配置示例
// vite.config.js
import { defineConfig } from 'vite';export default defineConfig({root: 'src', // 项目根目录build: {outDir: '../dist', // 输出目录sourcemap: true,},server: {port: 3000,open: true,},
});
三、现代构建工具性能对比(含 Rolldown、Rspack)
工具 | 实现语言 | 启动速度 | 构建速度 | 插件生态 | 适用场景 |
---|---|---|---|---|---|
Webpack | JS | 较慢 | 慢 | 丰富 | 复杂大型项目 |
Rollup | JS | 中 | 较快 | 丰富 | 库打包 |
esbuild | Go | 非常快 | 非常快 | 少 | 快速原型,依赖预构建 |
Rspack | Rust | 快 | 快 | 正在完善 | Webpack 替代 |
Rolldown | Rust | 预期快 | 预期快 | 兼容 Rollup | Rollup 的 Rust 重写版 |
四、现代打包工具常用特性与概念介绍
1. 代码分割 (Code Splitting)
- 作用:将打包后的代码拆分成多个小块(chunk),按需加载,提高页面首屏加载速度。
- Webpack 和 Rollup 都支持动态导入 import(),实现按需加载。
- Vite 和 esbuild 也支持基于 Rollup 的代码分割。
- Rspack 和 Rolldown 也具备类似特性
2. Tree Shaking
- 作用:自动移除代码中未被使用的导出,减小打包体积。
- Rollup 是 Tree Shaking 的先驱,支持 ES6 模块静态分析。
- Webpack 也支持,前提是使用 ES6 模块语法。
- esbuild、Vite 和其他现代工具均支持 Tree Shaking
3. 热模块替换(HMR)
- 作用:在开发过程中,修改代码后,自动替换页面中的模块,而不是刷新整个页面。
- Webpack 的 webpack-dev-server 提供 HMR。
- Vite 内置极速的 HMR,性能很高。
- Rspack 也支持 HMR,且兼容 Webpack 配置
4. Loader 与 Plugin
- Loader(只存在于 Webpack 和 Rspack):负责预处理文件(如转译、打包 CSS、图片等)。
- Plugin:扩展构建流程功能,所有工具都支持插件机制,但实现形式略有不同。
- Rollup、Vite、Rolldown 插件通常基于 Rollup 插件生态
5. 静态资源处理
-
现代打包工具支持对图片、字体、音视频等资源进行处理:
-
小文件可以内联为 base64。
-
大文件自动拷贝到输出目录并生成带哈希的文件名,支持缓存。
-
-
Webpack 通过 asset 模块类型处理。
-
Vite 内置支持静态资源导入。
-
esbuild 也支持静态资源加载
6. 环境变量和模式
- 通过环境变量注入不同配置,如 development 和 production 模式。
- Webpack 通过 DefinePlugin 注入。
- Vite 支持 .env 文件和内置的 import.meta.env。
- Rollup 和 esbuild 也可以通过插件或脚本实现
7. 多入口和多页面支持
- 适合复杂项目、多页面应用(MPA)。
- Webpack 支持多入口配置,结合 HtmlWebpackPlugin 可以输出多页面。
- Rollup 和其他工具更倾向于库打包,MPA 需额外配置。
- Vite 支持通过 build.rollupOptions.input 配置多入口
8. 构建缓存与增量构建
- 通过缓存机制提升构建速度。
- Webpack 和 Rspack 支持持久化缓存。
- esbuild 本身极快,增量构建表现优异。
- Vite 利用 esbuild 和 Rollup,速度也很快
9. Source Map
- 帮助调试打包后的代码,映射回源码。
- 生产环境和开发环境可配置是否生成,避免暴露源码。
- 常用类型如 source-map、eval-source-map、cheap-module-source-map 等
相关文章:
前端打包工具简单介绍
前端打包工具简单介绍 一、Webpack 架构与插件机制 1. Webpack 架构核心组成 Entry(入口) 指定应用的起点文件,比如 src/index.js。 Module(模块) Webpack 把项目当作模块图,模块可以是 JS、CSS、图片等…...

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...

STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...

持续交付的进化:从DevOps到AI驱动的IT新动能
文章目录 一、持续交付的本质:从手动到自动的交付飞跃关键特性案例:电商平台的高效部署 二、持续交付的演进:从CI到AI驱动的未来发展历程 中国…...
Linux信号保存与处理机制详解
Linux信号的保存与处理涉及多个关键机制,以下是详细的总结: 1. 信号的保存 进程描述符(task_struct):每个进程的PCB中包含信号相关信息。 pending信号集:记录已到达但未处理的信号(未决信号&a…...

OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...

LeetCode - 148. 排序链表
目录 题目 思路 基本情况检查 复杂度分析 执行示例 读者可能出的错误 正确的写法 题目 148. 排序链表 - 力扣(LeetCode) 思路 链表归并排序采用"分治"的策略,主要分为三个步骤: 分割:将链表从中间…...

多模态大语言模型arxiv论文略读(110)
CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文标题:CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文作者:Hidehisa Arai, Keita Miwa, Kento Sasaki, Yu Yamaguchi, …...

React、Git、计网、发展趋势等内容——前端面试宝典(字节、小红书和美团)
React React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么,Fiber架构,面试向面试官介绍,详细解释 用户: React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么,Fiber架构,面试向面试官介绍&#x…...

Web APIS Day01
1.声明变量const优先 那为什么一开始前面就不能用const呢,接下来看几个例子: 下面这张为什么可以用const呢?因为复杂数据的引用地址没变,数组还是数组,只是添加了个元素,本质没变,所以可以用con…...

关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...

Linux系统:进程间通信-匿名与命名管道
本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道(Pipe)是一种进程间通信(IPC, Inter-Process Communication)机制,用于在不…...

使用python进行图像处理—图像变换(6)
图像变换是指改变图像的几何形状或空间位置的操作。常见的几何变换包括平移、旋转、缩放、剪切(shear)以及更复杂的仿射变换和透视变换。这些变换在图像配准、图像校正、创建特效等场景中非常有用。 6.1仿射变换(Affine Transformation) 仿射变换是一种…...

使用homeassistant 插件将tasmota 接入到米家
我写一个一个 将本地tasmoat的的设备同通过ha集成到小爱同学的功能,利用了巴法接入小爱的功能,将本地mqtt转发给巴法以实现小爱控制的功能,前提条件。1需要tasmota 设备, 2.在本地搭建了mqtt服务可, 3.搭建了ha 4.在h…...
VUE3 ref 和 useTemplateRef
使用ref来绑定和获取 页面 <headerNav ref"headerNavRef"></headerNav><div click"showRef" ref"buttonRef">refbutton</div>使用ref方法const后面的命名需要跟页面的ref值一样 const buttonRef ref(buttonRef) cons…...

【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境
如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境? 在 Python 开发中,为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具,能高效创建不同 Python 版本的 Poetry 虚拟环境,接下来…...

多模态学习路线(2)——DL基础系列
目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...

[10-1]I2C通信协议 江协科技学习笔记(17个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17...

AWSLambda之设置时区
目标 希望Lambda运行的时区是东八区。 解决 只需要设置lambda的环境变量TZ为东八区时区即可,即Asia/Shanghai。 参考 使用 Lambda 环境变量...

RFID推动新能源汽车零部件生产系统管理应用案例
RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域,电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式,存在单点位单独头溯源、网关布线…...

[C++错误经验]case语句跳过变量初始化
标题:[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...

Unity-ECS详解
今天我们来了解Unity最先进的技术——ECS架构(EntityComponentSystem)。 Unity官方下有源码,我们下载源码后来学习。 ECS 与OOP(Object-Oriented Programming)对应,ECS是一种完全不同的编程范式与数据架构…...

uni-app学习笔记二十七--设置底部菜单TabBar的样式
官方文档地址:uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容,通常写在项目的App.vue的onLaunch方法中,用于项目启动时立即执行 重要参数: indexnumber是tabBar 的哪一项&…...

7种分类数据编码技术详解:从原理到实战
在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类…...

【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练
本项目提出了ContentV框架,通过三项关键创新高效加速基于DiT的视频生成模型训练: 极简架构设计,最大化复用预训练图像生成模型进行视频合成系统化的多阶段训练策略,利用流匹配技术提升效率经济高效的人类反馈强化学习框架&#x…...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案
文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下,数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统,还是初创…...

可视化预警系统:如何实现生产风险的实时监控?
在生产环境中,风险无处不在,而传统的监控方式往往只能事后补救,难以做到提前预警。但如今,可视化预警系统正在改变这一切!它能够实时收集和分析生产数据,通过直观的图表和警报,让管理者第一时间…...

多模态大语言模型arxiv论文略读(112)
Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题:Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者:Jea…...

【向量库】Weaviate概述与架构解析
文章目录 一、什么是weaviate二、High-Level Architecture1. Core Components2. Storage Layer3. 组件交互流程 三、核心组件1. API Layer2. Schema Management3. Vector Indexing3.1. 查询原理3.2. 左侧:Search Process(搜索流程)3.3. 右侧&…...
PostgreSQL 对 IPv6 的支持情况
PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议,包括连接、存储和操作 IPv6 地址。以下是详细说明: 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置: listen_addresses 0.0.0.0,:: # 监听所有IPv4…...