webpack 的工作流程
Webpack 的工作流程可以分为以下几个核心步骤,我将结合代码示例详细说明每个阶段的工作原理:
1. 初始化配置
Webpack 首先会读取配置文件(默认 webpack.config.js
),合并命令行参数和默认配置。
// webpack.config.js
module.exports = {entry: './src/index.js', // 入口文件output: { // 输出配置filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: { // 模块处理规则rules: [{ test: /\.js$/, use: 'babel-loader' },{ test: /\.css$/, use: ['style-loader', 'css-loader'] }]},plugins: [ // 插件配置new HtmlWebpackPlugin()]
};
2. 解析入口文件
从入口文件开始构建依赖图(Dependency Graph)。
// src/index.js
import { hello } from './utils.js';
import './styles.css';hello();
Webpack 会解析入口文件的 import
/require
语句,生成抽象语法树(AST):
// Webpack 内部伪代码
const entryModule = parseModule('./src/index.js');
const dependencies = entryModule.getDependencies(); // 获取依赖 ['./utils.js', './styles.css']
3. 递归构建依赖图
对每个依赖模块进行递归解析,形成完整的依赖关系树。
// Webpack 内部伪代码
function buildDependencyGraph(entry) {const graph = {};const queue = [entry];while (queue.length > 0) {const module = queue.pop();const dependencies = parseModule(module).getDependencies();graph[module] = {dependencies,code: transpile(module) // 使用 Loader 转换代码};queue.push(...dependencies);}return graph;
}
4. 使用 Loader 处理模块
根据配置的 Loader 对不同类型的文件进行转换。
// 当遇到 CSS 文件时
// 使用 css-loader 处理
module.exports = function(content) {// 将 CSS 转换为 JS 模块return `const css = ${JSON.stringify(content)};const style = document.createElement('style');style.textContent = css;document.head.appendChild(style);export default css;`;
};
5. 应用插件(Plugins)
在编译的不同阶段触发插件钩子。
// 自定义插件示例
class MyPlugin {apply(compiler) {compiler.hooks.emit.tap('MyPlugin', (compilation) => {console.log('资源生成完成,准备输出!');});}
}// 在配置中引用
plugins: [new MyPlugin()]
6. 代码优化与分块(Code Splitting)
根据配置进行代码分割。
// 动态导入示例
import(/* webpackChunkName: "utils" */ './utils').then(({ hello }) => {hello();
});// 输出结果:
// main.bundle.js
// utils.bundle.js (异步加载的 chunk)
7. 生成最终文件
将所有模块打包到一个或多个 bundle 中。
// Webpack 生成的 bundle 伪代码
(function(modules) {// Webpack 启动函数const installedModules = {};function __webpack_require__(moduleId) {// 模块缓存检查if (installedModules[moduleId]) {return installedModules[moduleId].exports;}// 创建新模块const module = installedModules[moduleId] = {exports: {}};// 执行模块函数modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);return module.exports;}// 加载入口模块return __webpack_require__("./src/index.js");
})({"./src/index.js": function(module, exports, __webpack_require__) {// 转换后的入口文件代码const utils = __webpack_require__("./src/utils.js");__webpack_require__("./src/styles.css");utils.hello();},"./src/utils.js": function(module, exports) {// 转换后的工具文件代码exports.hello = () => console.log("Hello Webpack!");}
});
8. 输出文件
将最终生成的 bundle 写入文件系统。
// Webpack 内部输出逻辑伪代码
const outputPath = path.resolve(config.output.path);
fs.writeFileSync(path.join(outputPath, config.output.filename),bundleCode
);
完整流程总结
- 初始化配置:合并配置参数
- 编译准备:创建
Compiler
对象 - 开始编译:从入口文件出发
- 模块解析:递归构建依赖图
- Loader 处理:转换非 JS 模块
- 插件干预:在关键生命周期执行插件
- 代码生成:生成运行时代码和模块闭包
- 输出文件:将结果写入目标目录
关键概念代码实现
模块解析器伪代码
class Module {constructor(filepath) {this.filepath = filepath;this.ast = null;this.dependencies = [];}parse() {const content = fs.readFileSync(this.filepath, 'utf-8');this.ast = parser.parse(content, { sourceType: 'module' });}collectDependencies() {traverse(this.ast, {ImportDeclaration: (path) => {this.dependencies.push(path.node.source.value);}});}
}
通过以上步骤,Webpack 完成了从源代码到最终打包文件的完整转换过程。实际项目开发中,可以通过调整配置文件的 entry
、output
、loader
和 plugins
来定制打包行为。
相关文章:
webpack 的工作流程
Webpack 的工作流程可以分为以下几个核心步骤,我将结合代码示例详细说明每个阶段的工作原理: 1. 初始化配置 Webpack 首先会读取配置文件(默认 webpack.config.js),合并命令行参数和默认配置。 // webpack.config.js…...
tcpdump 的用法
tcpdump 是一款强大的命令行网络抓包工具,用于捕获和分析网络流量。以下是其核心用法指南: 一、基础命令格式 sudo tcpdump [选项] [过滤表达式]权限要求:需 root 权限(使用 sudo) 二、常用选项 选项说明-i <接口…...
Agent杂货铺
零散记录一些Agent相关的内容。不成体系,看情况是否整理 ReAct ReAct 是一种实践代理模型的高级框架,通过将大语言模型(LLMs)的推理和执行行动的能力结合起来,增强了它们在处理复杂任务时的决策能力、适应性和与外部…...

【Redis】Redis的主从复制
文章目录 1. 单点问题2. 主从模式2.1 建立复制2.2 断开复制 3. 拓扑结构3.1 三种结构3.2 数据同步3.3 复制流程3.3.1 psync运行流程3.3.2 全量复制3.3.3 部分复制3.3.4 实时复制 1. 单点问题 单点问题:某个服务器程序,只有一个节点(只搞一个…...

第04章—技术突击篇:如何根据求职意向进行快速提升与复盘
经过上一讲的内容阐述后,咱们定好了一个与自身最匹配的期望薪资,接着又该如何准备呢? 很多人在准备时,通常会选择背面试八股文,这种做法效率的确很高,毕竟能在“八股文”上出现的题,也绝对是面…...

Quantum convolutional nerual network
一些问答 1.Convolution: Translationally Invariant Quasilocal Unitaries 理解? Convolution(卷积): 在量子信息或量子多体系统中,"卷积"通常指一种分层、局部操作的结构,类似于经典卷积神经网…...

RL之ppo训练
又是一篇之前沉在草稿箱的文章,放出来^V^ PPO原理部分这两篇就够了: 图解大模型RLHF系列之:人人都能看懂的PPO原理与源码解读人人都能看懂的RL-PPO理论知识 那些你或多或少听过的名词 actor-critic: actor表示策略,critic表示价值…...
AI云防护真的可以防攻击?你的服务器用群联AI云防护吗?
1. 传统防御方案的局限性 静态规则缺陷:无法应对新型攻击模式(如HTTP慢速攻击)资源浪费:固定带宽采购导致非攻击期资源闲置 2. AI云防护技术实现 动态流量调度算法: # 智能节点选择伪代码(参考群联防护…...

Docker封装深度学习模型
1.安装Docker Desktop 从官网下载DockerDesktop,安装。(默认安装位置在C盘,可进行修改) "D:\Program Files (x86)\Docker\Docker Desktop Installer.exe" install --installation-dir"D:\Program Files (x86)\Do…...

11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design
76个工业组件库示例汇总 参数化三维产品设计组件 (注塑模具与公差分析) 概述 这是一个交互式的 Web 组件,旨在演示简单的三维零件(如带凸台的方块)的参数化设计过程,并结合注塑模具设计(如开模动画)与公…...
4.4 os模块
os模块: chdir:修改工作路径 --- 文件所在位置的标识 getcwd():返回当前路径,如果修改了则显示修改后的路径 curdir:获取当前目录的表示形式 cpu_count():返回当前cpu的线程数 getppid(): 获取当前进程编号 getppid():获取当前进程的父进…...

OpenAI 30 亿收购 Windsurf:AI 编程助手风口已至
导语: 各位开发者同仁、产品经理伙伴们,从2024年起,一场由AI驱动的研发范式革命已然来临。Cursor等AI代码编辑器凭借与大语言模型的深度集成,正以前所未有的态势挑战,甚至颠覆着IntelliJ、VS Code等传统IDE的固有疆域。根据OpenRouter的API使用数据,Anthropic的Claude 3.…...
材料创新与工艺升级——猎板PCB引领高频阻抗板制造革命
在5G通信、AI服务器和自动驾驶的推动下,高频电路对信号完整性的要求日益严苛。猎板PCB作为国内高端PCB制造的标杆企业,通过材料创新与工艺革新,实现了阻抗控制的突破性进展,为行业树立了新标杆。 1. 高频材料的突破 传统FR-4基材…...
协议路由与路由协议
协议路由”和“路由协议”听起来相似,但其实是两个完全不同的网络概念。下面我来分别解释: 一、协议路由(Policy-Based Routing,PBR) ✅ 定义: 协议路由是指 根据预设策略(策略路由࿰…...

【linux】倒计时小程序、进度条小程序及其puls版本
小编个人主页详情<—请点击 小编个人gitee代码仓库<—请点击 linux系列专栏<—请点击 倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己! 目录 前言一、知识铺垫1. 回车换行2. 缓冲区 二、倒计时小程序1. 实现 三、进度条小…...
HTML难点小记:一些简单标签的使用逻辑和实用化
HTML难点小记:一些简单标签的使用逻辑和实用化 jarringslee 文章目录 HTML难点小记:一些简单标签的使用逻辑和实用化简单只是你的表象标签不是随便用的<div> 滥用 vs 语义化标签的本质嵌套规则的隐藏逻辑SEO 与可访问性的隐形关联 暗藏玄机的表单…...
FastAPI实现JWT校验的完整指南
在现代Web开发中,构建安全的API接口是开发者必须面对的核心挑战之一。随着FastAPI框架的普及,其异步高性能特性与Python类型提示的结合,为开发者提供了构建高效服务的强大工具。本文将深入探讨如何基于FastAPI实现JWT(JSON Web To…...

物流无人机结构与载货设计分析!
一、物流无人机的结构与载货设计模块运行方式 1.结构设计特点 垂直起降与固定翼结合:针对复杂地形(如山区、城市)需求,采用垂直起降(VTOL)与固定翼结合的复合布局,例如“天马”H型无人机&am…...
Linux 常用命令集合
以下是一份 Linux 常用命令集合,涵盖文件操作、系统管理、网络管理、权限管理、进程管理等常见任务,并附上代码示例: 1. 文件与目录操作 命令作用示例ls列出目录内容ls -l(详细列表) ls -a(显示隐藏文件&a…...
LoRA(Low-Rank Adaptation)原理详解
LoRA(Low-Rank Adaptation)原理详解 LoRA(低秩适应)是一种参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)技术,旨在以极低的参数量实现大模型在特定任务上的高效适配。其核心思想基于低秩分解假设,即模型在适应新任务时,参数更新矩阵具有低秩特性,可用少量参…...

【MySQL】表空间结构 - 从何为表空间到段页详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

[特殊字符] 免税商品优选购物商城系统 | Java + SpringBoot + Vue | 前后端分离实战项目分享
一、项目简介 本项目为一款功能完备的 免税商品优选购物商城系统,采用 Java 后端 Vue 前端的主流前后端分离架构,支持用户、商家、管理员三类角色,满足商品浏览、下单、商家管理、后台运营等多项功能,适用于实际部署或作为毕业设…...

图像处理基础与图像变换
一、目的 通过本次实验,加深对数字图像的理解,熟悉MATLAB中的有关函数;应用DCT对图像进行变换;熟悉图像常见的统计指标,实现图像几何变换的基本方法。 二、内容与设计思想 1、实验内容:选择两幅图像&…...
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions) 在 Python 中,条件表达式(conditional expressions)提供了一种简洁的方式来在一行中实现 if/else 的逻辑。它…...

并发笔记-锁(一)
文章目录 1. 基本问题与锁的概念 (The Basic Idea)2. 锁的API与Pthreads (Lock API and Pthreads)3. 构建锁的挑战与评估标准 (Building A Lock & Evaluating Locks)4. 早期/简单的锁实现尝试及其问题 (Early/Simple Attempts)4.1 控制中断 (Controlling Interrupts)4.2 仅…...

【Bootstrap V4系列】学习入门教程之 组件-媒体对象(Media object)
Bootstrap V4系列 学习入门教程之 组件-媒体对象(Media object) 媒体对象(Media object)一、Example二、Nesting 嵌套三、Alignment 对齐四、Order 顺序五、Media list 媒体列表 媒体对象(Media object) B…...
ALSTOM D-984-0721 自动化组件
ALSTOM D-984-0721是一款高性能自动化组件,专为电力行业、石化行业和一般自动化应用的苛刻环境而设计。该型号旨在提供卓越的可靠性和精度,因其强大的输入/输出能力、耐用性和无缝集成能力而脱颖而出,成为现代工业自动化系统不可或缺的工具。…...

2025数字中国创新大赛-数字安全赛道数据安全产业积分争夺赛决赛Writeup
文章目录 综合场景赛-模型环境安全-3综合场景赛-数据识别与审计-1综合场景赛-数据识别与审计-2综合场景赛-数据识别与审计-3 有需要题目附件的师傅,可以联系我发送 综合场景赛-模型环境安全-3 upload文件嵌套了多个png图片字节数据,使用foremost直接分离…...

无法更新Google Chrome的解决问题
解决问题:原文链接:【百分百成功】Window 10 Google Chrome无法启动更新检查(错误代码为1:0x80004005) google谷歌chrome浏览器无法更新Chrome无法更新至最新版本? 下载了 就是更新Google Chrome了...

数字孪生市场格局生变:中国2025年规模214亿,工业制造领域占比超40%
一、技术深度解析:数字孪生的核心技术栈与演进 1. 从镜像到自治:数字孪生技术架构跃迁 三维重建突破:LiDAR点云精度达2cm,无人机测深刷新频率5Hz,支撑杭州城市大脑内涝预警模型提前6小时预测。AI算法融合:…...