第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。
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】样式放在头部,脚本放在底部