一、基本构建流程
1.1、初始化参数
从配置文件和 Shell
命令中读取和合并参数,得多最终的配置 config
1.2、开始编译
调用 webpack
函数接受 config
配置信息,并初始化 complier
对象, 加载配置的所有 plugin
, 执行complier.run
方法进入模版编译阶段, 根据配置项 entry
确定入口文件
1.3、编译模块
每一次新的编译都会实例化一个 compilation
对象,记录本次编译的基本信息。编译从入口文件出发:
调用合适的
loader
对模块进行处理,转换成标准的js
模块调用第三方插件
acorn
对标准js
模块进行分析,收集模块依赖项,同时会递归每个依赖项,收集依赖项的依赖信息,如此往复,最终会得到一个依赖树
1.4、完成编译模块
根据入口和模块的依赖关系,将多个模块组装成一个个 chunk
, 再将每个 chunk
转化成一个单独的文件加入到输出列表( ps: 这步是修改输出文件内容的最后机会 )
1.5、输出完成
确定好输出内容后,按照配置确定输出的文件名和路径,把文件内容写入到文件系统中
TIP
在上述整个过程中,webpack
会在特定的时间广播特定的事件( hook
钩子函数 ),插件在监听到感兴趣的事件后会执行回调函数,利用 webpack
提供的 api
修改最后的输出结果
二、核心概念
2.1、compiler
编译器对象,其实例包含了完整的 webpack
配置,且全局只有一个 compiler
实例,相当于 webpack
的骨架或神经中枢,通过该对象可访问 webpack
内部环境
2.2、compilation
compilation
对象代表了一次资源版本构建。当运行 webpack
开发环境中间件时,每当检测到一个文件变化,就会创建一个新的 compilation
,从而生成一组新的编译资源