Vue 페이지 뼈대 화면 구현 방법

php中世界最好的语言
풀어 주다: 2018-05-28 11:32:47
원래의
3054명이 탐색했습니다.

이번에는 Vue 페이지 스켈레톤 화면 구현 방법과 Vue 페이지 스켈레톤 화면 구현 시 주의 사항은 무엇인지 알아보겠습니다.

웹 앱을 개발할 때 우리는 항상 첫 화면의 로딩 시간이 길어서 영향을 받습니다. 로딩이 완료되기 전에 로딩 이미지 효과를 표시하는 것이 주류이며 일부 대기업에서는 서버 측 렌더링 아키텍처를 구성합니다. 이 문제를 해결하세요. SSR이 해결해야 할 일련의 문제를 고려할 때 점점 더 많은 앱이 사용자 경험을 개선하기 위해 '스켈레톤 스크린' 방식을 채택하고 있습니다.

Xiaomi Mall:

1. Vue 페이지의 콘텐츠 로딩 프로세스를 분석합니다.

vue 프로젝트의 항목 index.html에는 간단한 콘텐츠만 있습니다.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>Document</title>
</head>
<body>
  <p id="root">    
  </p>
  <script type="text/javascript" src="bundle.js"></script></body>
</body>
</html>
로그인 후 복사

js가 실행된 후, vue가 사용됩니다. 렌더링된 DOM은 p#root를 완전히 대체합니다. p#root完全替换掉。

我们在p#root中加入模拟骨架屏,在Chrome开发者工具调整网速:

<p id="root">
  这里是骨架屏
</p>
로그인 후 복사

由此可知,将骨架屏内容直接插入p#root中即可实现骨架屏。

二、使用vue-server-renderer来实现骨架屏

我们需要骨架屏也是一个单独的.vue文件,因此我们需要用到vue-server-renderer。对vue服务端渲染有所了解的同学一定知道,这个插件能够将vue项目在node端打包成一个bundle,然后由bundle生成对应的html。
首先是生成项目:

.
├── build
│  ├── webpack.config.client.js
│  └── webpack.config.server.js
├── src
│  └── views
│    ├── index
│    │  └── index.vue
│    ├── skeleton
│    │  └── skeleton.vue
│    ├── app.vue
│    ├── index.js
│    └── skeleton-entry.js
├── index.html
└── skeleton.js
└── package.json
로그인 후 복사

vue的服务端渲染一般会用vue-server-renderer将整个项目在node端打包成一份bundle,而这里我们只要一份有骨架屏的html,所以会有一个单独的骨架屏入口文件skeleton-entry.js,一个骨架屏打包webpack配置webpack.config.server.js,而skeleton.js作用是将webpack打包出来的bundle写入到index.html中。

//skeleton-entry.js
import Vue from 'vue'
import Skeleton from './views/skeleton/skeleton.vue'
export default new Vue({
 components: {
  Skeleton
 },
 template: '<skeleton />'
})
로그인 후 복사
//webpack.config.server.js
const path = require('path')
const { VueLoaderPlugin } = require('vue-loader')
const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
module.exports = {
 mode: process.env.NODE_ENV,
 target: 'node',
 entry: path.join(dirname, '../src/skeleton-entry.js'),
 output: {
  path: path.join(dirname, '../server-dist'),
  filename: 'server.bundle.js',
  libraryTarget: 'commonjs2'
 },
 module: {
  rules: [
   {
    test: /\.vue$/,
    loader: 'vue-loader'
   },
   {
    test: /\.css$/,
    use: [
     'vue-style-loader',
     'css-loader'
    ]
   }  
  ]
 },
 externals: Object.keys(require('../package.json').dependencies),
 resolve: {
  alias: {
   'vue$': 'vue/dist/vue.esm.js'
  }
 },
 plugins: [
  new VueLoaderPlugin(),
  new VueSSRServerPlugin({
   filename: 'skeleton.json'
  })
 ]
}
로그인 후 복사

其中骨架屏的webpack配置因为是node端,所以需要target: 'node' libraryTarget: 'commonjs2'。在VueSSRServerPlugin中,指定了其输出的json文件名。当执行webpack会在/server-dist目录下生成一个skeleton.json文件,这个文件记载了骨架屏的内容和样式,会提供给vue-server-renderer使用。

//skeleton.js
const fs = require('fs')
const path = require('path')
const createBundleRenderer = require('vue-server-renderer').createBundleRenderer
// 读取`skeleton.json`,以`index.html`为模板写入内容
const renderer = createBundleRenderer(path.join(dirname, './server-dist/skeleton.json'), {
 template: fs.readFileSync(path.join(dirname, './index.html'), 'utf-8')
})
// 把上一步模板完成的内容写入(替换)`index.html`
renderer.renderToString({}, (err, html) => {
 fs.writeFileSync('index.html', html, 'utf-8')
})
로그인 후 복사

注意,作为模板的html文件,需要在被写入内容的位置添加占位符,本例子在p#root里写入:

