第33篇

一、CommonJS中的require/exports和ES6中的import/export的区别css

CommonJS模块的重要特性是加载时执行,即脚本代码在require的时候,就会所有执行。一旦出现某个模块被“循环加载”,es6

就只输出已经执行的部分,还未执行的部分不会输出。算法

ES6模块是动态引用,若是使用import从一个模块加载变量,那些变量不会被缓存,而是成为一个指向被加载模块的引用浏览器

,须要开发者本身保证,真正取值的时候可以取到值。缓存

 

import/exports最终都是编译为require/exports来执行的,commonJS规定,每一个模块内部,module变量表明当前模块,安全

这个变量是一个对象,它的exports属性(即module.exports)使对外的接口。加载某个模块实际上是加载该模块module.exports性能优化

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

 

二、项目作过那些性能优化?异步

减小HTTP请求数async

减小DNS查询

使用CDN

避免重定向

图片懒加载

减小DOM元素数量

减小DOM操做

使用外部Javascript和css

压缩Javascript、css、字体、图片等

使用CSS Sprite

使用iconfont

字体剪裁

多域名分发分容到不一样域名

尽可能减小iframe使用

把样式放置在头部

把脚本放置在页面底部

 

三、js异步加载的方式

渲染引擎遇到script标签会停下来,等到执行完脚本,继续向下渲染。

defer是“渲染完再执行”,async是“下载完就执行“

defer若是有多个脚本,会按照在页面中出现的顺序加载,

多个async脚本不能保证加载顺序

加载es6模块的时候设置type=module,

异步加载不会形成阻塞浏览器,页面渲染完再执行,能够同时加上async属性

异步执行脚本(利用顶层的this等于undefined这个语法点),能够侦测当前代码是否在ES6模块之中

 

四、gei和post通信的区别?

Get请求能缓存,Post不能。

Post相对Get安全一点点,由于Get请求都包含在URL里,且会被浏览器保存历史记录,

post不会,可是在抓包的状况下都是同样的。

post能够经过request body来传输比get更多的数据,get没有这个数据

url长度有限制,会影响get请求,可是这个长度限制是浏览器规定的,post支持更多的编码类型且不对数据类型限制

 

五、为何虚拟dom会提升性能?

虚拟dom至关于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没有必要的dom操做,从而提升性能。

用Javascript对象结构表示DOM树的解构,而后用这个树构建一个真正的DOM树,插到文档当中,当状态变动的时候,从新构造一棵新的对象树,

而后用新的树和旧的树进行比较,记录2棵树的差别,,把记录的差别应用到前面所构建的真正的DOM树上,视图就更新了。

相关文章
相关标签/搜索