• 调用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将它们输出为文件