Angular应用bootstrap时的version检测机制

简介: Angular应用bootstrap时的version检测机制

core.js里: create(injector, projectableNodes, rootSelectorOrNode, ngModule) {

       ngModule = ngModule || this.ngModule;

       /** @type {?} */

       const rootViewInjector = ngModule ? createChainedInjector(injector, ngModule.injector) : injector;

       /** @type {?} */

       const rendererFactory = (/** @type {?} */ (rootViewInjector.get(RendererFactory2, domRendererFactory3)));

       /** @type {?} */

       const sanitizer = rootViewInjector.get(Sanitizer, null);

       /** @type {?} */

       const hostRenderer = rendererFactory.createRenderer(null, this.componentDef);

       // Determine a tag name used for creating host elements when this component is created

       // dynamically. Default to 'div' if this component did not specify any tag name in its selector.

       /** @type {?} */

       const elementName = (/** @type {?} */ (this.componentDef.selectors[0][0])) || 'div';

       /** @type {?} */

       const hostRNode = rootSelectorOrNode ?

           locateHostElement(hostRenderer, rootSelectorOrNode, this.componentDef.encapsulation) :

           elementCreate(elementName, rendererFactory.createRenderer(null, this.componentDef), getNamespace$1(elementName));

       /** @type {?} */

       const rootFlags = this.componentDef.onPush ? 64 /* Dirty */ | 512 /* IsRoot */ :

           16 /* CheckAlways */ | 512 /* IsRoot */;

       // Check whether this Component needs to be isolated from other components, i.e. whether it

       // should be placed into its own (empty) root context or existing root context should be used.

       // Note: this is internal-only convention and might change in the future, so it should not be

       // relied upon externally.

       /** @type {?} */

       const isIsolated = typeof rootSelectorOrNode === 'string' &&

           /^#root-ng-internal-isolated-\d+/.test(rootSelectorOrNode);

       /** @type {?} */

       const rootContext = createRootContext();

       // Create the root view. Uses empty TView and ContentTemplate.

       /** @type {?} */

       const rootTView = createTView(0 /* Root */, -1, null, 1, 0, null, null, null, null, null);

       /** @type {?} */

       const rootLView = createLView(null, rootTView, rootContext, rootFlags, null, null, rendererFactory, hostRenderer, sanitizer, rootViewInjector);

       // rootView is the parent when bootstrapping

       // TODO(misko): it looks like we are entering view here but we don't really need to as

       // `renderView` does that. However as the code is written it is needed because

       // `createRootComponentView` and `createRootComponent` both read global state. Fixing those

       // issues would allow us to drop this.

       enterView(rootLView, null);

       /** @type {?} */

       let component;

       /** @type {?} */

       let tElementNode;

       try {

           /** @type {?} */

           const componentView = createRootComponentView(hostRNode, this.componentDef, rootLView, rendererFactory, hostRenderer);

           if (hostRNode) {

               if (rootSelectorOrNode) {

                   setUpAttributes(hostRenderer, hostRNode, ['ng-version', VERSION.full]);

               }

               else {

                   // If host element is created as a part of this function call (i.e. `rootSelectorOrNode`

                   // is not defined), also apply attributes and classes extracted from component selector.

                   // Extract attributes and classes from the first selector only to match VE behavior.

                   const { attrs, classes } = extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]);

                   if (attrs) {

                       setUpAttributes(hostRenderer, hostRNode, attrs);

                   }

                   if (classes && classes.length > 0) {

                       writeDirectClass(hostRenderer, hostRNode, classes.join(' '));

                   }

               }

           }

           tElementNode = (/** @type {?} */ (getTNode(rootTView, 0)));

           if (projectableNodes !== undefined) {

               /** @type {?} */

               const projection = tElementNode.projection = [];

               for (let i = 0; i < this.ngContentSelectors.length; i++) {

                   /** @type {?} */

                   const nodesforSlot = projectableNodes[i];

                   // Projectable nodes can be passed as array of arrays or an array of iterables (ngUpgrade

                   // case). Here we do normalize passed data structure to be an array of arrays to avoid

                   // complex checks down the line.

                   // We also normalize the length of the passed in projectable nodes (to match the number of

                   //  slots defined by a component).

                   projection.push(nodesforSlot != null ? Array.from(nodesforSlot) : null);

               }

           }

           // TODO: should LifecycleHooksFeature and other host features be generated by the compiler and

           // executed here?

           // Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref

           component = createRootComponent(componentView, this.componentDef, rootLView, rootContext, [LifecycleHooksFeature]);

           renderView(rootTView, rootLView, null);

       }

       finally {

           leaveView();

       }

       /** @type {?} */

       const componentRef = new ComponentRef$1(this.componentType, component, createElementRef(ElementRef, tElementNode, rootLView), rootLView, tElementNode);

       if (!rootSelectorOrNode || isIsolated) {

           // The host element of the internal or isolated root view is attached to the component's host

           // view node.

           ngDevMode && assertNodeOfPossibleTypes(rootTView.node, 2 /* View */);

           (/** @type {?} */ (rootTView.node)).child = tElementNode;

       }

       return componentRef;

   }

}image.png

