웹 성능 최적화 가이드

프런트 엔드 성능 최적화는 각 프런트 엔드에 필수적인 기술이다, 할 수있는 더 빨리 여러 측면에서, 오늘 프런트 엔드 성능 최적화 솔루션에 대해 이야기한다 사용자 대기를 감소, 오픈 액세스 자신의 웹 사이트를 만들기 위해 자신의 코드를 최적화,

페이지가로드에 URL을 입력 면접관은 종종에서 완료됩니다 물어,지도 아래 참조, 무슨 일?

 

 

1. 사용자 입력 www.baidu.com
2. DNS를 통해 브라우저. 그것은 URL 구문 분석의 IP
3. IP 주소와 TCP 연결을 설정, HTTP 요청 전송
4. 서버가 라이브러리를 확인 요청을 수신, 좋은 반환 HTTP 응답 바느질, 파일을 읽고
, 렌더링 시작, 브라우저는 첫 번째 화면의 HTML을 수신 5.
6. HTML 비트 DOM 구문 분석
7. 구문 분석 CSS 트리 CSS입니다
+ CSS를 8.dom 렌더링 트리 생성 그래픽
스크립트 JS 파일로드 (9)
(10)을 실행 파일 JS
 
DNS 캐시
  DNS는 "도메인 이름 시스템"의 약자이며, 그 작업은 서버 호스트의 IP 주소에 도메인 이름과 호스트 이름입니다;
  DNS 조회 과정 : 브라우저 캐시 - 로컬 호스트 파일 - 로컬 DNS 확인자 캐시 - 로컬 DNS 서버 - (리피터를 설정할지 여부를) 로컬 DNS 서버 설정 - 루트 DNS 서버

 클라이언트 측 캐싱의 브라우저 캐시

    메모리 캐시를 필요로하지 않고, 디스크 캐시;

    Etag입니다, 마지막-Modified304 인증이 필요한 요청;

    H5 새로운 로컬 스토리지, sessionStorage;

  캐싱의 더 합리적인 사용이 크게 프런트 엔드 성능을 향상시킬 수 있습니다.

  웹 사이트는 어떻게 해결하는 캐시?
  1. 파일 지아 Haxi
       파일 이름과 지문 정착에 강한 문제를 새로 고침 사용자가 필요로하는 온라인 후 1,
       발효 2 a.hash.js 해시 전체 a.js 파일의 MD5 값이고, 파일의 내용이 변경되지 해시 변하지 캐시
  캐시 파일을 해결하는 방법 (2)
   타임 스탬프를 추가 1. <스크립트 SRC = "/ a.js은? _T는 = XX">
   2. 버전 번호 추가 <스크립트 SRC =하는 "a.js은? / _V는 1.6 ="> 같은 JQ는 VUE 공공 도서관, 내용이 변경되지 않았습니다 다시
   지문 3.하지만 새로운 파일 생성 <= 스크립트 SRC를 "? / a.js을 H = abcd12sa"> 의 CDN 캐시를 해제 할 수는 없지만, 새로운 파일을 생성 문제 (HTML, JS 첫 번째에)있을 것
   4. 최종 최고의 생산 문서 <스크립트 SRC = "/ a.abcd12sa.js"의 탄생 > html로 웹팩 빌드 패키지로 처음 JS에,
 
