20190808面试记录
Angular的核心?
组件,指令,服务,依赖注入
性能优化?
1、减少http请求(图片压缩合并,css压缩合并,js文件压缩合并)
2、检查是否有重定向问题
3、检查是否一个列表有多次请求问题
4、减少DOM数量
5、延迟加载
6、提前加载
7、能用css做的尽量不要用js去做,能有原生写的尽量不引用外部插件
8、减少cookie的使用
9、尽量不用iframe
10、前端和后台协调,使用相应资源的压缩
11、根据需求使用ajax缓存
12、减少dom操作
13、减量不嵌套循环
14、css放head尽量不使用@import,因为@import是同步操作,只有把对应的样式导入后,才会继续向下加载,而link是异步的操作
15、css设置定位后最好设置z-index改变盒子的层级
16、使用window.requestAnimationFrame代替传统的定时器动画,如果可以使用setTimeout代替的setInterval就尽量不用setInterval
17、script标签放在底部加载
18、绑定多个事件的时候可以使用事件委托,减少循环给元素绑定事件
19、减少flash的使用
20、合理利用本地缓存
21、尽量给动画设置单独的一个图层(避免重绘和回流)
AMD和CMD的标准?现阶段使用的都是什么标准?
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
AMD推崇依赖就近
CMD推崇依赖前置
// CMD define(function(require, exports, module) { var a = require('./a') a.doSomething() // 此处略去 100 行 var b = require('./b') // 依赖可以就近书写 b.doSomething() // ... }) // AMD 默认推荐的是 define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好 a.doSomething() // 此处略去 100 行 b.doSomething() ... })
现阶段大部分框架用的较多应该是AMD,依赖前置
TypeScript的多态?
父类定义了一个接口,子类有多种实现
AngularJS的依赖注入?
依赖注入(DI)是用来创建对象及其依赖的其它对象的一种方式。 当依赖注入系统创建某个对象实例时,会负责提供该对象所依赖的对象(称为该对象的依赖)。
@Injectable 装饰器会指出这些服务或其它类是用来注入的。它还能用于为这些服务提供配置项。
providers 告诉 Angular,它的根注入器要负责调用类的构造函数来创建一个实例,并让它在整个应用中都是可用的。
组件中的providers服务还可以提供给指定的组件。在组件级提供的服务只能在该组件及其子组件的注入器中使用。
import { Component } from '@angular/core'; import { HeroService } from './hero.service'; @Component({ selector: 'app-heroes', providers: [ HeroService ], template: ` <h2>Heroes</h2> <app-hero-list></app-hero-list> ` }) export class HeroesComponent { }
Angular的脏值检查不再被吐槽呢?
Angular 使用了 zone.js 这个大杀器来跟踪异步任务,并进行脏检查
每一个组件都都它自己的检测器(detector),用于负责检查其自身模板上绑定的变量。所以每一个组件都可以独立地决定是否进行脏检查。
Angular 中组件是以树的形式组织起来的,相应地,检测器也是一棵树的形状。当一个异步事件发生时,脏检查会从根组件开始,自上而下对树上的所有子组件进行检查。相比 Angular1 中的带有环的结构,这样的单向数据流效率更高,而且容易预测
<!--value是数据绑定,input是事件绑定-->
<input [value]="currentHero.name"
(input)="currentHero.name=$event.target.value"
>
<!--等价-->
<input [(ngModel)]="currentHero.name">
而Angular2接入了ZoneJS
,由它监听了Angular所有的异步事件。ZoneJS重写了所有的异步API(所谓的猴子补丁,MonkeyPath)。ZoneJS会通知Angular可能有数据发生变化,需要检测更新
Angularjs采用的是双向数据流,错综复杂的数据流使得他不得不多次检查,使得数据最终趋向稳定