首页是对外暴露的 rollup 方法,它调用的是 rollupInternal 方法。
1 | export default function rollup( |
至于 rollupInternal,它负责生成 graph,然后调用 graph.build() 开始对源文件进行解析,最后生成 result。在 result 上具有 generate 和 write 两个输出编译后代码的方法。
1 | export async function rollupInternal( |
实际上 generate 和 write 的实现细节基本一致,都是调用的 handleGenerateWrite 函数,只是所传第一个参数不同罢了。
1 | async function handleGenerateWrite( |
如上所见可以看到 rollup 的运行是从创建 Graph 实例开始的,它上面会挂载三个重要属性:
pluginDriver:管理 plugin。acornParser:生成 ast 语法树。moduleLoader:管理文件。
Graph.generateModuleGraph 方法会从入口文件开始,通过对源代码进行分析,从而梳理文件之间的依赖关系,逐一的为每个文件生成一个 Module 实例,然后登记在 graph.moduleLoader.modulesById 上。
在对源代码进行分析时,就是通过 graph.acornParse 生成 ast 语法树,然后再基于 rollup 自己定义在 src/nodes/shared 下的节点生成对应的实例,保存在 module.ast 上。在这一系列动作之后,已经知道了当前源文件依赖哪些其他文件,然后就可以顺着依赖关系再对其他文件进行同样的解析。
当然,在这一过程中,会在关键的节点调用 graph.pluginDriver 上的合适方法来抛出对应的钩子,触发用户声明要在编译过程中执行的 plugins。