一、基本构建流程
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,从而生成一组新的编译资源