최적화 전략
  1. 긴 연결
  2. 파일 크기를 줄이려면   
   1.js 압축 포장 
      1. 삭제 잘못된 문자 제외 감소 및 최적화 주석, 코드 의미, 코드 보호
      2. 온라인 사이트 압축, 압축 JS에 JS HTML 압축 HTML-minifier, 사용 uglifyjs2를 사용
      2. 이미지 압축
      1. 사이트의 사용은 일부 이미지는 하나의 이미지로 통합
      3.css 압축
     1. 삭제 잘못된 코드는 의미 합병을 CSS
      2. 온라인 사이트 압축, 압축 HTML CSS의 HTML-minifier, 청소 CSS를 압축 CSS의 사용을 사용
   4.html 압축
     1. 압축 의미하지만, 문자 등의 공백, 탭, 줄 바꿈, 코멘트를 포함하는 텍스트 파일에 HTML에 표시되지 않습니다
      , nodejs 2. 온라인 사이트 압축, 백엔드 템플릿 렌더링 엔진의 압축을 HTML-minifier 도구를 제공합니다
   gzip을 돌려 5.
   6. 파일 병합

    (1) 병합되지 않은 경우 ===> 파일 및 N의 증가의 사이에 삽입 된 업 링크 요청 - 1 개 지연 네트워크 더욱 영향 패킷 손실, 프록시 서버를 통해 분리 될 수있다

    2. 합병 ===> 환경 설정 스크린 렌더링 시간이 길어지면, 실패의 파일 캐시 넓은 영역

    3. 공공 도서관의 합병, 다른 페이지의 합병

    4. 파일 병합의 온라인 사이트, 병합 파일 nodejs 달성 사용

 요청 된 문서의 수를 줄이십시오
      1.도 스프라이트
      2.js, CSS 패키지
      3. 캐시 제어
      4. 지연로드
 사용자 및 서버 거리를 감소 4.
  (위치)
       1.cdn JS 캐시는 CDN으로 푸시 될 수있다
 로컬 저장소
  
 브라우저 캐시 메커니즘
  네트워크 속도와 느린 캐시에 게재 된 내용에 대한 액세스는 그래서 큰 오버 헤드, 클라이언트와 서버, 처리 시간의 콘텐츠를이 시간 지연 브라우저 사이에 여러 라운드 여행을위한 더 큰 대응의 필요성을 가지고 있지만, 또한 방문자 트래픽의 비용을 증가 재사용 캐시 성능 최적화하기 전에 자원을 확보 할 수있는 능력의 핵심 요소가되었다
  일반화 된 캐시가 넷으로 나눌 수 있습니다, 우리는 HttpCache에 더 익숙하다
      1.Http 캐시
      2.Service 노동자 캐시
      3.Memory 캐시
      4.Push 캐시

  HTTP 캐시
   브라우저 갱스터는 : main.js를 얻을 필요가 강한 볼에는 캐시가 없다
      1.Expires 및 캐시 제어 헤더이 강한 캐시를 제어 할 수

   2.expires : 2020년 3월 16일 (월) 그리니치 표준시 09시 50분 27초

   3.last - 수정 : 2018년 2월 15일 (목) 그리니치 표준시 14시 17분 52초

  메모리 캐시

    같은 일반적인 데이터 JS로, 단명 캐시 메모리는, 브라우저는 또한 자신의 전략, base64로 사진, 정적 리소스의 용량이 작은

  서비스 노동자 캐시

    자바 스크립트의 독립적 인 스레드를 메인 쓰레드, 그것은 무대 뒤에서 작동, 브라우저 창에서 분리, 것은 오프라인 캐싱 및 기타 네트워크 프록시를 할 수 있습니다

이미지 최적화

  사진의 직업은 일반적으로 가장 트래픽, PC의 최종 부하 평균 이미지 크기가 문화의 다른 유형을 사용하므로 이미지 최적화, 다른 시나리오를 들어, JS 파일 패키지보다 거의 더 큰 600K,이다
   1. JPG   
    1. 압축
       2. 작은 크기, 투명도를 지원하지 않습니다
         배경 3.도 회전

  2.png

    1. 압축, 고품질의 투명 지원
       같은 로고, 상품의 아이콘으로 2. 풍부한 색상 라인, 패널,
   3.svg
    1. 텍스트, 작은 볼륨, 벡터
       2. 렌더링 비용, 교육 비용
   도 4 스프라이트 표시된 이미지는 요청 수 HTTP를 줄이기 위해
 
GZIP
  HTTP 압축 처리는 HTTP 콘텐츠의 재인 코드의 목적 양을 감소시키는
  그 뒤에 Gzip 압축 원리는 어떤 문자열이 반복되는 텍스트 파일, 임시 파일 전체가 작은,이 원칙에 따라, 파일의 높은 비율이 반복되는 코드를 찾을 수 있도록, 교체 후 압축 효율에서 찾을 수 있습니다 높은 소득, 더 큰 사용 Gzip으로 그 반대는 반대 기본적으로 Gzip으로는의 nginx로, 라이브 서버를하고있다
 
