国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

在Vue中有關如何實現單頁面骨架屏

來源:懂視網 責編:小采 時間:2020-11-27 19:36:07
文檔

在Vue中有關如何實現單頁面骨架屏

在Vue中有關如何實現單頁面骨架屏:這篇文章主要給大家介紹了關于Vue單頁面骨架屏實踐的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起看看吧。關于骨架屏介紹骨架屏的作用主要是在網絡請求較慢時,提供基礎占位,當數據加載
推薦度:
導讀在Vue中有關如何實現單頁面骨架屏:這篇文章主要給大家介紹了關于Vue單頁面骨架屏實踐的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起看看吧。關于骨架屏介紹骨架屏的作用主要是在網絡請求較慢時,提供基礎占位,當數據加載
這篇文章主要給大家介紹了關于Vue單頁面骨架屏實踐的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

關于骨架屏介紹

骨架屏的作用主要是在網絡請求較慢時,提供基礎占位,當數據加載完成,恢復數據展示。這樣給用戶一種很自然的過渡,不會造成頁面長時間白屏或者閃爍等情況。 常見的骨架屏實現方案有ssr服務端渲染和prerender兩種解決方案。

這里主要通過代碼為大家展示如何一步步做出這樣一個骨架屏:

prerender 渲染骨架屏

本組件庫骨架屏的實現也是基于預渲染去實現的,有關于預渲染更詳細的介紹請參考這篇文章:處理 Vue 單頁面 Meta SEO的另一種思路 下面我們主要介紹其實現步驟,首先我們也是需要配置webpack-plugin,不過已經有實現好的prerender-spa-plugin可用

var path = require('path')
var PrerenderSpaPlugin = require('prerender-spa-plugin')
module.exports = {
 // ...
 plugins: [
 new PrerenderSpaPlugin(
 // Absolute path to compiled SPA
 path.join(__dirname, '../dist'),
 // List of routes to prerender
 ['/']
 )
 ]
}

然后寫好我們的骨架屏文件main.skeleton.vue

 <template>
 <p class="main-skeleton">
 <w-skeleton height="80px"></w-skeleton>
 <p>
 <p class="skeleton-container">
 <p class="skeleton">
 <w-skeleton height="300px"></w-skeleton>
 </p>
 <w-skeleton height="45px"></w-skeleton>
 </p>
 <p class="skeleton-bottom">
 <w-skeleton height="45px"></w-skeleton>
 </p>
 </p>
 </p>
</template>

當初次進入頁面的時候我們需要顯示骨架屏,數據加載完,我們需要移除骨架屏:

 <template>
 <p id="app">
 <mainSkeleton v-if="!init"></mainSkeleton>
 <p v-else>
 <p class="body"></p>
 </p>
 </p>
</template>
<script>
 import mainSkeleton from './main.skeleton.vue'
 export default {
 name: 'app',
 data () {
 return {
 init: false
 }
 },
 mounted () {
 // 這里模擬數據請求
 setTimeout(() => {
 this.init = true
 }, 250)
 },
 components: {
 mainSkeleton
 }
 }
</script>

ssr 渲染骨架屏

下面我用我靈魂畫師的筆法,畫出了大致的過程:

首先創建我們的skeleton.entry.js

import Vue from 'vue';
import Skeleton from './skeleton.vue';
export default new Vue({
 components: {
 Skeleton
 },
 template: '<skeleton />'
});

當然這里的skeleton.vue使我們事先寫好的骨架屏組件,看起來可能是這樣:

 <template>
 <p class="skeleton-wrapper">
 <header class="skeleton-header"></header>
 <p class="skeleton-block"></p>
 </p>
</template>

然后我們需要的是能把skeleton.entry.js編譯成服務端渲染可用的bundle文件,所以我們需要有個編譯骨架屏的webpack.ssr.conf.js文件:

const path = require('path');
const merge = require('webpack-merge');
const baseWebpackConfig = require('./webpack.base.conf');
const nodeExternals = require('webpack-node-externals');
function resolve(dir) {
 return path.join(__dirname, dir);
}
module.exports = merge(baseWebpackConfig, {
 target: 'node',
 devtool: false,
 entry: {
 app: resolve('./src/skeleton.entry.js')
 },
 output: Object.assign({}, baseWebpackConfig.output, {
 libraryTarget: 'commonjs2'
 }),
 externals: nodeExternals({
 whitelist: /\.css$/
 }),
 plugins: []
});

