第41篇

1)DNS解析过程?若是新申请的域名如何查找DNS?

事实上它是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。

具体过程如下:

1、浏览器缓存  =》2、系统缓存  =》3、路由器缓存  =》4、ISP(互联网服务提供商)DNS缓存  =》 5、根域名服务器  =》 6、顶级域名服务器  =》 7、主域名服务器  =》 8、保存结果至缓存

 

(1)浏览器缓存

当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在)

(2)系统缓存

当浏览器缓存中无域名对应IP则会自动检查,用户计算机系统Hosts文件DNS缓存是否有该域名对应IP

(3)路由器缓存

当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客户端的DNS缓存

(4)ISP(互联网服务提供商)DNS缓存

当在用户客户端找不到域名对应IP地址,则将进入ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找

(或者向网络设置中指定的local DNS进行查询)

(5)根域名服务器

当以上均未完成,则进入根服务器进行查询。全球尽有13台根域名服务器,1个主根域名服务器,其余12为辅根服务器。根域名收到请求后会查看区域文件记录,

若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器。

(6)顶级域名服务器

顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器

(7)主域名服务器

主域名服务器接收到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确记录

(8)保存结果至缓存

本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,可独断通过这个Ip地址与web服务器建立连接。

 

2)Ajax请求状态及意义

在javascript里面写Ajax的时候,最关键的一步是对XMLHttpRequest对象建立监听,使用onreadystatechange方法。监听的时候要对XMLHttpRequest

对象的请求状态进行判断,通常是判断readyState的值为4,并且http返回状态status的值为200或者304时执行我们需要的操作。

readyState属性表示Ajax请求的当前状态。

0  =》 代表未初始化。还没有调用open方法

1  =》 代表正在加载。open方法已被调用。但send方法还没有被调用。

2  =》 代表已加载完毕。send已被调用。请求已经开始。

3  =》 代表交互中。服务器正在发送响应。

4  =》代表完成。响应发送完毕。

var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp");
xhr.open("get", url);
// xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function() {
  if(xhr.readstate == 4) {
    if(xhr.status == 200) {
      var data = responseText;
      return data;
    }
  }
};
xhr.send();

 

3)使用JS实现获取文件扩展名?

function getFileExtension (filename) {
    
    return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);  
}

String.lastIndexOf()   方法返回指定值(本例中的e.),在调用该方法的字符串中最后出现的位置,如果没有则返回-1。

对于'filename'和'.hiddenfile',lastIndexOf的返回值分别为0和-1无符号右移操作符(»>),将-1转换为4294967295,将-2转换为4294967294,
这个方法可以保证边缘情况时文件名不变。,String.prototype.slice() 从上面计算的索引处提取文件的扩展名。如果索引比文件名的长度大,结果为""。

 

4)CommonJs中的require/exports和ES6中的import/export区别

【1】CommonJs模块的重要性是加载时执行,即脚本代码在require的时候,就会全部执行。

一旦出现某个模块被“循环加载”,就只输出已经执行的部分,还未执行的部分不会输出。

【2】ES6 模块是动态引用,如果使用import从一个模块加载变量,那些变量不会被缓存,而是成为一个

指向被加载模块的引用,需要开发者自己保证,真正取值的时候能够取到值。

 

import/export最终都是编译为require/exports来执行的。

CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports

属性(module.exports) 是对外的接口。其实是加载该模块的module.exports属性。

export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。

 

5)项目做过哪些性能优化

【1】减少HTTP请求数

【2】减少DNS查询

【3】使用CDN

【4】避免重定向

【5】减少DOM元素数量

【6】减少DOM操作

【7】使用外部的javascript和css

【8】压缩javascript、css、字体、图片等

【9】使用CSS Sprite

【10】使用iconfont

【11】字体裁剪

【12】多域名分发内容到不同域名

【13】尽量减少iframe使用

【14】避免图片src为空

【15】样式放在头部,脚本放在底部

 

posted @ 2019-07-11 11:03  秋风起落叶摇  阅读(240)  评论(0编辑  收藏  举报