로컬 저장소
   일반적인 로컬 스토리지 포맷 쿠키 localstroage sessionStroage indexDB
   1.cookie
      첫 번째 집합의 첫 번째 볼륨. 폐기물의 성능은, 모든 요청은 현재의 모든 도메인 이름을 가지고 있습니다.

    HTTP 요청이없는 상태에 있기 때문에, 그래서 필요한 쿠키입니다 클라이언트 상태를 유지는

    쿠키 생성 모드 : 설정 쿠키 HTTP 응답 헤더, 쿠키 document.cookie를 읽을 수있다 JS

    사용 : 상호 작용하는 브라우저 측 및 서버 측, 클라이언트 저장 자신의 데이터

    만료 : 만료

    저장 용량 제한 : 4킬로바이트의 크기에 대한 브라우저 매장으로, 당신은 만료 만료 시간을 설정해야

    쿠키 저장 용량은 로컬 스토리지를 대체

    Http 만 읽기 및 쓰기 JS 할 수 없습니다

    아래의 관련 도메인 이름의 쿠키 --- 손실 흐름 CDN. 해결 방법 : CDN 도메인 이름과 도메인 이름은 주요 역에서 분리 할

  2.Web 저장
      1. 저장 용량, 자동으로 전송하지 않는 서버는 제어 JS
   2.localstroage
     HTML5 브라우저는 저장을 위해 특별히 설계된
       5M 약의 크기
     클라이언트 사용에서뿐만 아니라 통신 및 서버
     인터페이스 패키지 바람직
     현지 브라우저 캐시 방식
   3.sessionStroage
    세션 수준의 브라우저에 저장
    5M 약의 크기
    클라이언트 사용에서뿐만 아니라 통신 및 서버
    인터페이스 패키지 바람직
    표준 양식 정보의 유지 보수를 위해
  3.indexDB
      브라우저에서 비 관계형 데이터베이스 실행
  4.pwa
   응용 프로그램 모델 기반 캐싱
     신뢰성 : 어떤 네트워크 환경은 기본 페이지 뷰를 제공 할 수 있습니다
    빠른 : 페이지 렌더링 및 네트워크 액세스에 대한 데이터는 더 나은 최적화를 가지고
         합병 :이 전체 화면이고 다른 특성을 밀어으로 응용 프로그램이 휴대 전화의 바탕 화면에 추가, 일반 응용 될 수있다

재 도장 역류

   역류성 : 우리는 DOM은 형상의 변화를 트리거 수정하면 다른 원소의 DOM의 소자의 기하학적 특성을 재 계산하는 브라우저 요구에, (기하학적 특성 및 위치 (예컨대 너비, 높이 또는 숨겨진 요소 등의 수정 요소로) 때문에 것 )의 영향, 그리고이 과정을 인출 결과를 계산 환류이다 (도 악화 행)
 
   다시 그리기 : 우리는 DOM 스타일의 변화를 야기 수정하면 있지만 (예 : 색상과 배경 색상을 수정하는 등) 기하학적 특성에 영향을 미치지 않았다 브라우저가 새 요소에 대한 직접 그려 요소의 기하학적 특성은 재 계산을 필요로하지 않는다 스타일 (도 역류에 도시 된 링크 생략). 이 과정은 다시 그리기라고
 
  이로부터 우리는 역류 반드시 다시 그릴지도, 반드시 다시 그리기로 연결되지 것을 알 수 있습니다
 
  역류가 가장 큰 영향입니다
      1. 형태, 폰트 크기
      스타일 시트를 증가합니다
      3. 내용 변경
      4.class 속성
      5.offserWidth 和는 offsetHeight
      6.fixed
스로틀과 손떨림
  스로틀
     소정의 기능만을 실행하게 할 때, 실행 기간보다, 호출주기를 수행
코드를 복사
// 많은 시간 스로틀 모든 함수 번 수행 
        CONST = 스로틀 (FUNC, 대기 = 100) => { 
            없이 기능이 100 밀리 횟수의 // 호출 
            lastTime = 0하자, 
            창 (인수를 ...) => { 
                . = 새 새로 만들기) () (이제 다음 getTime을 날짜를 할 
                경우 (현재 - lastTime> 대기가) { 
                    func.apply (this.args) 
                    lastTime 지금 = 
                } 
            } 
        } 

        의 I는 =하게 1;. 
        window.addEventListener ( '스크롤' 스로틀 (() => { 
            // 수행 지연로드를 사용하여 이미지 
            CONSOLE.LOG을 (I) 
            I =. + 1 
        }, 350))
코드를 복사

  

  흔들
     기능은 자주의 구현 전에 예비에 충분한 시간이있는 경우에만 발생하면
1
4
5
6
(7)
8
9
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)
(19)
(20)
(21)
(22)
(23)
24
/*
             校验用户是不是重复,用户输入完,向后端发送请求
             如果用户每次输入,都发生请求,造成请求过多
             用户停止输入字符串350毫秒,在发出
         */
 
         const  debounce = (func,wait = 350) =>{
             let  timer =0;
             return  (...args)=>{
                 if (timer) {
                     clearInterval(timer)
                 }
                 timer = setTimeout(() => {
                     func.apply( this ,args)
                 }, wait);
             }
         }
 
         let  i =1;
         window.addEventListener( 'scroll' ,debounce(()=>{
             // 验证
             console.log(i)
             i+=1
         },350))

  lazy-load

  对于一些图片多,页面长的网页来说,如果每次打开页面加载全部的网页内容,页面加载速度势必会受到影响,如果每次打开网页只将网页可视区域的内容加载给用户 ,将大大提高网页浏览速度,同时也减轻服务器负载,我们可以使用lazyload.js来实现对图片的延迟加载,当网页图片进入到浏览器可视区域时,才会去请求服务器加载图片。

  

