webpack构建的流程和核心概念

224 阅读2分钟

这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

核心概念

Entry,入口,这是Webpack执行构建的第一步,可理解为输入。
Module,模块,在Webpack中一切皆模块,一个模块即为一个文件。Webpack会从Entry开始递归找出所有的依赖模块。
Chunk,代码块,一个Chunk由多个模块组合而成,它用于代码合并与分割。
Loader,模块转换器,用于将模块的原内容按照需求转换成新内容。
Plugin,扩展插件,在Webpack构建过程的特定时机注入扩展逻辑,用来改变或优化构建结果。
Output,输出结果,源码在Webpack中经过一系列处理后而得出的最终结果。

构建流程

webpack是一个串行的过程,从启动到结束会依次执行以下流程

  • 初始化参数: 从shell参数和配置文件合并参数,得出最终的参数
  • 开始编译:初始化compiler对象,注册所有的插件plugins,插件开始监听webpack构建过程的生命周期事件,不同环节会有相应的处理,然后开始执行编译。
  • 确定入口:根据配置文件的entry找出所有入口文件。
  • 编译模块:从入口文件开始,调用所有配置的loader对模块进行翻译成compliation,然后递归所有依赖的模块,然后重复编译。得到每个模块翻译后的最终内容以及它们之间的依赖关系。
  • 输出资源:根据入口和模块的依赖关系,组装成一个个包含多个模块的chunk,然后将chunk转换成一个单独的文件加入输出列表,这是可以修改输出内容的最后机会
  • 输出完成: 在确定好输出内容后,根据配置确定输出的路径和文件名,将文件的内容写入文件系统上。

在以上过程中,webpack会在特定的时间点广播特定的事件,插件通过监听到感兴趣的事件后执行特定的逻辑,并且改变webpack的运行结果。

总的来说: Webpack在启动后,会从Entry开始,递归解析Entry依赖的所有Module
每找到一个Module,就会根据Module.rules里配置的Loader规则进行相应的转换处理
对Module进行转换后,再解析出当前Module依赖的Module,这些Module会以Entry为单位进行分组,即为一个Chunk。
因此一个Chunk,就是一个Entry及其所有依赖的Module合并的结果。
最后Webpack会将所有的Chunk转换成文件输出Output。
在整个构建流程中,Webpack会在恰当的时机执行Plugin里定义的逻辑,从而完成Plugin插件的优化任务。