相关文章
|
25天前
|
缓存 JavaScript 前端开发
Angular 应用打包和部署
Angular 应用打包和部署
61 1
|
2月前
|
前端开发 开发者 开发框架
JSF与Bootstrap,打造梦幻响应式网页!让你的应用跨设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,响应式设计至关重要,以确保不同设备上的良好用户体验。本文探讨了JSF(JavaServer Faces)与Bootstrap框架的结合使用,展示了如何构建响应式网页。JSF是一个基于Java的Web应用框架,提供丰富的UI组件和表单处理功能;而Bootstrap则是一个基于HTML、CSS和JavaScript的前端框架,专注于实现响应式设计。通过结合两者的优势,开发者能够更便捷地创建自适应布局,提升Web应用体验。然而,这种组合也有其局限性,如JSF组件库较小和较高的学习成本等,因此在选择开发框架时需综合考虑具体需求和应用场景。
34 0
|
2月前
|
应用服务中间件 Java Maven
掌控视图的力量!深入解析 JSF 视图管理,揭秘视图生命周期的秘密,让你的应用更高效!
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的框架,用于管理 Web 应用程序的视图。本文通过具体案例介绍 JSF 视图管理的基础知识,包括创建、管理和销毁视图的过程。首先,在 Eclipse 中创建一个新 JSF 项目,并配置 Maven 依赖。接着,在 `WEB-INF` 目录下配置 `web.xml` 文件,设置 JSF servlet。
38 0
|
2月前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
38 0
|
2月前
|
开发者 Java 开发框架
JSF与EJB,打造企业级应用的神器!让你的Web应用更加稳定、高效!
【8月更文挑战第31天】在现代企业级应用开发中,JSF(JavaServer Faces)与EJB(Enterprise JavaBeans)是两大核心技术。JSF作为一款基于Java的Web应用框架,以其丰富的UI组件和表单处理功能著称;EJB则专注于提供分布式事务处理及远程调用等企业级服务。两者的结合为企业应用带来了高效便捷的开发模式。下文将通过一个简单的示例展示如何利用JSF进行用户信息的输入与保存,并借助EJB实现相关业务逻辑。尽管这一组合具有明显优势,但在实际应用中还需考虑其局限性并作出合理选择。
43 0
|
2月前
|
开发者 安全 SQL
JSF安全卫士:打造铜墙铁壁,抵御Web攻击的钢铁防线!
【8月更文挑战第31天】在构建Web应用时,安全性至关重要。JavaServer Faces (JSF)作为流行的Java Web框架,需防范如XSS、CSRF及SQL注入等攻击。本文详细介绍了如何在JSF应用中实施安全措施,包括严格验证用户输入、使用安全编码实践、实施内容安全策略(CSP)及使用CSRF tokens等。通过示例代码和最佳实践,帮助开发者构建更安全的应用,保护用户数据和系统资源。
43 0
N..
|
5月前
|
开发框架 前端开发 UED
Bootstrap的CSS组件
Bootstrap的CSS组件
N..
51 0
|
12月前
|
前端开发 容器
|
12月前
|
前端开发 容器
|
12月前
|
前端开发 开发者 容器