- 调用
webpack
函数接收config
配置信息,并初始化compiler
,在此期间会apply
所有 webpack 内置的插件;//注册所有的自定义插件 - 每一次新的编译都会实例化一个
compilation
对象,记录本次编译的基本信息;进入make
阶段,触发compilation.hooks.make
钩子,从entry
为入口,调用合适的loader
对模块源码预处理,转换为标准的JS模块; b. 调用第三方插件acorn
对标准JS模块进行分析,收集模块依赖项。同时也会继续递归每个依赖项,收集依赖项的依赖项信息,不断递归下去;最终会得到一颗依赖树🌲; - 最后调用
compilation.seal
render 模块,整合各个依赖项,最后输出一个或多个chunk;compiler.run()
出现的钩子有:beforeRun --> run --> done --> afterDone
compiler.compile()
出现的钩子有:beforeCompile --> compile --> make --> afterCompile
。
其中make
就是我们关心的编译过程compilation.seal()
打包封装模块compiler.hooks.emit.callAsync()
在seal执行后,关于模块所有信息以及打包后源码信息都存在内存中,emit将它们输出为文件