<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頁面骨架屏注入步驟詳解

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

        Vue頁面骨架屏注入步驟詳解

        Vue頁面骨架屏注入步驟詳解:這次給大家?guī)鞻ue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來看一下。作為與用戶聯(lián)系最為密切的前端開發(fā)者,用戶體驗(yàn)是最值得關(guān)注的問題。關(guān)于頁面loading狀態(tài)的展示,主流的主要有l(wèi)oading圖和進(jìn)度條兩種。除此之
        推薦度:
        導(dǎo)讀Vue頁面骨架屏注入步驟詳解:這次給大家?guī)鞻ue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來看一下。作為與用戶聯(lián)系最為密切的前端開發(fā)者,用戶體驗(yàn)是最值得關(guān)注的問題。關(guān)于頁面loading狀態(tài)的展示,主流的主要有l(wèi)oading圖和進(jìn)度條兩種。除此之
        這次給大家?guī)鞻ue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來看一下。

        作為與用戶聯(lián)系最為密切的前端開發(fā)者,用戶體驗(yàn)是最值得關(guān)注的問題。關(guān)于頁面loading狀態(tài)的展示,主流的主要有l(wèi)oading圖和進(jìn)度條兩種。除此之外,越來越多的APP采用了“骨架屏”的方式去展示未加載內(nèi)容,給予了用戶煥然一新的體驗(yàn)。隨著SPA在前端界的逐漸流行,首屏加載的問題也在困擾著開發(fā)者們。那么有沒有一個(gè)辦法,也能讓SPA用上骨架屏呢?這就是這篇文章將要探討的問題。

        文章相關(guān)代碼已經(jīng)同步到 Github ,歡迎查閱~

        一、何為骨架屏

        簡單來說,骨架屏就是在頁面內(nèi)容未加載完成的時(shí)候,先使用一些圖形進(jìn)行占位,待內(nèi)容加載完成之后再把它替換掉。

        這個(gè)技術(shù)在一些以內(nèi)容為主的APP和網(wǎng)頁應(yīng)用較多,接下來我們以一個(gè)簡單的Vue工程為例,一起探索如何在基于Vue的SPA項(xiàng)目中實(shí)現(xiàn)骨架屏。

        二、分析Vue頁面的內(nèi)容加載過程

        為了簡單起見,我們使用 vue-cli 搭配 webpack-simple 這個(gè)模板來新建項(xiàng)目:

        vue init webpack-simple vue-skeleton

        這時(shí)我們便獲得了一個(gè)最基本的Vue項(xiàng)目:

        ├── package.json
        ├── src
        │ ├── App.vue
        │ ├── assets
        │ └── main.js
        ├── index.html
        └── webpack.conf.js

        安裝完了依賴以后,便可以通過 npm run dev 去運(yùn)行這個(gè)項(xiàng)目了。但是,在運(yùn)行項(xiàng)目之前,我們先看看入口的html文件里面都寫了些什么。

        <!DOCTYPE html>
        <html lang="en">
         <head>
         <meta charset="utf-8">
         <title>vue-skeleton</title>
         </head>
         <body>
         <p id="app"></p>
         <script src="/dist/build.js"></script>
         </body>
        </html>

        可以看到,DOM里

        面有且僅有一個(gè) p#app ,當(dāng)js被執(zhí)行完成之后,此 p#app 會被 整個(gè)替換掉 ,因此,我們可以來做一下實(shí)驗(yàn),在此p里面添加一些內(nèi)容:

        <p id="app">
         <p>Hello skeleton</p>
         <p>Hello skeleton</p>
         <p>Hello skeleton</p>
        </p>

        打開chrome的開發(fā)者工具,在 Network 里面找到 throttle 功能,調(diào)節(jié)網(wǎng)速為“Slow 3G”,刷新頁面,就能看到頁面先是展示了三句“Hello skeleton”,待js加載完了才會替換為原本要展示的內(nèi)容。

        現(xiàn)在,我們對于如何在Vue頁面實(shí)現(xiàn)骨架屏,已經(jīng)有了一個(gè)很清晰的思路——在 p#app 內(nèi)直接插入骨架屏相關(guān)內(nèi)容即可。

        三、易維護(hù)的方案

        顯然,手動在 p#app 里面寫入骨架屏內(nèi)容是不科學(xué)的,我們需要一個(gè)擴(kuò)展性強(qiáng)且自動化的易維護(hù)方案。既然是在Vue項(xiàng)目里,我們當(dāng)然希望所謂的骨架屏也是一個(gè) .vue 文件,它能夠在構(gòu)建時(shí)由工具自動注入到 p#app 里面。

        首先,我們在 /src 目錄下新建一個(gè) Skeleton.vue 文件,其內(nèi)容如下:

        <template>
         <p class="skeleton page">
         <p class="skeleton-nav"></p>
         <p class="skeleton-swiper"></p>
         <ul class="skeleton-tabs">
         <li v-for="i in 8" class="skeleton-tabs-item"><span></span></li>
         </ul>
         <p class="skeleton-banner"></p>
         <p v-for="i in 6" class="skeleton-productions"></p>
         </p>
        </template>
        <style>
        .skeleton {
         position: relative;
         height: 100%;
         overflow: hidden;
         padding: 15px;
         box-sizing: border-box;
         background: #fff;
        }
        .skeleton-nav {
         height: 45px;
         background: #eee;
         margin-bottom: 15px;
        }
        .skeleton-swiper {
         height: 160px;
         background: #eee;
         margin-bottom: 15px;
        }
        .skeleton-tabs {
         list-style: none;
         padding: 0;
         margin: 0 -15px;
         display: flex;
         flex-wrap: wrap;
        }
        .skeleton-tabs-item {
         width: 25%;
         height: 55px;
         box-sizing: border-box;
         text-align: center;
         margin-bottom: 15px;
        }
        .skeleton-tabs-item span {
         display: inline-block;
         width: 55px;
         height: 55px;
         border-radius: 55px;
         background: #eee;
        }
        .skeleton-banner {
         height: 60px;
         background: #eee;
         margin-bottom: 15px;
        }
        .skeleton-productions {
         height: 20px;
         margin-bottom: 15px;
         background: #eee;
        }
        </style>

        接下來,再新建一個(gè) skeleton.entry.js 入口文件:

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

        在完成了骨架屏的準(zhǔn)備之后,就輪到一個(gè)關(guān)鍵插件 vue-server-renderer 登場了。該插件本用于服務(wù)端渲染,但是在這個(gè)例子里,我們主要利用它能夠把 .vue 文件處理成 html 和 css 字符串的功能,來完成骨架屏的注入,流程如下:

        四、方案實(shí)現(xiàn)

        根據(jù)流程圖,我們還需要在根目錄新建一個(gè) webpack.skeleton.conf.js 文件,以專門用來進(jìn)行骨架屏的構(gòu)建。

        const path = require('path')
        const webpack = require('webpack')
        const nodeExternals = require('webpack-node-externals')
        const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
        module.exports = {
         target: 'node',
         entry: {
         skeleton: './src/skeleton.js'
         },
         output: {
         path: path.resolve(dirname, './dist'),
         publicPath: '/dist/',
         filename: '[name].js',
         libraryTarget: 'commonjs2'
         },
         module: {
         rules: [
         {
         test: /\.css$/,
         use: [
         'vue-style-loader',
         'css-loader'
         ]
         },
         {
         test: /\.vue$/,
         loader: 'vue-loader'
         }
         ]
         },
         externals: nodeExternals({
         whitelist: /\.css$/
         }),
         resolve: {
         alias: {
         'vue$': 'vue/dist/vue.esm.js'
         },
         extensions: ['*', '.js', '.vue', '.json']
         },
         plugins: [
         new VueSSRServerPlugin({
         filename: 'skeleton.json'
         })
         ]
        }

        可以看到,該配置文件和普通的配置文件基本完全一致,主要的區(qū)別在于其 target: 'node' ,配置了 externals ,以及在 plugins 里面加入了 VueSSRServerPlugin 。在 VueSSRServerPlugin 中,指定了其輸出的json文件名。我們可以通過運(yùn)行下列指令,在 /dist 目錄下生成一個(gè) skeleton.json 文件:

        webpack --config ./webpack.skeleton.conf.js

        這個(gè)文件在記載了骨架屏的內(nèi)容和樣式,會提供給 vue-server-renderer 使用。

        接下來,在根目錄下新建一個(gè) skeleton.js ,該文件即將被用于往 index.html 內(nèi)插入骨架屏。

        const fs = require('fs')
        const { resolve } = require('path')
        const createBundleRenderer = require('vue-server-renderer').createBundleRenderer
        // 讀取`skeleton.json`,以`index.html`為模板寫入內(nèi)容
        const renderer = createBundleRenderer(resolve(dirname, './dist/skeleton.json'), {
         template: fs.readFileSync(resolve(dirname, './index.html'), 'utf-8')
        })
        // 把上一步模板完成的內(nèi)容寫入(替換)`index.html`
        renderer.renderToString({}, (err, html) => {
         fs.writeFileSync('index.html', html, 'utf-8')
        })

        注意,作為模板的 html 文件,需要在被寫入內(nèi)容的位置添加 <!--vue-ssr-outlet--> 占位符,本例子在 p#app 里寫入:

        <p id="app">
         <!--vue-ssr-outlet-->
        </p>

        接下來,只要運(yùn)行 node skeleton.js ,就可以完成骨架屏的注入了。運(yùn)行效果如下:

        <html lang="en">
         <head>
         <meta charset="utf-8">
         <title>vue-skeleton</title>
         <style data-vue-ssr-id="742d88be:0">
        .skeleton {
         position: relative;
         height: 100%;
         overflow: hidden;
         padding: 15px;
         box-sizing: border-box;
         background: #fff;
        }
        .skeleton-nav {
         height: 45px;
         background: #eee;
         margin-bottom: 15px;
        }
        .skeleton-swiper {
         height: 160px;
         background: #eee;
         margin-bottom: 15px;
        }
        .skeleton-tabs {
         list-style: none;
         padding: 0;
         margin: 0 -15px;
         display: flex;
         flex-wrap: wrap;
        }
        .skeleton-tabs-item {
         width: 25%;
         height: 55px;
         box-sizing: border-box;
         text-align: center;
         margin-bottom: 15px;
        }
        .skeleton-tabs-item span {
         display: inline-block;
         width: 55px;
         height: 55px;
         border-radius: 55px;
         background: #eee;
        }
        .skeleton-banner {
         height: 60px;
         background: #eee;
         margin-bottom: 15px;
        }
        .skeleton-productions {
         height: 20px;
         margin-bottom: 15px;
         background: #eee;
        }
        </style></head>
         <body>
         <p id="app">
         <p data-server-rendered="true" class="skeleton page"><p class="skeleton-nav"></p> <p class="skeleton-swiper"></p> <ul class="skeleton-tabs"><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li></ul> <p class="skeleton-banner"></p> <p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p></p>
         </p>
         <script src="/dist/build.js"></script>
         </body>
        </html>

        可以看到,骨架屏的樣式通過 <style></style> 標(biāo)簽直接被插入,而骨架屏的內(nèi)容也被放置在 p#app 之間。當(dāng)然,我們還可以進(jìn)一步處理,把這些內(nèi)容都壓縮一下。改寫 skeleton.js ,在里面添加 html-minifier :
        ...

        + const htmlMinifier = require('html-minifier')
        ...
        renderer.renderToString({}, (err, html) => {
        + html = htmlMinifier.minify(html, {
        + collapseWhitespace: true,
        + minifyCSS: true
        + })
         fs.writeFileSync('index.html', html, 'utf-8')
        })

        來看看效果:

        效果非常不錯!至此,Vue頁面接入骨架屏已經(jīng)完全實(shí)現(xiàn)了。

        如果還有任何更好的實(shí)現(xiàn)思路,也歡迎和我探討,有機(jī)會我也會總結(jié)基于 React 的骨架屏注入實(shí)踐,敬請期待!

        相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注Gxl網(wǎng)其它相關(guān)文章!

        推薦閱讀:

        jQuery類名選擇器(.class)使用方法詳解

        vue引入js數(shù)字小鍵盤步驟詳解

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

        文檔

        Vue頁面骨架屏注入步驟詳解

        Vue頁面骨架屏注入步驟詳解:這次給大家?guī)鞻ue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來看一下。作為與用戶聯(lián)系最為密切的前端開發(fā)者,用戶體驗(yàn)是最值得關(guān)注的問題。關(guān)于頁面loading狀態(tài)的展示,主流的主要有l(wèi)oading圖和進(jìn)度條兩種。除此之
        推薦度:
        標(biāo)簽: VUE 頁面 骨架
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产亚洲漂亮白嫩美女在线| 亚洲精品在线视频观看| 亚洲乱码日产精品一二三| 久久久久久毛片免费播放| 亚洲国产精品久久66| 国产精品99精品久久免费| 亚洲色图在线播放| 四虎影视在线影院在线观看免费视频 | 亚洲精品成人在线| 男女污污污超污视频免费在线看| 国产乱人免费视频| 特级一级毛片免费看| 亚洲国产精品自在拍在线播放| 三年片在线观看免费观看大全中国| 国产区卡一卡二卡三乱码免费| 日韩一级片免费观看| 国产亚洲美女精品久久久| 国产日韩精品无码区免费专区国产| 丁香五月亚洲综合深深爱| 青青草原1769久久免费播放| 亚洲精品自在线拍| 噼里啪啦电影在线观看免费高清| 亚洲中文字幕久久精品蜜桃| 在线免费观看中文字幕| 日韩a毛片免费观看| 国产亚洲人成无码网在线观看| 精品一区二区三区免费毛片爱 | 亚洲免费电影网站| 成年女人午夜毛片免费看| 猫咪免费观看人成网站在线| 亚洲精品无码午夜福利中文字幕| h视频在线观看免费完整版| 亚洲精品无码人妻无码 | 亚洲av无码专区在线播放| 亚洲精品在线免费观看| 久久精品熟女亚洲av麻豆| 亚洲精品无码MV在线观看| 成人免费毛片内射美女APP| fc2成年免费共享视频网站| 亚洲精品视频在线免费| 免费真实播放国产乱子伦|