当前位置: 首页 > news >正文

Webpack 是如何工作的?

🧑‍💻 写在开头

点赞 + 收藏 === 学会🤣🤣🤣

这是一个极简版的 Webpack 打包原理演示。

为了让你一眼看懂,我去掉了所有复杂的缓存检查、异步加载和辅助函数,只保留最核心的 “模块注册表”require 函数”

🎯 核心逻辑:Webpack 是如何工作的?

Webpack 打包后的本质就是一个 自执行函数(IIFE) ,它做了两件事:

  1. 把所有文件代码存进一个对象里(键是文件名,值是函数)。
  2. 实现一个简单的 require 函数,用来从这个对象里取代码并执行。

💻 简化版 Demo 代码

假设这是 dist/bundle.js 的核心内容:

// ==========================================
// 1. Webpack 启动引导 (Bootstrap)
// ==========================================
(function(modules) { // modules 参数就是下面那个巨大的对象,包含所有文件代码// 【核心】模拟 require 函数function __webpack_require__(moduleId) {// 1. 检查模块是否已经执行过 (缓存),这里简化省略缓存逻辑// 2. 从 modules 对象中取出对应的模块函数var module = modules[moduleId];// 3. 创建一个空的 exports 对象,用于接收模块导出的内容var exports = {};// 4. 执行模块函数!//    把 exports 和 __webpack_require__ 传进去//    模块内部通过操作 exports 来导出变量module(exports, __webpack_require__);// 5. 返回导出的内容return exports;}// 【启动】执行入口文件 (假设 index.js 的 ID 是 './src/index.js')__webpack_require__('./src/index.js');})({// ==========================================// 2. 模块注册表 (所有源文件都在这里)// =========================================='./src/a.js': function(exports, __webpack_require__) {// --- 原始代码: export function sayHelloA() ... ---// Webpack 将 export 转换为对 exports 对象的赋值exports.sayHelloA = function() {console.log("Hello from A");};},'./src/b.js': function(exports, __webpack_require__) {// --- 原始代码: export function sayHelloB() ... ---exports.sayHelloB = function() {console.log("Hello from B");};},'./src/index.js': function(exports, __webpack_require__) {// --- 原始代码: import { sayHelloA } from './a.js' ---// Webpack 将 import 转换为调用 __webpack_require__var a = __webpack_require__('./src/a.js');var b = __webpack_require__('./src/b.js');// 调用导入的函数a.sayHelloA();b.sayHelloB();console.log("App Finished");}
});

🔍 原理解析 (3 步走)

第一步:包裹 (Wrap)

Webpack 把你的每个文件 (a.js, b.js, index.js) 都塞进一个函数里。
这个函数接收两个参数:

  • exports: 用来存放你要导出的东西。
  • __webpack_require__: 用来引入别的文件。

第二步:收集 (Collect)

所有包裹好的函数,被放进一个大对象 modules 里。

  • Key: 文件路径 (如 './src/a.js')
  • Value: 包裹后的函数

第三步:执行 (Execute)

  1. Webpack 立即调用最外层的函数,传入 modules 对象。

  2. 它调用 __webpack_require__('./src/index.js') 启动程序。

  3. index.js 运行到 require('./src/a.js') 时:

    • modules 对象里找到 './src/a.js' 对应的函数。
    • 创建一个空对象 {} 作为 exports
    • 执行该函数,此时 exports 被填入了 sayHelloA
    • 把填好的 exports 返回给 index.js
  4. 最终,所有依赖按顺序执行完毕。

🚀 总结

Webpack 并没有真的让浏览器支持 import/export,它是通过闭包和对象映射,在浏览器里“模拟”了一套 CommonJS 风格的模块系统

  • 源码: import a from './a'
  • 打包后: var a = __webpack_require__('./src/a.js')

这就是模块化打包的魔法所在。

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

http://www.jsqmd.com/news/414213/

相关文章:

  • 500元微信立减金回收94折,猎卡回收解锁高价门道 - 京回收小程序
  • 华为昇腾NPU上运行pytorch —— 使用torch_npu进行模型迁移
  • 基础算法题解一览
  • LeetCode 每日一题 #21:合并两个有序链表|Python 递归与迭代双解法
  • 电力巡检无人机选哪家?核心维度、Top5厂家推荐与场景化选型指南 - 深度智识库
  • 2026年 杭州叉车厂家推荐排行榜:电动叉车与内燃叉车专业选购指南,实力品牌深度解析 - 品牌企业推荐师(官方)
  • 2026 国产真空炉 感应加热设备 高频感应加热设备 中频感应加热设备 高频焊机全攻略:五大品牌排行、选购技巧与口碑推荐 - 深度智识库
  • 2026年全国航空货运哪家靠谱?实力强口碑好 适配各类空运需求 覆盖全国各类空运场景 - 深度智识库
  • 安川机器人遇见的问题汇总
  • 2026川渝滇黔污水处理药剂厂家优质推荐榜 - 优质品牌商家
  • 2026年评价高的无添加红糖公司推荐:养生红糖、原汁红糖、原汁黄冰糖、古法红糖、孕妇可食红糖、手工红糖选择指南 - 优质品牌商家
  • 电力巡检无人机Top5揭晓:谁在定义智能电网的“空中之眼”? - 深度智识库
  • 2026WMS系统客观测评:如何选择适配的仓库管理系统 - 深度智识库
  • 潮玩一番赏小程序玩法分析(附开发者技术落地与合规要点)
  • 分析颜语堂考研数学,专业靠谱吗,费用大概多少钱? - 工业品牌热点
  • 2026年2月日化车间净化厂家推荐,专业制造与品牌保障口碑 - 品牌鉴赏师
  • 2026年口碑好的面粉生产成套设备厂家推荐,专业企业全解析 - mypinpai
  • 2026年Q1,寻找可靠数显/游标卡尺产地的企业选型指南 - 2026年企业推荐榜
  • Webpack entry深度解析
  • 说说倍克朗专业吗,泳池漆费用及选购要点分析 - 工业品网
  • 2026年2月压铆机中心厂家推荐,五金加工配套设备指南 - 品牌鉴赏师
  • 组里有个P7,为了防止被裁,把核心计费模块的代码写得晦涩难懂,还加了自定义的混淆逻辑,甚至不提交Git, 结果CTO直接招了个外包团队
  • 销售电主轴/丝杆/转台的平台网站有哪些?如何选择适合自己的? - 品牌推荐大师1
  • 联合省选 R1
  • 这次终于选对!断层领先的AI论文软件 —— 千笔ai写作
  • 交换系统评估:把控接入路由质量、需求匹配度与配置合规性
  • 看完就会:风靡全网的AI论文软件 —— 千笔·专业学术智能体
  • 2026年红糖公司权威推荐:孕妇可食红糖/手工红糖/手工黄冰糖/无添加红糖/无添加黄冰糖/正宗黄冰糖/选择指南 - 优质品牌商家
  • 运行标准:企业落地资源分配、传输策略与负载均衡规范
  • 五大卡尺定制厂家综合实力对比分析(2026年2月更新) - 2026年企业推荐榜