接下來最終的步驟,就是編寫我們的webpackPlugin,我們期望我們的webpackPlugin可以幫我們把入口文件編譯成bundle,然后再通過vue-server-renderer來render bundle,最終產出響應的html片段和css片段,這里貼出核心代碼:

 // webpack start to work
 var serverCompiler = webpack(serverWebpackConfig);
 var mfs = new MFS();
 // output to mfs
 serverCompiler.outputFileSystem = mfs;
 serverCompiler.watch({}, function (err, stats) {

 if (err) {
 reject(err);
 return;
 }
 stats = stats.toJson();
 stats.errors.forEach(function (err) {
 console.error(err);
 });
 stats.warnings.forEach(function (err) {
 console.warn(err);
 });
 var bundle = mfs.readFileSync(outputPath, 'utf-8');
 var skeletonCss = mfs.readFileSync(outputCssPath, 'utf-8');
 // create renderer with bundle
 var renderer = createBundleRenderer(bundle);
 // use vue ssr to render skeleton
 renderer.renderToString({}, function (err, skeletonHtml) {
 if (err) {
 reject(err);
 }
 else {
 resolve({skeletonHtml: skeletonHtml, skeletonCss: skeletonCss});
 }
 });
 });

最后一步,我們對產出的html片段, css片段進行組裝,產出最終的html,所以我們需要監聽webpack 的編譯掛載之前的事件:

compiler.plugin('compilation', function (compilation) {
 // add listener for html-webpack-plugin
 compilation.plugin('html-webpack-plugin-before-html-processing', function (htmlPluginData, callback) {
 ssr(webpackConfig).then(function (ref) {
 var skeletonHtml = ref.skeletonHtml;
 var skeletonCss = ref.skeletonCss;
 // insert inlined styles into html
 var headTagEndPos = htmlPluginData.html.lastIndexOf('</head>');
 htmlPluginData.html = insertAt(htmlPluginData.html, ("<style>" + skeletonCss + "</style>"), headTagEndPos);

 // replace mounted point with ssr result in html
 var appPos = htmlPluginData.html.lastIndexOf(insertAfter) + insertAfter.length;
 htmlPluginData.html = insertAt(htmlPluginData.html, skeletonHtml, appPos);
 callback(null, htmlPluginData);
 });
 });
 });

github 地址: VV-UI/VV-UI

演示地址: vv-ui

文檔地址:skeleton

上面是我整理給大家的,希望今后會對大家有幫助。

相關文章:

詳細解答Webpack+Babel+React環境搭建(詳細教程)

詳細介紹webpack中scss的相關配置

在Vue中項目組件化開發(詳細教程)

如何實現webpack多入口文件打包配置

在JavaScript中如何實現多重繼承

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

在Vue中有關如何實現單頁面骨架屏

在Vue中有關如何實現單頁面骨架屏:這篇文章主要給大家介紹了關于Vue單頁面骨架屏實踐的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起看看吧。關于骨架屏介紹骨架屏的作用主要是在網絡請求較慢時,提供基礎占位,當數據加載
推薦度:
標簽: VUE 頁面 實現
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产日韩欧美精品在线 | 精品一区二区三区免费观看 | 一区二区视频在线观看 | 欧美色图网站 | 久久综合精品国产一区二区三区 | 综合婷婷 | 欧美一区二区在线视频 | 在线观看免费精品国产 | 国产精品免费精品自在线观看 | 老色99久久九九精品尤物 | 国产成人乱码一区二区三区在线 | 黄网站色视频免费观看 | 欧美日韩中文 | 国产综合精品一区二区 | 亚洲欧美另类在线 | 可以免费看的毛片 | 亚洲欧美日韩精品高清 | 久久夜色精品国产亚洲 | 亚洲欧美国产精品专区久久 | 特级一级全黄毛片免费 | 毛片免费网站 | 国产欧美成人一区二区三区 | 欧美阿v高清资源在线 | 日日综合 | 在线一区观看 | 91精品国产91久久综合 | 亚洲视频一区二区 | 精品日韩一区 | 欧美在线视频网站 | 免费一看一级毛片全播放 | 欧美第一网站 | 亚洲最大色网 | 国产精品美女流白浆视频 | 亚洲国产成人久久99精品 | 亚洲精品乱码久久久久久v 亚洲精品免费观看 | 日韩欧美高清 | 一区二区三区精品牛牛 | 久久一级毛片 | 久久久久久综合一区中文字幕 | 精品免费久久久久国产一区 | 在线观看免费精品国自产 |