问题积累

1.浏览器缓存机制

1. 浏览器缓存两大策略
  1. 强缓存:不会向服务器发送请求,直接命中内存中的缓存资源,从chrome Network中可以看到资源200且from disk cache或from memory cache。
  2. 协商缓存:向服务器发送请求,服务器根据request header内的参数来判断是否需要更新此资源,如果不需要更新,服务器返回304的状态码,然后通知浏览器读取本地缓存。
强缓存

http response header key

Cache-Control  http1.1最主要的key,指定缓存机制

Pragma  http1.0指定缓存机制 当Pragma:no-cache时等同于Cache-Control:no-cache(在浏览器中disable cache就是在所有请求的请求头上加上Pragma:no-cache)

Expires  http1.0指定缓存的过期时间,当和Cache-Control同时存在时优先取Cache-Control的值

Cache-Control内又有多个属性值,常见的是max-age,指定资源缓存的过期时间(s)

Pragma一般用于调试,现在在response头上手动处理Pragma的很少很少。

Expires和max-age类似,差别在于expires是一个固定的服务器时间点

协商缓存

http response header key

ETag(服务端返回的当前资源的etag值)

Last-Modified(服务端返回的当前资源的最后修改时间)


http request headerkey

If-None-Match  (上一次服务器对于当前资源返回的etag值)与服务器中资源的etag比较,如果相同,服务器会返回304,浏览器会重定向进缓存找资源
If-Modified-Since  (上一次服务器对于当前资源返回的最后修改时间)与服务器中资源的最后修改时间比较,如果相同,服务器会返回304,浏览器会重定向进缓存找资源

会先进memory cache查找资源,如果找不到则去disk cache中查找



2.es6模块化和commonjs模块化区别

ES6 模块与 CommonJS 模块存在以下差异:

1、CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用

CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。

ES6 Modules 的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。换句话说,ES6的import 有点像 Unix 系统的“符号连接”,原始值变了,import加载的值也会跟着变。因此,ES6模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。

2、CommonJS 模块是运行时加载,ES6 模块是编译时输出接口

运行时加载: CommonJS 模块就是对象;即在输入时是先加载整个模块,生成一个对象,然后再从这个对象上面读取方法,这种加载称为“运行时加载”。

编译时加载: ES6 模块不是对象,而是通过 export 命令显式指定输出的代码,import时采用静态命令的形式。即在import时可以指定加载某个输出值,而不是加载整个模块,这种加载称为“编译时加载”


3.setTimeout递归调用自身和setInterval的区别

    使用 setInterval() 创建的定时器确保了定时器代码规则地插入队列中。这个方式的问题在于,定时器代码可能在代码再次被添加到队列之前还没有完成执行,结果导致定时器代码连续运行好几次,而之间没有任何停顿。幸好,JavaScript 引擎够聪明,能避免这个问题。当使用 setInterval() 时,仅当没有该定时器的任何其他代码实例时,才将定时器代码添加到队列中。这确保了定时器代码加入到队列中的最小时间间隔为指定间隔。

这种重复定时器的规则有两个问题:

(1) 某些间隔会被跳过;

(2) 多个定时器的代码执行之间的间隔可能会比预期的小。假设,某个 onclick 事件处理程序使用setInterval() 设置了一个 200ms 间隔的重复定时器。如果事件处理程序花了 300ms多一点的时间完成,同时定时器代码也花了差不多的时间,就会同时出现跳过间隔且连续运行定时器代码的情况

image

为了避免 setInterval() 的重复定时器的这2个缺点,你可以用如下模式使用链式 setTimeout()
调用。
setTimeout(function(){
       //处理中
       setTimeout(arguments.callee, interval);
}, interval);
       这个模式链式调用了 setTimeout() ,每次函数执行的时候都会创建一个新的定时器。第二个
setTimeout() 调用使用了 arguments.callee 来获取对当前执行的函数的引用,并为其设置另外一个定时器。这样做的好处是,在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保不会有任何缺失的间隔。而且,它可以保证在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。这个模式主要用于重复定时器

posted @ 2020-03-09 23:00  阴阳师先生  阅读(197)  评论(0编辑  收藏  举报