使用webpack优化项目
1 | 对于 Webpack4,打包项目使用 production 模式,这样会自动开启代码压缩 |
资源压缩合并、减少http请求
合并图片(css sprites)、CSS和JS文件合并、CSS和JS文件压缩。图片较多的页面也可以使用 lazyLoad 等技术进行优化。精灵图等
非核心代码异步加载
动态脚本加载
使用document.createElement创建一个script标签,即document.createElement(‘script’),然后把这个标签加载到body上面去。
defer(推荐)
1 | // 在HTML解析完之后才会执行。如果是多个,则按照加载的顺序依次执行。 |
async(不推荐)
1 | // 在加载完之后立即执行(所以有可能阻碍dom渲染)。如果是多个,执行顺序和加载顺序无关。 |
利用浏览器缓存(面试官问你:与浏览器缓存相关的http header有哪些?)
缓存:资源文件(比如图片)在本地的硬盘里存有副本,浏览器下次请求的时候,可能直接从本地磁盘里读取,而不会重新请求图片的url。
缓存分为强缓存和协商缓存
强缓存:不用请求服务区,直接使用本地的缓存。(可以查看百度官网)
强缓存
利用 http 响应头中的Expires或Cache-Control实现的。【重要】
浏览器第一次请求一个资源时,服务器在返回该资源的同时,会把上面这两个属性放在response header中。
注意:这两个response header属性可以只启用一个,也可以同时启用。当response header中,Expires和Cache-Control同时存在时,Cache-Control的优先级高于Expires。
1 | 1、Expires:服务器返回的绝对时间。 |
协商缓存
浏览器发现本地有资源的副本,但是不太确定要不要使用,于是去问问服务器。当浏览器对某个资源的请求没有命中强缓存(也就是说超出时间了),就会发一个请求到服务器,验证协商缓存是否命中。
1 | 1、Last-Modified、If-Modified-Since。过程如下: |
使用CDN
浏览器缓存始终只是为了提升二次访问的速度,对于首次访问的加速,我们需要从网络层面进行优化,最常见的手段就是CDN。
CDN是怎么做到加速的呢?
其实这是CDN服务商在全国各个省份部署计算节点,CDN加速将网站的内容缓存在网络边缘,不同地区的用户就会访问到离自己最近的相同网络线路上的CDN节点,当请求达到CDN节点后,节点会判断自己的内容缓存是否有效,如果有效,则立即响应缓存内容给用户,从而加快响应速度。如果CDN节点的缓存失效,它会根据服务配置去我们的内容源服务器获取最新的资源响应给用户,并将内容缓存下来以便响应给后续访问的用户。因此,一个地区内只要有一个用户先加载资源,在CDN中建立了缓存,该地区的其他后续用户都能因此而受益。
DNS预解析
通过 DNS 预解析来告诉浏览器未来我们可能从某个特定的 URL 获取资源,当浏览器真正使用到该域中的某个资源时就可以尽快地完成 DNS 解析。
第一步:打开或关闭DNS预解析
1 | 你可以通过在服务器端发送 X-DNS-Prefetch-Control 报头。或是在文档中使用值为 http-equiv 的meta标签: |
第二步:对指定的域名进行DNS预解析
1 | 如果我们将来可能从 smyhvae.com 获取图片或音频资源,那么可以在文档顶部的 标签中加入以下内容: |
预加载
在开发中,可能会遇到有些资源不需要马上用到,这时候就可以使用预加载。预加载可以一定程度上降低首屏的加载时间,因为可以将一些不影响首屏但重要的文件延后加载,唯一缺点就是兼容性不好。
1 | <link rel="preload" href="http://example.com" /> |
垃圾回收和内存泄漏
垃圾回收
由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。所以才需要垃圾回收。
JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。
垃圾回收机制怎么知道,哪些内存不再需要呢?
1 | 1、标记清除 |
哪些情况会引起内存泄漏?
1 | 1、意外的全局变量 |
垃圾回收的优化
1 | 1、数组array优化:将数组长度赋值为0(arr.length = 0)也能达到清空数组的目的,并且同时能实现数组重用,减少内存垃圾的产生。 |