<p id="root">
<!--vue-ssr-outlet-->
</p>
로그인 후 복사

最后执行node skeleton就能实现vue的骨架屏。

最终的index.html

시뮬레이션된 스켈레톤 화면을 p#root에 추가하고 Chrome 개발자 도구에서 네트워크 속도를 조정했습니다:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <title>Document</title>
<style data-vue-ssr-id="a7049cb4:0">
.skeleton[data-v-61761ff8] {
 position: relative;
 height: 100%;
 overflow: hidden;
 padding: 15px;
 box-sizing: border-box;
 background: #fff;
}
.skeleton-nav[data-v-61761ff8] {
 height: 45px;
 background: #eee;
 margin-bottom: 15px;
}
.skeleton-swiper[data-v-61761ff8] {
 height: 160px;
 background: #eee;
 margin-bottom: 15px;
}
.skeleton-tabs[data-v-61761ff8] {
 list-style: none;
 padding: 0;
 margin: 0 -15px;
 display: flex;
 flex-wrap: wrap;
}
.skeleton-tabs-item[data-v-61761ff8] {
 width: 25%;
 height: 55px;
 box-sizing: border-box;
 text-align: center;
 margin-bottom: 15px;
}
.skeleton-tabs-item span[data-v-61761ff8] {
 display: inline-block;
 width: 55px;
 height: 55px;
 border-radius: 55px;
 background: #eee;
}
.skeleton-banner[data-v-61761ff8] {
 height: 60px;
 background: #eee;
 margin-bottom: 15px;
}
.skeleton-productions[data-v-61761ff8] {
 height: 20px;
 margin-bottom: 15px;
 background: #eee;
}
</style></head>
<body>
  <p id="root">
    <p data-server-rendered="true" class="skeleton page" data-v-61761ff8><p class="skeleton-nav" data-v-61761ff8></p> <p class="skeleton-swiper" data-v-61761ff8></p> <ul class="skeleton-tabs" data-v-61761ff8><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li><li class="skeleton-tabs-item" data-v-61761ff8><span data-v-61761ff8></span></li></ul> <p class="skeleton-banner" data-v-61761ff8></p> <p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p><p class="skeleton-productions" data-v-61761ff8></p></p>
  </p>
</body>
</html>
로그인 후 복사

스켈레톤 화면의 내용을 p에 직접 삽입하면 스켈레톤 화면을 구현할 수 있음을 알 수 있다 #root 화면.

2. vue-server-renderer를 사용하여 스켈레톤 화면 구현

스켈레톤 화면은 별도의 .vue 파일이 필요하므로 vue를 사용해야 합니다. -서버 -렌더러. Vue 서버 측 렌더링에 대해 알고 있는 학생은 이 플러그인이 Vue 프로젝트를 노드 측 번들로 패키징한 다음 번들에서 해당 HTML을 생성할 수 있다는 것을 알아야 합니다.
첫 번째 단계는 프로젝트를 생성하는 것입니다.

rrreee

Vue의 서버 측 렌더링은 일반적으로 vue-server-renderer를 사용하여 전체 프로젝트를 노드 측 번들로 패키징하며 여기서는 필요한 부분만 하나는 스켈레톤 화면 html이므로 별도의 스켈레톤 화면 항목 파일skeleton-이 있습니다. Entry.js code>, 스켈레톤 화면 패키지 webpack 구성 <code>webpack.config.server.jsskeleton.js는 webpack에 의해 패키지된 번들을 작성하는 데 사용됩니다. 색인 .html. rrreeerrreee
스켈레톤 화면의 웹팩 구성이 노드 측에 있기 때문에 target: 'node' libraryTarget: 'commonjs2'가 필요합니다. VueSSSRerverPlugin에서는 출력의 json 파일 이름이 지정됩니다. webpack이 실행되면 /server-dist 디렉터리에 skeleton.json 파일이 생성됩니다. 이 파일은 스켈레톤 화면의 내용과 스타일을 기록하고 vue-server에 제공됩니다. -렌더러사용.

rrreee🎜템플릿인 html 파일은 콘텐츠가 기록되는 위치에 자리 표시자를 추가해야 합니다. 이 예에서는 p#root를 입력합니다. 🎜 rrreee 🎜마지막으로 node Skeleton을 실행하여 vue의 스켈레톤 화면을 구현합니다. 🎜🎜최종 index.html:🎜rrreee🎜효과 살펴보기: 🎜🎜🎜🎜🎜이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 콘텐츠를 보려면 비용을 지불하세요. PHP 중국어 웹사이트의 다른 관련 기사에 주목하세요! 🎜🎜추천 도서: 🎜🎜🎜mpvue 애플릿 프로젝트 구축 방법🎜🎜🎜🎜🎜Chart.js 경량 차트 라이브러리 사용 단계에 대한 자세한 설명🎜🎜🎜

위 내용은 Vue 페이지 뼈대 화면 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!