【Web】骨架屏

news2024/12/25 13:25:18

文章目录

  • 概述
  • 骨架屏的实现方案
  • page-skeleton-webpack-plugin
    • 安装
    • 基本使用
  • 来源

概述

骨架屏(Skeleton Screen)是一种在页面数据加载完成前,先给用户展示出页面的大致结构(灰色占位图)的技术。当页面实际数据加载并渲染完成后,这些占位图会被实际内容替换。骨架屏的引入旨在改善用户体验,通过提前展示页面的基本框架,降低用户在等待加载过程中的焦躁情绪,使得加载过程主观上变得流畅自然。

骨架屏的实现方案

目前生成骨架屏的技术方案大概有三种:

  1. 使用图片、svg 或者手动编写骨架屏代码:使用 HTML + CSS 的方式,我们可以很快的完成骨架屏效果,但是面对视觉设计的改版以及需求的更迭,我们对骨架屏的跟进修改会非常被动,这种机械化重复劳作的方式此时未免显得有些机动性不足;

  2. 通过预渲染手动书写的代码生成相应的骨架屏:该方案做的比较成熟的是 vue-skeleton-webpack-plugin,通过 vueSSR 结合 webpack 在构建时渲染写好的 vue 骨架屏组件,将预渲染生成的 DOM 节点和相关样式插入到最终输出的 html 中。

 // webpack.conf.js
 const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');
 plugins: [
  //...
  new SkeletonWebpackPlugin({
    webpackConfig: {
      entry: {
        app: resolve('./src/entry-skeleton.js')
      }
    }
  })
 ]

该方案的前提同样是编写相应页面的骨架屏组件,然后预渲染生成骨架屏所需的 DOM 节点,但由于该方案与 vue 相关技术直接关联,在当今前端框架三分天下的大环境下,我们可能需要一个更加灵活、可控的方案;

3 . 饿了么内部的生成骨架页面的工具:该方案通过一个 webpack 插件 page-skeleton-webpack-plugin 的方式与项目开发无缝集成,属于在自动生成骨架屏方面做的非常强大的了,并且可以启动 UI 界面专门调整骨架屏,但是在面对复杂的页面也会有不尽如人意的地方,而且生成的骨架屏节点是基于页面本身的结构和 CSS,存在嵌套比较深的情况,体积不会太小,并且只支持 history 模式。

 // webpack.conf.js
 const HtmlWebpackPlugin = require('html-webpack-plugin')
 const { SkeletonPlugin } = require('page-skeleton-webpack-plugin')
 const path = require('path')
 
 plugins: [
  //...
  new HtmlWebpackPlugin({
    // Your HtmlWebpackPlugin config
  }),
  new SkeletonPlugin({
    pathname: path.resolve(__dirname, `${customPath}`), // 用来存储 shell 文件的地址
    staticDir: path.resolve(__dirname, './dist'), // 最好和 `output.path` 相同
    routes: ['/', '/search'], // 将需要生成骨架屏的路由添加到数组中
  })
 ]

page-skeleton-webpack-plugin

安装

使用 npm 安装此插件,同时还需要安装 html-webpack-plugin。

npm install --save-dev page-skeleton-webpack-plugin

npm install --save-dev html-webpack-plugin

基本使用

步骤 1: 配置 按照上述教程安装插件后,需要对其进行配置以使插件正常运行。插件会根据 Node 环境执行不同的操作。当 NODE_ENV === ‘development’ 时,插件可以执行生成和写入骨架页的操作。

const HtmlWebpackPlugin = require('html-webpack-plugin')
const { SkeletonPlugin } = require('page-skeleton-webpack-plugin')
const path = require('path')

const webpackConfig = {
  entry: 'index.js',
  output: {
    path: path.join(__dirname, '/dist'),
    filename: 'index.bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin({
       // 你的 HtmlWebpackPlugin 配置
    }),
    new SkeletonPlugin({
        pathname: path.resolve(__dirname, `${customPath}`), // 存储壳文件的路径
        staticDir: path.join(__dirname, './dist'), // 同上 `output.path`
        routes: ['/','/search'], // 想要生成骨架屏的路由
    })
  ]
}

📔由于插件根据 process.env.NODE_ENV 环境变量选择不同的操作,因此需要在 package.json 文件的 scripts 选项中设置环境变量如下:

