Angular2的12个经典⾯试问题汇总(⽂末附带Angular测试)Angular作为⽬前最为流⾏的前端框架,受到了前端开发者的普遍欢迎。不论是初学Angular的新⼿,还是有⼀定Angular开发经验的开发者,了解本⽂中的12个经典⾯试问题,都将会是⼀个深⼊了解和学习Angular 2的知识概念的绝佳途径。
在⽂中,我们将会接触到很多Angular 2的重要概念,并附扩展阅读资料和⾃查⼩测试,供⼤家评估⾃⼰对Angular的了解程度。
Angular 经典⾯试问题及扩展阅读
1.  请解释Angular 2应⽤程序的⽣命周期hooks是什么?
Angular 2组件/指令具有⽣命周期事件,是由@angular/core管理的。@angular/core会创建组件,渲染它,创建并呈现它的后代。当
@angular/core的数据绑定属性更改时,处理就会更改,在从DOM中删除其模板之前,就会销毁掉它。Angular提供了⼀组⽣命周期hooks(特殊事件),可以被分接到⽣命周期中,并在需要时执⾏操作。构造函数会在所有⽣命周期事件之前执⾏。每个接⼝都有⼀个前缀为ng的hook⽅法。例如,ngOnint界⾯的OnInit⽅法,这个⽅法必须在组件中实现。
⼀部分事件适⽤于组件/指令,⽽少数事件只适⽤于组件。
ngOnChanges:当Angular设置其接收当前和上⼀个对象值的数据绑定属性时响应。
ngOnInit:在第⼀个ngOnChange触发器之后,初始化组件/指令。这是最常⽤的⽅法,⽤于从后端服务检索模板的数据。ngDoCheck:检测并在Angular上下⽂发⽣变化时执⾏。每次更改检测运⾏时,会被调⽤。
ngOnDestroy:在Angular销毁指令/组件之前清除。取消订阅可观察的对象并脱离事件处理程序,以避免内存泄漏。
组件特定hooks:
ngAfterContentInit:组件内容已初始化完成
ngAfterContentChecked:在Angular检查投影到其视图中的绑定的外部内容之后。
ngAfterViewInit:Angular创建组件的视图后。
ngAfterViewChecked:在Angular检查组件视图的绑定之后。
2.  使⽤Angular 2,和使⽤Angular 1相⽐,有什么优势?
Angular 2是⼀个平台,不仅是⼀种语⾔
更好的速度和性能
更简单的依赖注⼊
模块化,跨平台
具备ES6和Typescript的好处。
灵活的路由,具备延迟加载功能
更容易学习
3.  Angular 2中的路由⼯作原理是什么?
路由是能够让⽤户在视图/组件之间导航的机制。Angular 2简化了路由,并提供了在模块级(延迟加载)下配置和定义的灵活性。
Angular应⽤程序具有路由器服务的单个实例,并且每当URL改变时,相应的路由就与路由配置数组进⾏匹配。在成功匹配时,它会应⽤重定向,此时路由器会构建ActivatedRoute对象的树,同时包含路
由器的当前状态。在重定向之前,路由器将通过运⾏保护()来检查是否允许新的状态。Route Guard只是路由器运⾏来检查路由授权的接⼝⽅法。保护运⾏后,它将解析路由数据并通过将所需的组件实例化到
<router-outlet> </ router-outlet>中来激活路由器状态。
扩展阅读:
4.  什么是事件发射器?它是如何在Angular 2中⼯作的?
Angular 2不具有双向digest cycle,这是与Angular 1不同的。在Angular2中,组件中发⽣的任何改变总是从当前组件传播到其所有⼦组件中。如果⼀个⼦组件的更改需要反映到其⽗组件的层次结构中,我们可以通过使⽤事件发射器api来发出事件。
简⽽⾔之,EventEmitter是在@ angular/core模块中定义的类,由组件和指令使⽤,⽤来发出⾃定义事件。
@output() somethingChanged = new EventEmitter();
我们使⽤it(value)⽅法来发出事件。这通常⽤在setter中,当类中的值被更改完成时。
可以通过模块的任何⼀个组件,使⽤订阅⽅法来实现事件发射的订阅。
myObj.somethingChanged.subscribe(val) => LocalMethod(val));
扩展阅读:
5.  如何在Angular 2应⽤程序中使⽤codelyzer?
所有企业应⽤程序都会遵循⼀组编码惯例和准则,以更好的⽅式维护代码。Codelyzer是⼀个开源⼯具,⽤于运⾏和检查是否遵循了预定义的编码准则。Codelyzer仅对Angular和TypeScript项⽬进⾏静态代码分析。
Codelyzer运⾏在tslint的顶部,其编码约定通常在tslint.json⽂件中定义。Codelyzer可以直接通过Angularcli或npm运⾏。像Visual Studio Code和Atom这样的编辑器也⽀持codelyzer,只需要通过做⼀个基本的设置就能实现。
如何启用javascript功能要在Visual Studio代码中设置codelyzer,我们可以在⽂件 - >选项 - >⽤户设置中添加tslint规则的路径。
{
"tslint.rulesDirectory": "./node_modules/codelyzer",
"typescript.tsdk": "node_modules/typescript/lib"
}
从cli中运⾏的代码:ng lint。
从npm中运⾏的代码: npm run lint
扩展阅读:
6.  什么是延迟加载?如何在Angular 2中启⽤延迟加载?
⼤多数企业应⽤程序包含⽤各式各样的⽤于特定业务案例的模块。捆绑整个应⽤程序代码并完成加载,会在初始调⽤时,产⽣巨⼤的性能开销。延迟加载使我们只加载⽤户正在交互的模块,⽽其余的模块会在运⾏时按需加载。
延迟加载通过将代码拆分成多个包并以按需加载的⽅式,来加速应⽤程序初始加载过程。
每个Angular应⽤程序必须有⼀个叫AppModule的主模块。代码应该根据应⽤程序业务案例分为不同的
⼦模块(NgModule)。
启⽤延迟加载的Plunkr⽰例:
我们不需要在根模块中导⼊或声明延迟加载模块。
将路由添加到顶层路由(uting.ts)并设置loadChildren。loadChildren会从根⽂件夹中获取绝对路径。RouterModule.forRoot()会获取routes数组并配置路由器。
在⼦模块中导⼊模块特定路由。
在⼦模块路由中,将路径指定为空字符串“”,也就是空路径。RouterModule.forChild会再次采⽤路由数组为⼦模块组件加载并配置路由器。然后,导出const路由:ModuleWithProviders = RouterModule.forChild(routes);
7.  在Angular 2应⽤中,我们应该注意哪些安全威胁?
就像任何其他客户端或Web应⽤程序⼀样,Angular 2应⽤程序也应该遵循⼀些基本准则来减轻安全风险。其中⼀些是:
避免为你的组件使⽤/注⼊动态HTML内容。
如果使⽤外部HTML,也就是来⾃数据库或应⽤程序之外的地⽅,那么就需要清理它。
不要将外部⽹址放在应⽤程序中,除⾮它是受信任的。避免⽹址重定向,除⾮它是可信的。
考虑使⽤AOT编译或离线编译。
通过限制api,选择使⽤已知或安全环境/浏览器的app来防⽌XSRF攻击。
8.  如何优化Angular 2应⽤程序来获得更好的性能?
优化取决于应⽤程序的类型和⼤⼩以及许多其他因素。但⼀般来说,在优化Angular 2应⽤程序时,我会考虑以下⼏点:
考虑AOT编译。
确保应⽤程序已经经过了捆绑,uglify和tree shaking。
确保应⽤程序不存在不必要的import语句。
确保应⽤中已经移除了不使⽤的第三⽅库。
所有dependencies 和dev-dependencies都是明确分离的。
如果应⽤程序较⼤时,我会考虑延迟加载⽽不是完全捆绑的应⽤程序。
扩展阅读:
9.  如何实现不出现编辑器警告的⾃定义类型?
在⼤多数的情况下,第三⽅库都带有它的.d.ts ⽂件,⽤于类型定义。在某些情况下,我们需要通过向现有类型提供⼀些更多的属性来扩展现有类型,或者如果我们需要定义其它类型以避免TypeScript警告。
如果我们需要扩展外部库的类型定义,⼀个好的做法是,我们并⾮对node_modules或现有的typings⽂件夹进⾏改动,⽽是创建⼀个命名
为“⾃定义类型”的新⽂件夹,来存储所有的⾃定义类型。
要定义应⽤程序(JavaScript / Typescript)对象的类型,我们应该在应⽤程序相应模块的models⽂件夹中,定义接⼝和实体类。
对于这些情况,我们可以通过创建我们⾃⼰的“ .d.ts”⽂件来实现定义或扩展类型。
扩展阅读:
10. 什么是Shadow DOM?它如何帮助Angular 2更好地执⾏?
Shadow DOM是HTML规范的⼀部分,它允许开发⼈员封装⾃⼰的HTML标记,CSS样式和JavaScript。Shadow DOM以及其它⼀些技术,使开发⼈员能够像<audio>标签⼀样构建⾃⼰的⼀级标签,Web组件和API。总的来说,这些新的标签和API被称为Web组件。Shadow DOM 通过提供了更好的关注分离,通过其它的HTML DOM元素实现了更少的样式与脚本的冲突。
因为shadow DOM本质上是静态的,同时也是开发⼈员⽆法访问的,所以它是⼀个很好的候选对象。因为它缓存的DOM将在浏览器中呈现得更快,并提供更好的性能。此外,还可以相对很好地管理shadow DOM,同时检测Angular 2应⽤的改变,并且可以有效地管理视图的重新绘制。
扩展阅读:
11. 什么是AOT编译?它有什么优缺点?
AOT编译代表的是Ahead Of Time编译,其中Angular编译器在构建时,会将Angular组件和模板编译为本机JavaScript和HTML。编译好的HTML和JavaScript将会部署到Web服务器,以便浏览器可以节省编译和渲染时间。
优点:
更快的下载:由于应⽤程序已经编译,许多Angular编译器相关库就不再需要捆绑,应⽤程序包变得更⼩,所以该应⽤程序可以更快地下载。
更少的Http请求数:如果应⽤程序没有捆绑来⽀持延迟加载(或任何原因),对于每个关联的HTML和CSS,都会有⼀个单独的服务器请求。但是预编译的应⽤程序会将所有模板和样式与组件对齐,因此到服务器的Http请求数量会更少。
更快的渲染:如果应⽤程序不是AOT编译,那么应⽤程序完全加载时,编译过程会发⽣在浏览器中。这需要等待下载所有必需的组件,然后等待编译器花费时间来编译应⽤程序。使⽤AOT编译,就能实现优化。
在构建时检测错误:由于预先编译,可以检测到许多编译时错误,能够为应⽤程序提供更好的稳定性。
缺点:
仅适⽤于HTML和CSS,其它⽂件类型需要前⾯的构建步骤
没有watch模式,必须⼿动完成(bin / ngc-watch.js)并编译所有⽂件
需要维护AOT版本的bootstrap⽂件(使⽤cli等⼯具时不需要)
在编译之前,需要清理步骤
12. Observables和Promises的核⼼区别是什么?
从堆栈溢出就是⼀个区别:
当异步操作完成或失败时,Promise会处理⼀个单个事件。
Observable类似于(在许多语⾔中的)Stream,当每个事件调⽤回调函数时,允许传递零个或多个事件。通常Observable⽐Promise更受欢迎,因为它不但提供了Promise特性,还提供了其它特性。使⽤Observable可以处理0,1或多个事件。你可以在每种情况下使⽤相同的API。Observable是可取消的,这相⽐于Promise也具有优势。如果服务器的HTTP请求结果或其它⼀些异步操作不再需要,则Observable的订阅者可以取消订阅,⽽Promise将最终调⽤成功或失败的回调,即使你不需要通知或其提供的结果。Observable提供像map,forEach,reduce 之类的类似于数组的运算符,还有强⼤的运算符,如retry()或replay()等,使⽤起来是相当⽅便的。
Promises vs Observables
Promises:
返回单个值
不可取消
Observables:
可以使⽤多个值
可取消
⽀持map,filter,reduce和类似的操作符
ES 2016提议的功能
使⽤反应式扩展(RxJS)
根据时间的变化,数组成员可以异步获取
⽬前Angular 2正式版已经发布,部分产品也已经对Angular 2正式版进⾏了⽀持。其中,反应最为迅速的就是Wijmo,在 Angular2 发布⼏个⼩时后就发布了⽀持 Angular2 正式版本的 Wijmo。Wijmo 为每⼀个UI控件都提供了 Angular2 组件。所有 Angular2 组件都提供了完全声明性标记。
⾃查⼩测验
对Angular的知识了解到这⾥,你是否也想知道⾃⼰到底掌握的如何呢?感兴趣的同学,可以尝试构建⼀个“答题系统应⽤程序”,具体要求为:
有三个组成部分:测试视图、审查结果和显⽰结果
接受json格式的提问问题,你可以以预定义的格式从服务器发送json,Angular2测试应⽤需要在客户端呈现出答题界⾯
成品界⾯如下:
也欢迎⼤家在⽂末留⾔,交流Angular的使⽤经验哦!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。