• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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:48:14
    文檔

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

    Vue頁面骨架屏注入步驟詳解:這次給大家帶來Vue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項有哪些,下面就是實戰案例,一起來看一下。作為與用戶聯系最為密切的前端開發者,用戶體驗是最值得關注的問題。關于頁面loading狀態的展示,主流的主要有loading圖和進度條兩種。除此之
    推薦度:
    導讀Vue頁面骨架屏注入步驟詳解:這次給大家帶來Vue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項有哪些,下面就是實戰案例,一起來看一下。作為與用戶聯系最為密切的前端開發者,用戶體驗是最值得關注的問題。關于頁面loading狀態的展示,主流的主要有loading圖和進度條兩種。除此之
    這次給大家帶來Vue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項有哪些,下面就是實戰案例,一起來看一下。

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

    文章相關代碼已經同步到 Github ,歡迎查閱~

    一、何為骨架屏

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

    這個技術在一些以內容為主的APP和網頁應用較多,接下來我們以一個簡單的Vue工程為例,一起探索如何在基于Vue的SPA項目中實現骨架屏。

    二、分析Vue頁面的內容加載過程

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

    vue init webpack-simple vue-skeleton

    這時我們便獲得了一個最基本的Vue項目:

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

    安裝完了依賴以后,便可以通過 npm run dev 去運行這個項目了。但是,在運行項目之前,我們先看看入口的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里

    面有且僅有一個 p#app ,當js被執行完成之后,此 p#app 會被 整個替換掉 ,因此,我們可以來做一下實驗,在此p里面添加一些內容:

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

    打開chrome的開發者工具,在 Network 里面找到 throttle 功能,調節網速為“Slow 3G”,刷新頁面,就能看到頁面先是展示了三句“Hello skeleton”,待js加載完了才會替換為原本要展示的內容。

    現在,我們對于如何在Vue頁面實現骨架屏,已經有了一個很清晰的思路——在 p#app 內直接插入骨架屏相關內容即可。

    三、易維護的方案

    顯然,手動在 p#app 里面寫入骨架屏內容是不科學的,我們需要一個擴展性強且自動化的易維護方案。既然是在Vue項目里,我們當然希望所謂的骨架屏也是一個 .vue 文件,它能夠在構建時由工具自動注入到 p#app 里面。

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

    <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>

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

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

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

    四、方案實現

    根據流程圖,我們還需要在根目錄新建一個 webpack.skeleton.conf.js 文件,以專門用來進行骨架屏的構建。

    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'
     })
     ]
    }

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

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

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

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

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

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

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

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

    <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> 標簽直接被插入,而骨架屏的內容也被放置在 p#app 之間。當然,我們還可以進一步處理,把這些內容都壓縮一下。改寫 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頁面接入骨架屏已經完全實現了。

    如果還有任何更好的實現思路,也歡迎和我探討,有機會我也會總結基于 React 的骨架屏注入實踐,敬請期待!

    相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

    推薦閱讀:

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

    vue引入js數字小鍵盤步驟詳解

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

    文檔

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

    Vue頁面骨架屏注入步驟詳解:這次給大家帶來Vue頁面骨架屏注入步驟詳解,Vue頁面骨架屏注入的注意事項有哪些,下面就是實戰案例,一起來看一下。作為與用戶聯系最為密切的前端開發者,用戶體驗是最值得關注的問題。關于頁面loading狀態的展示,主流的主要有loading圖和進度條兩種。除此之
    推薦度:
    標簽: VUE 頁面 骨架
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品免费久久| 久久www免费人成精品香蕉| 国产精品gz久久久| 精品卡一卡二卡乱码高清| 免费精品视频在线| 99国产精品国产免费观看| 8x福利精品第一导航| 少妇人妻偷人精品免费视频| 欧美亚洲另类精品第一页| 国产精品免费看久久久香蕉| 久久精品国产亚洲网站| 97久久精品人妻人人搡人人玩 | 欧美日韩精品| 白浆都出来了视频国产精品| 国产一区二区精品久久| 国产AV国片精品有毛| 久久99国产精品尤物| 四虎国产精品永久在线观看| 亚洲麻豆精品国偷自产在线91| 久久99精品久久久久久野外| 国产精品亚洲w码日韩中文| 国产成人久久精品麻豆一区| 亚洲日韩精品欧美一区二区| 欧美高清在线精品一区| 久久精品国产只有精品2020| 国产精品污视频| 精品国产福利第一区二区三区| 国产成人精品免费视频动漫| 69久久精品无码一区二区| 国产精品精品自在线拍| 国产精品无码无需播放器| 国产精品乱码高清在线观看| 国产精品多p对白交换绿帽| 精品亚洲成a人片在线观看| 精品少妇无码AV无码专区| 精品综合久久久久久888蜜芽| 久久精品亚洲一区二区三区浴池| 久久国产精品成人影院| 国产精品午睡沙发系列| 99在线精品一区二区三区| 91精品国产9l久久久久|