如何在 React.js 中解析 FOUC

2024-03-24

我已经从 create-react-app 构建了react.js 网站。 但在生产模式下,存在 FOUC,因为样式是在 html 渲染后加载的。

有什么办法可以解决这个问题吗?我一直在谷歌搜索答案,但还没有找到合适的答案。


FOUC

FOUC--所谓的闪烁的无样式内容可能与解决这个问题的许多尝试一样有问题。

说到重点

让我们考虑以下路由配置(反应路由器 https://github.com/ReactTraining/react-router):

...
<PageLayout>
  <Switch>
    <Route exact path='/' component={Home} />
    <Route exact path='/example' component={Example} />
  <Switch>
</PageLayout>
...

where PageLayout是一个简单的hoc https://reactjs.org/docs/higher-order-components.html,包含 div 包装page-layout班级并返回其孩子。

现在我们重点关注基于路由的组件渲染。通常你会使用 ascomponent支持 ReactCompoment。但在我们的例子中,我们需要动态获取它,以应用有助于我们避免 FOUC 的功能。所以我们的代码将如下所示:

import asyncRoute from './asyncRoute'

const Home = asyncRoute(() => import('./Home'))
const Example = asyncRoute(() => import('./Example'))

...

<PageLayout>
  <Switch>
    <Route exact path='/' component={Home} />
    <Route exact path='/example' component={Example} />
  <Switch>
</PageLayout>

...

为了澄清,我们还展示了如何asyncRoute.js模块看起来像:

import React, { Component } from 'react'
import PropTypes from 'prop-types'

import Loader from 'components/Loader'

class AsyncImport extends Component {
  static propTypes = {
    load: PropTypes.func.isRequired,
    children: PropTypes.node.isRequired
  }

  state = {
    component: null
  }

  toggleFoucClass () {
    const root = document.getElementById('react-app')
    if (root.hasClass('fouc')) {
      root.removeClass('fouc')
    } else {
      root.addClass('fouc')
    }
  }

  componentWillMount () {
    this.toggleFoucClass()
  }

  componentDidMount () {
    this.props.load()
      .then((component) => {
        setTimeout(() => this.toggleFoucClass(), 0)
        this.setState(() => ({
          component: component.default
        }))
      })
  }

  render () {
    return this.props.children(this.state.component)
  }
}

const asyncRoute = (importFunc) =>
  (props) => (
    <AsyncImport load={importFunc}>
      {(Component) => {
        return Component === null
          ? <Loader loading />
          : <Component {...props} />
      }}
    </AsyncImport>
  )

export default asyncRoute

hasClass, addClass, removeClass是对 DOM 类属性进行操作的 polyfill。

Loader是一个显示微调器的自定义组件。

Why setTimeout?

只是因为我们需要删除fouc第二个刻度线的班级。否则,它会在渲染组件时发生。所以这是行不通的。

正如你在AsyncImport我们通过添加来修改反应根容器的组件fouc班级。为了清楚起见,HTML 如下:

<html lang="en">
<head></head>
<body>
  <div id="react-app"></div>
</body>
</html>

还有另一块拼图:

#react-app.fouc
    .page-layout *
        visibility: hidden

导入特定组件时应用 sass(即:Home, Example)发生。

Why not display: none?

因为我们希望所有依赖父级宽度、高度或任何其他 CSS 规则的组件都能正确呈现。

怎么运行的?

主要假设是隐藏所有元素,直到组件准备好向我们显示渲染的内容。首先它会点火asyncRoute函数向我们展示了Loader until Component安装和渲染。其间在AsyncImport我们通过使用类来切换内容的可见性fouc在反应根 DOM 元素上。当所有内容加载完毕后,就该显示所有内容了,因此我们删除该类。

希望有帮助!

谢谢

This article https://tylermcginnis.com/react-router-code-splitting/,动态导入的想法(我认为)来自反应可加载 https://github.com/jamiebuilds/react-loadable.

Source

https://turkus.github.io/2018/06/06/fouc-react/ https://turkus.github.io/2018/06/06/fouc-react/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 React.js 中解析 FOUC 的相关文章

随机推荐

  • WPF 中透明背景变黑

    我尝试创建一个带有圆角的窗口 我将窗口背景设置为透明并将边框背景设置为白色 然而 在边框和窗口之间的区域 我得到黑色背景而不是透明背景 我在 Windows 7 上使用 C WPF VS2010 进行开发 下面是我的 XAML 和屏幕截图
  • 将具有循环结构的 JS 对象存储在本地存储中,并在重新加载时获取循环结构

    我想存储 本地存储 HTML5 JS 对象 为此 我必须申请JSON stringify obj 到我想要存储的JS对象 之后我就可以存储该对象localStorage obj JSON stringify obj 但有些 JS 对象非常大
  • 请教 php 总结 01 + 01 = 02

    我想在数据库中创建一个id id user gt 数据类型 varchar 我希望我的 id 从00 01 02 等等 为了创建新的 id 我对所有行进行计数 并且计数的结果将添加 01 Example id array 00 01 02
  • 处理块、完成处理程序、dispatch_async 与dispatch_sync

    我正在线程中执行在线数据获取 并且我想在执行块后立即执行某些操作 这是我的代码 IBAction refresh UIBarButtonItem sender NSLog checking self editToolbar dispatch
  • HM10 ble改变特征值AT命令Arduino

    谁能帮我用AT命令写入特征值 或者如何使用Hm10模块将数据从arduino发送到另一个ble设备 HM10发送AT START后 会通告数据包 并且可以检测服务和特征 但特征值是默认的0x00 如何更改 多次检查数据表 但找不到能够执行相
  • 托管 C++/CLI 类中的 auto_ptr 或 shared_ptr 等效项

    在 C CLI 中 您可以在托管类中使用本机类型 因为不允许在托管类中保存本机类的成员 在这种情况下您需要使用指针 这是一个例子 class NativeClass public ref class ManagedClass private
  • Discord.js v14 创建频道

    我尝试创建一个频道 但总是出现错误 我不知道如何解决它 不要注意 req 0 在 代码 中 它来自数据库 与问题没有链接 因为它在 v13 中工作 看来您的帖子主要是代码 请添加更多详细信息 我不知道我能得到什么更多的细节 哈哈 抱歉 英语
  • 在 Node.js 中的单个 HTTP 请求中调用多个 HTTP 请求

    我试图在单个 URL 调用中调用多个 URL 并将其 json 响应推送到数组中 然后将该数组发送给最终用户 我的代码如下所示 var express require express var main router express Rout
  • 我有一个 JApplet,它必须显示 3 个组件。 (2 个 JPanel 和 1 个 Paint 方法)

    我有一个作业 其中我必须允许用户使用二次方程绘制图表 我设法绘制了图形的骨架 现在我尝试显示 控制面板 以供用户输入值 我有4个文件 graph java panel java panelB java panelC java 我的问题是当我
  • 如何在 debian 上安装 apcu 作为 php7 扩展

    我看过这个ubuntu教程 http thereluctantdeveloper com 2015 12 quick and dirty php 70 set up on ubuntu 1404 with apcu http therelu
  • SQL Server 执行模拟

    两者有什么区别 execute as user testuser AND execute as login testuser 我正在这些登录名下执行跨数据库过程 它适用于作为登录名执行 但不适用于作为用户执行 这表示服务器主体 testus
  • 编译为 C 时的垃圾收集

    将垃圾收集语言编译为C时 垃圾收集的技术有哪些 我知道有两个 维护一个影子堆栈 将所有根显式保存在数据结构中 使用像 Boehm 这样的保守垃圾收集器 第一种技术很慢 因为您必须维护影子堆栈 可能每次调用函数时 您都需要将局部变量保存在数据
  • 如何使用 jQuery 获取 id 元素的一部分?

    如何从 id old id 的 span 中获取 一些文本 并将其放入 id new id 中 span Some text span span span span Some text span span span 我不知道如何获得数字部分
  • 4 层(对于 N 层)架构示例?

    最近 我的一个朋友向我询问 N 层架构 我能够通过示例向他解释 1 2 和 3 层架构 但当我想给出超过 3 层的例子时 我就陷入了困境 我用谷歌搜索并大量寻求帮助 但找不到任何像样的例子 事实上 它被命名为 N 层 这让我认为 N 可以是
  • 使用升压间隔_map

    试图遵循boost party我制作了这个示例代码 include boost icl interval hpp include boost icl interval map hpp include
  • 为什么Python中列表元素查找的复杂度是O(1)?

    今天在课堂上 我们了解到从列表中检索元素是O 1 在Python中 为什么会这样呢 假设我有一个包含四个项目的列表 例如 li perry 1 23 5 s 这些项目在内存中具有不同的大小 所以不可能获取内存位置li 0 并添加每个元素大小
  • 相似列出现的次数

    我是 SQL SERVER 新手 需要您的建议 我有一张大桌子 上面有商店信息 这是 bench id 列 bench id 31 51 51 61 61 61 71 71 我创建了另一个包含两列的小表 distinct bench num
  • BatchGetItem 或 Query DynamoDb - 按范围查询

    我有一个名为 User 的表 它有一个用户 ID 的哈希键和一个组织 ID 的范围键 如何返回组织 ID 为 3 的所有用户 顺便说一句 这是一个 Lambda 函数 这段代码给了我一个错误 console log Loading even
  • YUY2 与 YUV 422

    我无法理解两者之间的确切区别 从研究来看 更多地讨论两者是不同的 但少数人似乎将它们分组在 4 2 2 抽样方案下 YUV 422 I 和 J 版本 有一个亮度平面 Y 和 2 个色度平面 U V 然而 在 I422 中 色度平面 蓝色和红
  • 如何在 React.js 中解析 FOUC

    我已经从 create react app 构建了react js 网站 但在生产模式下 存在 FOUC 因为样式是在 html 渲染后加载的 有什么办法可以解决这个问题吗 我一直在谷歌搜索答案 但还没有找到合适的答案 FOUC FOUC