<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        在Vue中有關(guān)如何實現(xiàn)單頁面骨架屏

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 19:36:07
        文檔

        在Vue中有關(guān)如何實現(xiàn)單頁面骨架屏

        在Vue中有關(guān)如何實現(xiàn)單頁面骨架屏:這篇文章主要給大家介紹了關(guān)于Vue單頁面骨架屏實踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。關(guān)于骨架屏介紹骨架屏的作用主要是在網(wǎng)絡(luò)請求較慢時,提供基礎(chǔ)占位,當(dāng)數(shù)據(jù)加載
        推薦度:
        導(dǎo)讀在Vue中有關(guān)如何實現(xiàn)單頁面骨架屏:這篇文章主要給大家介紹了關(guān)于Vue單頁面骨架屏實踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。關(guān)于骨架屏介紹骨架屏的作用主要是在網(wǎng)絡(luò)請求較慢時,提供基礎(chǔ)占位,當(dāng)數(shù)據(jù)加載
        這篇文章主要給大家介紹了關(guān)于Vue單頁面骨架屏實踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。

        關(guān)于骨架屏介紹

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

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

        prerender 渲染骨架屏

        本組件庫骨架屏的實現(xiàn)也是基于預(yù)渲染去實現(xiàn)的,有關(guān)于預(yù)渲染更詳細(xì)的介紹請參考這篇文章:處理 Vue 單頁面 Meta SEO的另一種思路 下面我們主要介紹其實現(xiàn)步驟,首先我們也是需要配置webpack-plugin,不過已經(jīng)有實現(xiàn)好的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>

        當(dāng)初次進(jìn)入頁面的時候我們需要顯示骨架屏,數(shù)據(jù)加載完,我們需要移除骨架屏:

         <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 () {
         // 這里模擬數(shù)據(jù)請求
         setTimeout(() => {
         this.init = true
         }, 250)
         },
         components: {
         mainSkeleton
         }
         }
        </script>

        ssr 渲染骨架屏

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

        首先創(chuàng)建我們的skeleton.entry.js

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

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

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

        然后我們需要的是能把skeleton.entry.js編譯成服務(wù)端渲染可用的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,最終產(chǎn)出響應(yīng)的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});
         }
         });
         });

        最后一步,我們對產(chǎn)出的html片段, css片段進(jìn)行組裝,產(chǎn)出最終的html,所以我們需要監(jiān)聽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

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

        相關(guān)文章:

        詳細(xì)解答Webpack+Babel+React環(huán)境搭建(詳細(xì)教程)

        詳細(xì)介紹webpack中scss的相關(guān)配置

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

        如何實現(xiàn)webpack多入口文件打包配置

        在JavaScript中如何實現(xiàn)多重繼承

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

        文檔

        在Vue中有關(guān)如何實現(xiàn)單頁面骨架屏

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲成a人片在线观看无码 | 啦啦啦在线免费视频| 亚洲精品国产精品乱码视色| 一级特黄a大片免费| 亚洲无码视频在线| 亚洲免费在线观看| 丁香五月亚洲综合深深爱| 一级日本高清视频免费观看| 伊人久久大香线蕉亚洲五月天| xvideos永久免费入口| 国产av无码专区亚洲av果冻传媒 | 国产免费网站看v片在线| 国产亚洲精AA在线观看SEE| 男人进去女人爽免费视频国产| 久久精品亚洲一区二区| 永久在线免费观看| 亚洲综合精品第一页| 免费一级毛片在级播放| 国产日韩精品无码区免费专区国产| 亚洲午夜久久久久久久久久| 久别的草原电视剧免费观看| 在线观看亚洲AV日韩AV| 亚洲成A∨人片天堂网无码| 国偷自产一区二区免费视频| 亚洲中文字幕久在线| 国产男女猛烈无遮挡免费网站| 欧洲美女大片免费播放器视频| 亚洲精品午夜无码电影网| 91香焦国产线观看看免费| 在线观看日本亚洲一区| 激情97综合亚洲色婷婷五| 57pao国产成视频免费播放| 亚洲暴爽av人人爽日日碰| 亚洲中文字幕无码不卡电影| 亚洲一区二区免费视频| 男男gvh肉在线观看免费| 亚洲电影国产一区| 国产极品粉嫩泬免费观看| 最近免费中文字幕MV在线视频3| 亚洲欧洲另类春色校园网站| 国产亚洲自拍一区|