"scripts": {
  "dev": "cross-env NODE_ENV=development node server.js",
  "build": "rm -rf dist && cross-env NODE_ENV=production webpack --progress --hide-modules"
}

即,在开发环境下设置 NODE_ENV 为 development,在生产环境下设置 NODE_ENV 为 production。

步骤 2: 修改 html-webpack-plugin 的模板 index.html
在你的应用根元素中添加 注释。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <!-- shell -->
  </div>
</body>
</html>

步骤 3: 操作与写入骨架
在开发页面中,按 Ctrl 或者 Cmd + Enter 调出插件交互界面,或者在浏览器的 JavaScript 控制台输入 toggleBar 调出界面。

在这里插入图片描述

点击交互界面中的按钮预览骨架页。这个过程可能需要大约 20 秒。插件准备好骨架页后,将会通过浏览器自动打开预览页面,如图所示。
在这里插入图片描述

扫描预览页面上的二维码在手机上预览骨架页。您可以在预览页面上直接编辑源代码。点击右上角的 Write 按钮将骨架页写入到 shell.html 文件。

重新使用 webpack 包装应用程序。当页面重启时,你会看到在获取数据前应用的骨架结构。

来源

【Web技术】785- 网页骨架屏自动生成方案分享
web性能优化之页面加载体验(骨架屏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【话费充值】话费API接口对接有哪些关键步骤

话费API接口对接通常包括以下几个关键步骤&#xff1a; 选择服务提供商&#xff1a;选择一个可靠的话费充值API服务提供商&#xff0c;这可能是电信运营商本身或是一个信誉良好的第三方服务提供商。注册和认证&#xff1a;在选定的服务提供商平台上注册&#xff0c;并获得API访…

自研商家如何快速接入电商平台订单数据?

随着电子商务行业的快速发展&#xff0c;越来越多的商家开始寻求高效的订单管理和数据整合方案。对于那些自研系统的商家来说&#xff0c;如何实现与各大电商平台之间的无缝对接&#xff0c;成为了一项重要挑战。点三电商API正是为此类需求量身打造&#xff0c;为商家提供了一站…

【动态规划】任务调度dp 自用

kkksc03考前临时抱佛脚 原题 题目背景 kkksc03 的大学生活非常的颓废&#xff0c;平时根本不学习。但是&#xff0c;临近期末考试&#xff0c;他必须要开始抱佛脚&#xff0c;以求不挂科。 题目描述 这次期末考试&#xff0c;kkksc03 需要考 4 4 4 科。因此要开始刷习题集…

晶体晶格热导率的快速可解公式

https://doi.org/10.1016/j.mtphys.2024.101549 晶格热导率(κL)是晶体的一项重要物理性质&#xff0c;在热管理中具有广泛的应用&#xff0c;如散热、绝缘和热电能量转换。 然而&#xff0c;准确、快速地测定κL带来了相当大的挑战。 在这项研究中&#xff0c;引入了一个公式…

计算、谋算(算计)与逻辑

谋算的“逻辑”和计算的逻辑既相似又有区别。 谋算的逻辑通常涉及到策略、计划和决策的制定。它关注的是如何在不确定的情况下&#xff0c;通过分析和推理来达到目标。谋算者会考虑各种可能性&#xff08;01&#xff09;、风险&#xff08;0&#xff09;和利益&#xff08;1&am…

【鸿蒙应用开发】常见的容器组件:ColumnSplit、RowSplit和Flex

上一章已经了解了Column和Row的一些属性&#xff0c;以下是几个案例&#xff1a; 设置子组件水平方向的间距为&#xff1a;5 Entry Preview Component struct Index {State message: string Hello 鸿蒙;controller: webview.WebviewController new webview.WebviewControll…

【Java】Runtime与Properties获取系统信息

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 代码4.2 运行结果 五、总结&#xff1a; 一、前言 这些都被淘汰比较少用了…

深入研究基于多层卷积和全连接网络结构的数据处理与特征提取方法

1 问题 卷积层的输入输出的shape的计算公式探究多个卷积层加上多个全连接层的输出方法 2 方法 卷积层的输入输出的shape的计算公式&#xff1a;输出形状的计算公式&#xff1a;输出高度 (输入高度 - 卷积核高度 2 * 填充) / 步长 1输出宽度 (输入宽度 - 卷积核宽度 2 * 填…

一码空传临时网盘PHP源码,支持提取码功能

源码介绍 一码空传临时网盘源码V2.0免费授权&#xff0c;该源码提供了一个简单易用的无数据库版临时网盘解决方案。前端采用了layui开发框架&#xff0c;后端使用原生PHP编写&#xff0c;没有引入任何开发框架&#xff0c;保持了代码的简洁和高效。 这个程序使用了一个无数据…

设计模式 装饰模式(Decorator Pattern)

装饰器模式简绍 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装。 装饰器模式的基本结构 装饰器模式的基本结构如下&…

【数据管理】DAMA-数据安全

目录 1、概述 2、数据安全要求来源 3、业务驱动因素 4、目标和原则 5、脆弱性、威胁、风险 6、风险分类 7、安全过程 8、数据完整性 9、混淆或脱敏 10、数据安全类型 11、数据安全制约因素 12、系统安全风险 13、工具 1、概述 数据安全包括安全策略和过程的规划、…

无人机动力系统设计之电调芯片参数选型

无人机动力系统设计之电调芯片参数选型 1. 源由2. 关键因素2.1 电压范围2.2 电流处理能力2.3 控制方式2.4 PWM输出与分辨率2.5 通讯接口2.6 保护功能2.7 支持霍尔传感器与无传感器模式2.8 集成度与外围器件2.9 效率与散热2.10 市场供应与成本 3. 因素阐述3.1 PWM工作频率3.1.1 …

二次规划及其MATLAB实现

引言 二次规划&#xff08;Quadratic Programming, QP&#xff09;是一类重要的优化问题&#xff0c;其目标函数为二次函数&#xff0c;约束条件为线性不等式或等式。二次规划问题在工程、经济、金融等领域有广泛应用&#xff0c;如投资组合优化、人脸表情动画的权重求解、机械…

UE中如何制作后处理设置面板

1&#xff09;UE中如何制作后处理设置面板 2&#xff09;Magica Clothes 2插件与Burst编译问题 3&#xff09;UI大小和文本变量 4&#xff09;如何检索直线与网格的所有交点 这是第399篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社…

tabBar设置底部菜单选项以及iconfont图标,setTabBar设置TabBar和下拉刷新API

tabBartabBar属性:设置底部 tab 的表现 ​ ​ ​ ​ 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…

51单片机-蜂鸣器介绍-1

作者&#xff1a;王开心 时间&#xff1a;2024.9.11 目的&#xff1a;学习51进阶中。。。 蜂鸣器是一种一体化结构的电子讯响器&#xff0c; 采用直流电压供电&#xff0c; 广泛应用于计算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定时器等电子…

数学 |x-2| + 2|x-5| = 12 ,那么x = ?

1、先上图&#xff0c;问了一下AI&#xff0c;这AI的节奏是不认识这个。 2、这个题的解题思路&#xff1a;如何去掉绝对值符号&#xff0c;让这个题看上去正常一些&#xff0c;然后就可以解。 |x-2| 这个代表&#xff0c;x到2的距离。|x-5| 这个代表&#xff0c;x到5的距离。 …

基于SSM的“高校就业管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“高校就业管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首界面 后台首页 各管理功能 摘要 本论文主要讲述了基于SSM框…

移动UI案例:交通旅行类整套案例

1. 地图导航&#xff1a; 提供地图展示、路线规划、实时导航等功能&#xff0c;帮助用户找到目的地并提供最佳路线。 2. 公交线路查询&#xff1a; 提供公交车站信息、线路查询、实时公交到站信息等功能&#xff0c;方便用户使用公共交通工具。 3. 实时交通信息&#xff1a;…

0基础跟德姆(dom)一起学AI Python进阶10-算法和数据结构

* 自定义代码-模拟链表 * 删除节点 * 查找节点 * 算法入门-排序类的 * 冒泡排序 * 选择排序 * 插入排序 * 快速排序 * 算法入门-查找类的 * 二分查找-递归版 * 二分查找-非递归版 * 分线性结构-树介绍 * 基本概述 * 特点和分类 * 自定义代码-模拟二叉树 …