RootView
,而在生产环境会调用 createProdRootView()
方法创建 RootView
。简单起见,我们只分析 createProdRootView()
方法:
function createProdRootView( elInjector: Injector, projectableNodes: any[][], rootSelectorOrNode: string | any, def: ViewDefinition, ngModule: NgModuleRef<any>, context?: any): ViewData { /** RendererFactory2 Provider 配置 * DomRendererFactory2, * {provide: RendererFactory2, useExisting: DomRendererFactory2}, */ const rendererFactory: RendererFactory2 = ngModule.injector.get(RendererFactory2); return createRootView( createRootData(elInjector, ngModule, rendererFactory, projectableNodes, rootSelectorOrNode), def, context); } // 创建根视图 export function createRootView(root: RootData, def: ViewDefinition, context?: any): ViewData { // 创建ViewData对象 const view = createView(root, root.renderer, null, null, def); initView(view, context, context); createViewNodes(view); return view; }
上面代码中,当创建 RootView
的时候,会调用 createRootData()
方法创建 RootData
对象。最后一步就是分析 createRootData()
方法。
怎么创建 RootData
对象?
通过上面分析,我们知道通过 createRootData()
方法,来创建 RootData
对象。createRootData()
方法具体实现如下:
function createRootData( elInjector: Injector, ngModule: NgModuleRef<any>, rendererFactory: RendererFactory2, projectableNodes: any[][], rootSelectorOrNode: any): RootData { const sanitizer = ngModule.injector.get(Sanitizer); const errorHandler = ngModule.injector.get(ErrorHandler); // 创建RootRenderer const renderer = rendererFactory.createRenderer(null, null); return { ngModule, injector: elInjector, projectableNodes, selectorOrNode: rootSelectorOrNode, sanitizer, rendererFactory, renderer, errorHandler }; }
此时浏览器平台下, Renderer
渲染器的相关基础知识已介绍完毕。接下来,我们做一个简单总结:
- Angular 应用程序启动时会创建 RootView (生产环境下通过调用 createProdRootView() 方法)
- 创建 RootView 的过程中,会创建 RootData 对象,该对象可以通过 ViewData 的 root 属性访问到。基于 RootData 对象,我们可以通过
renderer
访问到默认的渲染器,即 DefaultDomRenderer2 实例,此外也可以通过rendererFactory
访问到RendererFactory2
实例。 - 在创建组件视图 (ViewData) 时,会根据
componentRendererType
的属性值,来设置组件关联的renderer
渲染器。 - 当渲染组件视图的时候,Angular 会利用该组件关联的