웹 팩 에서 미리 렌 더 링 을 해서 첫 화면 공백 시간 을 낮 추 는 방법 을 자세히 설명 합 니 다.

1.브 라 우 저 렌 더 링 과정
1.사용자 가 페이지 를 열 고 공백 화면 으로 html 의 귀환 을 기다린다.
2.html 다운로드 완료,html 분석 시작,초기 렌 더 링
3.css,js 등 자원 을 다운로드 하고 js 렌 더 링 가상 DOM 을 실행 합 니 다.
4.요청,데이터 획득,렌 더 링 내용
다음은 프 리 렌 더 링 을 통 해 공백 화면 을 낮 추 는 방법 에 대해 논의 하 겠 습 니 다.
첫 화면 적재 시간 을 줄 이 는 것 은 중요 한 최적화 항목 으로 요약 하면 주로 다음 과 같은 몇 가지 방식 이 있다.
1.가능 한 한 웹 팩 이나 다른 포장 도구 로 생 성 된 가방 의 크기 를 줄 입 니 다.
2.서버 렌 더 링 방식 사용
3.미리 렌 더 링 하 는 방식 사용
4.gzip 를 사용 하여 네트워크 전송 의 유량 크기 를 줄인다.
5.페이지 나 구성 요소 에 따라 블록 을 나 누 어 게 으 름 피 우기
2.전통 페이지 개발
React,Vue 와 같은 데이터 구동 프레임 워 크 가 아직 유행 하지 않 았 을 때 보통 우 리 는 html 에 dom 구 조 를 직접 쓰 거나 직접 서버 에서 나 오기 때문에 html 페이지 를 다운로드 한 후에 공백 화면 시간 이 매우 짧 습 니 다.dom 은 html 에 있 기 때문에 지금 처럼 가상 dom 방식 으로 js 에 쓰 는 것 이 아 닙 니 다.그래서...저 희 는 js 다운로드 가 끝 난 후에 야 페이지 를 렌 더 링 할 필요 가 없습니다.html 다운로드 가 끝 난 후에 dom 구 조 를 직접 렌 더 링 합 니 다.
현재 우리 가 Vue 등 프레임 워 크 를 활용 하여 개발 할 때 html 구 조 는 보통 아래 와 같다.

<!DOCTYPE html>
<html lang="en">
  <head>
   <meta charset="UTF-8">
   <title>title</title>
  </head>
  <body>
   <div id="app"></div>
   <script src="/bound.js"></script>
  </body>
</html>
js 자원 이 다운로드 가 완료 되 지 않 은 상황 에서 페이지 는 항상 빈 페이지 에 있 습 니 다.가상 dom 이 id 가 app 인 div 에 삽입 되 기 를 기 다 려 야 합 니 다.이때 백 스크린 이 사라 지고 페이지 를 보 여주 기 시 작 했 습 니 다.어쨌든 사람 으로 하여 금 매우 느 리 게 느끼 게 하면 됩 니 다!
화이트 스크린 이 어떻게 생 겼 는 지 알 게 된 이상 웹 팩 에 미리 보 여 주 는 기능 을 통합 하여 화이트 스크린 의 시간 을 낮 추 는 방법 을 시도 해 보 겠 습 니 다.
3.웹 팩 에 프 리 렌 더 링 기능 통합
github: 웹 팩 에서 어떻게 미리 렌 더 링 기능 을 통합 합 니까?
vue 로 작 성 된 loading 구성 요 소 를 웹 팩 컴 파일 과정 에서 가상 dom 을 html 에 미리 렌 더 링 하려 고 합 니 다.다음은 loading 구성 요소 의 내용 입 니 다.

<template>
 <div class="loading-img"></div>
</template>

<script>
export default {}
</script>

<style>
.loading-img {
 position: fixed;
 top: 0;
 bottom: 0;
 right: 0;
 left: 0;
 margin: auto;
 display: inline-block;
 width: 60px;
 height: 60px;
 background: url(__inline__) no-repeat center center;
 background-size: contain;
}
</style>
위inline__뒤에 있 는 그림 에 삽입 할 태그 입 니 다.여 기 는 신경 쓰 지 마 세 요.사실 이 구성 요 소 는 간단 한 loading 구성 요소 입 니 다.
최종 적 으로 우리 가 원 하 는 효 과 는 이 vue 구성 요소 의 가상 dom 을 html 파일 에 미리 렌 더 링 하 는 것 입 니 다.

<html>
 <head>
  <meta charset="UTF-8">
  <title>test</title>
  <!-- pre-render-loading   css -->
  <style>
   .loading-img {
    position: fixed;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    margin: auto;
    display: inline-block;
    width: 60px;
    height: 60px;
    <!--       loading    base64     html  -->
    background: url(data:image/gif;base64,.....) no-repeat center center;
    background-size: contain;
   }
  </style>
  ...
 </head>

 <body>
  <div id="app">
   <!-- loading base64  -->
   <div class="loading-img"></div>
  </div>
  
  ...
 </body>