코드를 복사
// 获取所有的图片
        const img = document.getElementsByTagName('img')
        // 获取可视区域的高度
        const viewHeight = window.innerHeight || document.documentElement.clientHeight;
        // num用于计算当前显示到那一张图片,避免每次都是从第一张开始检查是否漏出
        let num =0;
        function lazyload() {
            for(let i=num;i<img.length;i++) {
                // 用可是区域高度减去元素顶部距离可视区域顶部的高度
                let distance = viewHeight - img[i].getBoundingClientRect().top
                // 如果可视区域高度大于等于元素顶部距离可视区域顶部的高度,说明元素露出
                if(distance >=0) {
                    // 给元素写入真实的src,展示图片
                    img[i].src = img[i].getAttribute('data-src')
                    // 前i张图片已经加载完毕,,下次从第i+1张开始检查是否露出
                    num = i+1
                }
            }
        }
        // 监听scroll
        window.addEventListener('scroll',lazyload,false)
코드를 복사

 

performance.getEntriesByType('navigation')  性能检测

  通过在浏览器控制台输入这个命令,就可以检测到网页加载数据,检测网页加载性能

  

 

 

 

  列入:
      DNS查询耗时 通过使用domainLookupEnd - domainLookupStart  就等于dns查询的时间
      TCP链接耗时  通过 connectEnd - connectStart
      HTTP请求耗时 通过 responseEnd - responseStart 
      解析dom树耗时  通过 domComplete -  domInteractive
      白屏时间 通过 responseStart  - navigationStart
      DOMready时间 通过 domContentLoadedEventEnd - navigationStart
      onload时间 通过 loadEventEnd -  navigationStart 也即是onload回调函数执行的时间
 
Lighthouse插件
Lighthouse分析web应用程序和web页面,收集关于开发人员最佳实践的现代性能指标和见解,让开发人员根据生成的评估页面,来进行网站优化和完善,提高用户体验。
  1.可以在谷歌商店安装一个Lighthouse一个插件就可以了,下面我是检测github网站的数据
  2.使用node全局安装
npm install -g lighthouse

  安装完之后运行,也是找的github网址,运行成功之后,会弹出一个生成的html页面。

 

 生成一个html文件,找到然后直接打开就行

 

 

 

 浏览器渲染

  

  1.在这一步浏览器执行了所有的加载解析逻辑,在解析HTML的过程中发出了页面渲染所需要的各种外部资源请求
  2.浏览器将识别并加载所有的css样式信息与dom树合并,最终胜出页面render树,(:after :brfore这样的伪元素在这个环节被构建到DOM树中)
  3.页面中所有元素相对位置信息,大小等信息均在这一步得到计算
  4.在这一步浏览器会根据我们的DOM代码结果,把每一个页面图层转换为像素,并对所有的媒体文件进行解码
  5. 브라우저의 마지막 단계는 각 레이어를 병합합니다, 데이터가 CPU에 GPU가 결국 화면에 그리는 잃고 말 (우리는 실제로 최적화 애니메이션 성능을 위해,이 단계에 약간의 압력을 가져올 것이다 컴퓨팅 복잡한 GPU를보기 가끔 수동) 개별 뷰를 구별
 
  노골적 렌더링은 먼저 HTML을 기반으로 DOM 트리를 구축하는 것입니다, DOM 트리 Fengyun와 결합 CSSOM 이외에 CSS를 파서, 레이아웃과 계산에 모델 트리 레이아웃을 렌더링 할 수있는 레이아웃 렌더링 트리, 마지막으로 브라우저가 이미지를 그려, 우리는 첫 번째 페이지를 렌더링하면됩니다.
   
  새로운 요소는 DOM 트리에 추가 될 때마다 후, 브라우저는 그를 그리는 다시 다음 요소가 요소에 적용에 맞춰 스타일을 찾기 위해 엔진 검색 CSS를 CSS 스타일 시트를 통과 할 것

추천

출처www.cnblogs.com/adolfmc/p/12065776.html