多页面的骨架屏插件实现

一、前言

上一篇文章介绍了单一路由下的骨架屏插件实现。但在真实的产品中,其他页面也是要有各自的骨架屏的。

二、多路由骨架屏的原理

从上篇文章《开发一个简单易懂的webpack骨架屏插件》,可以知道骨架屏其实就是在js没有加载完成之前,在id为root的div里写一些动画代码,让用户不要看到一篇空白。

那多路由的骨架屏是怎样实现的呢? 我们都知道,css有个display属性可以用来显示隐藏一些DOM节点。而javascript中window.location.pathname和window.location.hash可以获取到当前路由的名称和hash值,既然我们可以知道当前的路由情况,所以我们可以配合css的display属性,实现不同路由之间的骨架屏切换。

(1)编写不同路由的骨架屏代码

以下是3个路由的骨架屏代码,他们的display属性一开始都为none。

<div id="root">
    <div style="background-color:red;height:300px;display:none;" id="default" >
        我是默认的骨架屏
    </div>
    <div style="background-color:red;height:300px;display:none;" id="user" >
        我是user的骨架屏
    </div>
    <div style="background-color:red;height:300px;display:none;" id="login" >
        我是login的骨架屏
    </div>
</div>
复制代码

(2)编写js代码,用来控制上面骨架屏的显示隐藏

<script>
  //获取到当前路由的名称和hash值
  var hash = window.location.hash;
  var path = window.location.pathname;
  if (path === '/login' || hash.startsWith('#/login')) {
    //当前路由为/login时,将上面的login骨架屏代码显示
    document.getElementById('login').style.display = 'block';
  } else if (path === '/user' || hash.startsWith('#/user')) {
      //当前路由为/user,将上面的user骨架屏代码显示
    document.getElementById('user').style.display = 'block';
  } else {
      //当前路由为/default时,将上面的default骨架屏代码显示
    document.getElementById('default').style.display = 'block';
  }
</script>
复制代码

(3)结合上一篇文章的骨架屏插件代码如下:

const HtmlWebpackPlugin = require('html-webpack-plugin');

class SkeletonPlugin {

  apply (compiler) {
    compiler.hooks.compilation.tap('SkeletonPlugin', (compilation) => {
      HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync(
        'SkeletonPlugin',
        (htmlData, cb) => {
          htmlData.html = htmlData.html.replace('<div id="root"></div>',`<div id="root">
          <div style="background-color:red;height:300px;display:none;" id="default" >
              我是默认的骨架屏
          </div>
          <div style="background-color:red;height:300px;display:none;" id="user" >
              我是user的骨架屏
          </div>
          <div style="background-color:red;height:300px;display:none;" id="login" >
              我是login的骨架屏
          </div>
        </div>
        <script>
              var hash = window.location.hash;
              var path = window.location.pathname;
              if (path === '/login' || hash.startsWith('#/login')) {
                document.getElementById('login').style.display = 'block';
              } else if (path === '/user' || hash.startsWith('#/user')) {
                document.getElementById('user').style.display = 'block';
              } else {
                document.getElementById('default').style.display = 'block';
              }
        </script>`);

        cb(null, htmlData)
      }
    )
  });
  }
}

module.exports = SkeletonPlugin;
复制代码

其实原理很简单,相信很多同学都可以明白。在这里我就不多说了。谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值