webpack原理篇(五十六):webpack流程:模块构建和chunk生成阶段

简介: webpack原理篇(五十六):webpack流程:模块构建和chunk生成阶段

说明

玩转 webpack 学习笔记



Compiler hooks


流程相关:


  • (before-)run
  • (before-/after-)compile
  • make
  • (after-)emit
  • done

监听相关:


  • watch-run
  • watch-close



Compilation


Compiler 调用 Compilation 生命周期方法


  • addEntry -> addModuleChain (添加入口)
  • finish (上报模块错误)
  • seal (输出优化)


上一节到了run这里,下面看一下 compile


7a1fde14f64a44039261bbe087af2979.png

这里就会执行到 hooks.make

5a07069a56ed4a958346417d0e6032dc.png


查看哪些监听了 make

grep "hooks.make" -rn ./node_modules/webpack

ebb92d3a960642cabb6700b8b61d74a5.png


找到 my-project\node_modules\webpack\lib\SingleEntryPlugin.js 40 行,执行 addEntry 方法 make 构建阶段正式开始

33cb300562ee4ce69878f8acf4facbfa.png


模块构建好就会触发 my-project\node_modules\webpack\lib\Compilation.js 里的 finish 方法,这里的 module 就是处理之后的源码


d8ce56fb233a48f598aba064237756c9.png


模块构建


ModuleFactory

const NormalModuleFactory = require("./NormalModuleFactory");
const ContextModuleFactory = require("./ContextModuleFactory");


NormalModuleFactory :直接导出摸个函数的

ContextModuleFactory:有路径的

a713918b16a34579829bb4f581280f12.png


40ec17736b844afd8bd7bd59d48c3d4b.png


Module

2db39133ed99499fb17acc4ff16fb2c5.png


NormalModule


Build:

  • 使用 loader-runner 运行 loaders
  • 通过 Parser 解析 (内部是 acron)
  • 通过 ParserPlugins 添加依赖


创建完一个 NormalModule 之后的构建,找到开始构建某个模块的 build-module


dc0271b9788e4f7b8a1618016788ad19.png


9d8f8b8f1fb740b5b274c10ceb82a613.png


接下来看一下 module.build 做了什么

const { getContext, runLoaders } = require("loader-runner");


96068a8beeb24f249112cbbb3ba76580.png


执行完 doBuild 之后就会解析

65ea7a4b56ca4a649045585c67cfa340.png


my-project\node_modules\webpack\lib\Parser.js 使用了 acorn,目的是把代码里的 require 依赖添加到模块依赖列表里面去。

8c56c074fb0946e09bbefd8ad9b213f2.png


最后进入 seal 阶段。



Compilation hooks


模块相关:

   build-module

   failed-module

   succeed-module


资源生成相关:

   module-asset

   chunk-asset


优化和 seal相关:

   (after-)seal

   optimize

   optimize-modules(-basic/advanced)

   after-optimize-modules

   after-optimize-chunks

   after-optimize-tree

   optimize-chunk-modules(-basic/advanced)

   after-optimize-chunk-modules

   optimize-module/chunk-order

   before-module/chunk-ids

   (after-)optimize-module/chunk-ids

   before/after-hash



chunk生成阶段


Chunk 生成算法


webpack 先将 entry 中对应的 module 都生成一个新的 chunk


遍历 module 的依赖列表,将依赖的 module 也加入到 chunk 中


如果一个依赖 module 是动态引入的模块,那么就会根据这个 module 创建一个

新的 chunk,继续遍历依赖


重复上面的过程,直至得到所有的 chunks









目录
相关文章
|
21天前
|
监控 前端开发 JavaScript
Webpack 中 HMR 插件的工作原理
【10月更文挑战第23天】可以进一步深入探讨 HMR 工作原理的具体细节、不同场景下的应用案例,以及与其他相关技术的结合应用等方面的内容。通过全面、系统地了解 HMR 插件的工作原理,能够更好地利用这一功能,为项目的成功开发提供有力保障。同时,要不断关注技术的发展动态,以便及时掌握最新的 HMR 技术和最佳实践。
|
21天前
|
缓存 前端开发 JavaScript
Webpack 动态加载的原理
【10月更文挑战第23天】Webpack 动态加载通过巧妙的机制和策略,实现了模块的按需加载和高效运行,提升了应用程序的性能和用户体验。同时,它也为前端开发提供了更大的灵活性和可扩展性,适应了不断变化的业务需求和技术发展。
|
21天前
|
缓存 监控
webpack 提高构建速度的方式
【10月更文挑战第23天】需要根据项目的具体情况和需求,综合运用这些方法,不断进行优化和改进,以达到最佳的构建速度和效果。同时,随着项目的发展和变化,还需要持续关注和调整构建速度的相关措施,以适应不断变化的需求。
|
21天前
|
存储 缓存 前端开发
利用 Webpack 5 的持久化缓存来提高构建效率
【10月更文挑战第23天】利用 Webpack 5 的持久化缓存是提高构建效率的有效手段。通过合理的配置和管理,我们可以充分发挥缓存的优势,为项目的构建和开发带来更大的便利和效率提升。你可以根据项目的实际情况,结合以上步骤和方法,进一步优化和完善利用持久化缓存的策略,以达到最佳的构建效果。同时,不断探索和实践新的方法和技术,以适应不断变化的前端开发环境和需求。
|
21天前
|
缓存 前端开发 JavaScript
webpack 原理
【10月更文挑战第23天】Webpack 原理是一个复杂但又非常重要的体系。它通过模块解析、依赖管理、加载器和插件的协作,实现了对各种模块的高效打包和处理,为现代前端项目的开发和部署提供了强大的支持。同时,通过代码分割、按需加载、热模块替换等功能,提升了应用程序的性能和用户体验。随着前端技术的不断发展,Webpack 也在不断演进和完善,以适应不断变化的需求和挑战。
|
1月前
|
缓存 前端开发 JavaScript
Webpack 打包的基本原理
【10月更文挑战第5天】
|
1月前
|
缓存 前端开发 JavaScript
深入了解Webpack:模块打包的革命
【10月更文挑战第11天】深入了解Webpack:模块打包的革命
|
1月前
|
缓存 前端开发 JavaScript
Webpack技术深度解析:模块打包与性能优化
【10月更文挑战第13天】Webpack技术深度解析:模块打包与性能优化
|
2月前
|
前端开发 开发者
在前端开发中,webpack 作为一个强大的模块打包工具,为我们提供了丰富的功能和扩展性
【9月更文挑战第1天】在前端开发中,Webpack 作为强大的模块打包工具,提供了丰富的功能和扩展性。本文重点介绍 DefinePlugin 插件,详细探讨其原理、功能及实际应用。DefinePlugin 可在编译过程中动态定义全局变量,适用于环境变量配置、动态加载资源、接口地址配置等场景,有助于提升代码质量和开发效率。通过具体配置示例和注意事项,帮助开发者更好地利用此插件优化项目。
82 13
|
2月前
|
JavaScript 前端开发
手写一个简易bundler打包工具带你了解Webpack原理
该文章通过手写一个简易的打包工具bundler,帮助读者理解Webpack的工作原理,包括模块解析、依赖关系构建、转换源代码以及生成最终输出文件的整个流程。