</html>
위로 그러면 html 페이지 가 돌아 올 때 base 64 에 html 에 설 치 된 loading 으로 컴 파일 하면 바로 표 시 됩 니 다.흰색 화면의 시간 을 크게 낮 추고 기본적으로 초 에 페이지 를 열 수 있 습 니 다.이때 우 리 는 js 자원 의 다운로드 와 가상 dom 의 삽입 을 기다 릴 필요 가 없습니다.물론 여기 loading 의 내용 은 미리 렌 더 링 하고 싶 은 템 플 릿 일 수 있 습 니 다.


여기 서 우리 의 loading 구성 요 소 는 vue 로 작 성 된 것 이기 때문에 우 리 는 어떻게 미리 렌 더 링 을 하고 웹 팩 에 통합 하 는 지 보 려 고 합 니 다.(창고 의 코드 와 함께 볼 수 있 습 니 다.코드 는 매우 간단 합 니 다.단지 demo 일 뿐 입 니 다)
여기 서 vue 단일 파일 의 html 와 css 를 따로 추출 합 니 다.

// render-loading.js

let vueAssets = null
let vueTplPath = resolvePath('./src/loading/pre-render-loading.vue')

const extractAssetsInVueTpl = (vueTplPath) => {
 let vueTpl = clearEnter(fs.readFileSync(vueTplPath).toString())
 let html = /<template>(.*)<\/template>/g.exec(vueTpl)[1]
 let css = /<style>(.*)<\/style>/g.exec(vueTpl)[1]

 return {
  html,
  css
 }
}

vueAssets = extractAssetsInVueTpl(vueTplPath)

여기 서 우 리 는 정규 방식 으로 template 와 style 탭 에 일치 하 는 내용 을 따로 추출 합 니 다.다음은 gif 그림 을 base 64 로 바 꾸 고 우리 가 추출 한 css 코드 에 삽입 해 야 합 니 다.

let gifPath = resolvePath('./src/loading/imgs/loading.gif')

const transGifToCSSFile = (imgPath) => {
 let ext = path.extname(imgPath).slice(1)
 let preStr = `data:image/${ext};base64,` //           base64  
 let bitDate = fs.readFileSync(imgPath)
 let base64Str = bitDate.toString('base64')
 let dataURL = preStr + base64Str

 return dataURL
}

let dataURL = transGifToCSSFile(gifPath)

위 에서 우 리 는 extractAssetsInVuetpl 함 수 를 통 해 css 를 추출 하 였 습 니 다.여기 서 우 리 는 간단 한 함 수 를 통 해 자리 표시 자 를 base 64 그림 으로 대체 합 니 다.

const injectDataURLToCSS = (cssStr, dataURL) => {
 return cssStr.replace(/__inline__/, dataURL)
}

let cssStr = injectDataURLToCSS(vueAssets.css, dataURL)

html 템 플 릿 과 style 스타일 문자열 을 포함 하여 loading 설정 을 내 보 냅 니 다.

loading.html = vueAssets.html
loading.css = '<style>' + cssStr + '</style>'

module.exports = loading

웹 팩 입구 설정 을 간단하게 작성 합 니 다.html-webpack-plugin 을 사용 하여 html 에 loading 을 삽입 해 야 합 니 다.(플러그 인의 사용자 정의 템 플 릿 을 사 용 했 습 니 다)

const HtmlWebpackPlugin = require('html-webpack-plugin')
const loading = require('./render-loading')

module.exports = {
 entry: './src/index.js',
 output: {
  path: __dirname + '/dist',
  filename: 'index_bundle.js'
 },
 plugins: [
  new HtmlWebpackPlugin({
   template: './src/index.html',
   loading: loading
  })
 ]
}

html 에서 우 리 는 템 플 릿 문법 을 통 해 loading 의 내용 을 html 템 플 릿 에 대응 하 는 위치 에 삽입 했다.

<html>
 <head>
  <meta charset="UTF-8">
  <title>test</title>
  ...
  <%= htmlWebpackPlugin.options.loading.css %>
 </head>

 <body>
  <div id="app">
   <!-- loading base64  -->
   <%= htmlWebpackPlugin.options.loading.html %>
  </div>
  
  ...
 </body>
</html>
총화
여기에 데모 만 써 서 원 리 를 소개 합 니 다.더 복잡 한 것 은 vue-server-render 를 사용 하여 같은 구 조 를 하거나 handlebars 와 같은 템 플 릿 엔진 을 사용 하여 템 플 릿 을 만 들 수 있 습 니 다.사실은 서버 의 렌 더 링 작업 을 컴 파일 하 는 과정 에 두 었 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기