无法将 React.lazy 与 Material UI 图标一起使用

2024-01-07

因为我的应用程序中的很多地方都有很多图标,所以我想对它们使用代码分割。

我创建了辅助组件来执行此操作:

import React, { FunctionComponent, Suspense } from 'react';

interface LazyMuiIconProps {
  name: string;
}

export const LazyMuiIcon: FunctionComponent<LazyMuiIconProps> = ({ name }) => {
  console.log(name);
  const IconElement = React.lazy(() => import(`@material-ui/icons/${name}`));
  // const IconElement = React.lazy(() => import(`@material-ui/icons/Home`));
  return (
    <Suspense fallback={null}>
      <IconElement />
    </Suspense>
  );
};

当我使用具有固定名称的注释行时Home它可以工作并且它会延迟加载主页图标,但是一旦我将其更改为上面的行,webpack就会在编译过程中崩溃并出现低级错误:

69% 构建 15623/15657 模块 34 个活动模块 ...terial-ui/icons/AccessibleOutlined.d.ts

[30:0x33f4320] 77272 毫秒:清除 1142.0 (1422.8) -> 1141.5 (1423.3) MB,1.4 / 0.0 毫秒(平均 mu = 0.300,当前 mu = 0.342) 分配失败[30:0x33f4320] 77275 ms:Scavenge 1142.3 (1423.3) -> 1141.7 (1423.8) MB,1.5 / 0.0 毫秒(平均 mu = 0.300, 当前 mu = 0.342) 分配失败 [30:0x33f4320] 77278 ms: 清除 1142.4 (1423.8) -> 1141.9 (1424.3) MB,1.5 / 0.0 毫秒(平均 mu = 0.300,当前 mu = 0.342) 分配失败

==== JS 堆栈跟踪 ===========================================

0: ExitFrame [pc: 0x16ac4804fb5d] Security context: 0x02fea7a9d921 <JSObject>
1: add [0x2fea7a906c9](this=0x10fbf120c2e1 <Set map = 0x3f914303d81>,0x1a97709947e1 <DependenciesBlock map =

0x1c000787d3b1>) 2:新集(又名集)[0x2fea7a90391](this = 0x056d59402691,0x33036eb7fbe1) 3:构造框架[pc:0x16ac48009e66] 4: StubFrame [pc: 0x16ac480f932c] 5: processDependencyBlocksForC... 70% 块图致命错误:接近堆限制的无效标记压缩 分配失败 - JavaScript 堆内存不足 1:0x948d20 节点::中止() [/usr/local/bin/node] 2: 0x9499bc 节点::OnFatalError(char const*, char const*) [/usr/local/bin/node] 3: 0xb1160e v8::Utils::ReportOOMFailure(v8::内部::隔离*,字符 常量*,布尔)[/usr/local/bin/node] 4:0xb11844 v8::内部::V8::FatalProcessOutOfMemory(v8::内部::隔离*,字符 const*, bool) [/usr/local/bin/node] 5: 0xf0def2 [/usr/local/bin/node] 6: 0xf0dff8 v8::internal::Heap::CheckInefficientMarkCompact(unsigned long, double) [/usr/local/bin/node] 7: 0xf1a718 v8::内部::堆::执行垃圾收集(v8::内部::垃圾收集器, v8::GCCallbackFlags) [/usr/local/bin/node] 8: 0xf1b22b v8::内部::堆::收集垃圾(v8::内部::分配空间, v8::内部::GarbageCollectionReason、v8::GCCallbackFlags) [/usr/local/bin/node] 9: 0xf1df61 v8::内部::堆::AllocateRawWithRetryOrFail(int, v8::内部::分配空间、v8::内部::分配对齐) [/usr/local/bin/节点] 10:0xee7​​e96 v8::内部::工厂::AllocateRawArray(int, v8::内部::PretenureFlag) [/usr/local/bin/node] 11: 0xee885a v8::internal::Factory::NewFixedArrayWithFiller(v8::internal::Heap::RootListIndex, int,v8::内部::对象*,v8::内部::PretenureFlag) [/usr/local/bin/节点] 12:0xee8900 v8::内部::句柄 v8::internal::Factory::NewFixedArrayWithMap(v8::internal::Heap::RootListIndex, int,v8::internal::PretenureFlag) [/usr/local/bin/node] 13: 0x108e547 v8::内部::OrderedHashTable::分配(v8::内部::隔离*,int,v8::内部::PretenureFlag) [/usr/local/bin/节点] 14: 0x1091ab1 v8::内部::OrderedHashTable::Rehash(v8::内部::隔离*, v8::内部::句柄,int) [/usr/local/bin/node] 15: 0x109202b v8::内部::OrderedHashTable::EnsureGrowable(v8::内部::隔离*, v8::内部::句柄) [/usr/local/bin/node] 16: 0x117ee2c v8::internal::Runtime_SetGrow(int, v8::internal::Object**、v8::internal::Isolate*) [/usr/local/bin/node] 17:0x16ac4804fb5d 中止(核心转储)

我的 Babel 插件:

plugins: [
                // plugin-proposal-decorators is only needed if you're using experimental decorators in TypeScript
                "@babel/plugin-syntax-dynamic-import",
                ['@babel/plugin-proposal-decorators', { legacy: true }],
                ['@babel/plugin-proposal-class-properties', { loose: true }],
                'react-hot-loader/babel',

据我所知,它试图加载所有图标,而不仅仅是一个图标(我将使用的实例减少到一个,以便更容易找到解决方案),然后它崩溃了。

UPDATE

如果我尝试使用,也会发生完全相同的情况react-loadable...


return Loadable({
    loader: () => import(`@material-ui/icons/${props.name}`),
    loading: () => <span>icon</span>
  });

如果您使用 Webpack,问题是如果您想要动态加载文件(在本例中为图标),webpack 默认情况下会为该模块生成一个块。如果您使用的是 Webpack 4 或更高版本,则可以使用webpackMode: eager来解决这个问题。因此,在这种情况下,导入将如下所示:

const IconElement = React.lazy(() => import(/* webpackMode: "eager" */`@material-ui/icons/${name}`));

这基本上会强制 Webpack 将块包含到你的包中(减少 http 请求的数量) - 我认为这使得使用 Lazy / Suspense 的全部意义变得无用,但这Github问题 https://github.com/facebook/create-react-app/issues/5940与您的问题类似,表明不值得单独加载每个图标,即您应该导入@material-ui/icons打包并使用您需要的图标。

更新(因为有问题的更新参考react-loader ) :

使用时react-loader您还需要指定文件的扩展名。我曾经遇到过这个问题,并通过导入指定文件的扩展名来解决它。在这种情况下 :

return Loadable({
    loader: () => import(`@material-ui/icons/${props.name}.ts`),
    loading: () => <span>icon</span>
  });

但我不确定它是否仍然有效,正如我在有关 Webpack 和延迟加载的回答中已经建议的那样。

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

无法将 React.lazy 与 Material UI 图标一起使用 的相关文章

  • 使用输入更新 redux 状态

    如何从文本输入更新 redux 状态 我正在尝试用文本输入做一个非常简单的 Hello World 当有人在文本输入中输入内容时 它应该更新我商店的 searchTerm 值 我无法弄清楚这些事情 1 如何获取输入的值并将其传递到其 onC
  • 找到 Webpack 配置文件但未配置条目

    我正在尝试为我的个人项目组织一个 webpack 2 模板webpack dev server并使用 npm 命令运行它 但我收到此错误 Configuration file found but no entry configured 这很
  • setInterval 可以随时间漂移吗?

    我有 2 个 Node js 网络服务器 我在网络服务器内缓存数据 我根据系统时间同步缓存加载 清除 我已经完成了所有主机的时间同步 现在我使用以下代码每 15 分钟清除一次缓存 millisTillNexthour Calculate m
  • react-hook-form:检查未保存的更改

    我有一个由以下人员控制的预填写表格react hook form https react hook form com const control handleSubmit formState setValue reset useForm
  • Express/node.js 204 HTTP 代码响应问题

    这是我的代码 put function req res User findById req params user id function err user if err return res send err user dateEdite
  • 如何在 PyV8 中加载 Nodejs 模块?

    如何在 PyV8 中加载 Nodejs 模块 我读过所有关于 jsdom 在与 Nodejs 一起运行时有多么出色的内容 如果我在 Python 应用程序中运行 v8 使用 python 获取 Web 资源 然后将生成的 html 字符串提
  • 如何使用 Stripe 在一次操作中创建客户和卡片?

    我正在尝试第一次初始化客户 我有一个表格 他们可以在那里注册和填写所有内容 然后他们提交 在客户端上 会发生以下情况 var cardValues AutoForm getFormValues credit card form insert
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • React Map 总是使用最后一个元素的数据调用方法

    我正在制作一个社交媒体应用程序 我正在循环浏览所有评论并将其显示在用户界面上 当我单击编辑时 最后一条评论的文本总是显示在输入中 我尝试了很多不同的方法 改变了结构 使用bind来绑定上下文 但没有任何帮助 我正在使用 React Mate
  • NodeJs 控制台中的 GET /bla - - ms - - 是什么意思?

    当我进入页面时 bla在我的 NodeJS 应用程序中 控制台打印出 GET bla ms 用文字来说 为了更容易谷歌搜索 dash dash ms dash dash 这是什么意思 这是输出morgan https github com
  • addEventListener 通过映射调度来反应 redux

    我目前正在尝试将事件侦听器添加到我在反应中制作的应用程序 我通过连接到运行的 componentDidMount API 来做到这一点只有一次该组件已渲染 仅此而已 我的问题是我正在使用connect from react redux将我的
  • 节点:使用 Nodemailer 的直通流

    我正在使用officegen 生成一个Word 文档 然后计划使用Nodemailer 和Sendgrid 将其附加到电子邮件中 Officegen 输出一个流 但我更愿意将其直接传递到附件 而不是在本地保存 Word 文档然后附加它 Ge
  • 错误找不到“pages”目录。请在项目根目录下创建一个”

    以前我的项目设置是 public next src pages components assets next config js 这工作正常 但我将结构更改为以下 public src client next config js jscon
  • 使用端口 80 的 AWS Elastic Beanstalk 上的 WebSocket 问题

    我正在将一个 node js 应用程序从 Heroku 迁移到在端口 80 上使用 WebSocket 的 AWS Elastic Beanstalk WebSocket 在 AWS Elastic Beanstalk 上返回 301 错误
  • 具有两组子组件的 React 组件

    我正在创建一个组件 需要接收两组子组件并放置在组件的两个不同部分中 let CreditCardForm icons fields gt div div div div icons div div div fields div let Cr
  • Mongodb更新很多

    我正在使用express js 和 npm 模块 mongodb 进行开发 并以 mongodb 作为数据库 我有两个集合 即 用户 和 活动 一个用户可能有数千个活动 首先 我将用户的 id 姓名和图片 url 存储到 关系的活动文件 请
  • nodejs mocha suite 未定义错误

    我正在尝试使用摩卡运行一些测试 但似乎无法克服这个错误 E tdd nodejs cart gt mocha cart test js node js 201 throw e process nextTick error or err Re
  • 渲染作为 Prop 传入的 Component

    我怎样才能渲染一个StyledComponent它是作为道具传入的吗 我正在传递一个Spinner组件到我的BarComponent作为渲染的道具 我尝试使用 this props icon in my BarComponent在下面的示例
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma
  • 使用 nginx 在云上部署 django 和 React

    我有一个 digitalocean 服务器 并且已经使用 Gunicorn 和 nginx 部署了 Django 后端服务器 如何在同一台服务器上部署 React 应用程序 您可以构建 React 应用程序并使用 Nginx 提供其静态文件

随机推荐

  • 如何手动创建 UISplitView?

    我有一个应用程序将导航到 UISplitView 完全在另一个视图内 如下所示 void switchToMyDayView NSLog Show My Day Screen if self myDayController view sup
  • Dart 中用于获取数据类型大小的函数/运算符

    我想知道 Dart 中分配给不同数据类型的内存量 但我找不到函数 运算符 例如sizeofC 中的运算符来执行此操作 我已经提到了dart core为此目的图书馆 但仍然找不到任何合适的方法 那么 是否有其他方法可以获取数据类型的大小 或者
  • 使用 SymPy 求解方程组

    我正在尝试使用 SymPy 0 7 1 求解一组方程 from sympy import equations Eq S vf S vi a t Eq S d S vi t 1 2 a t 2 Eq S a S 10 Eq S d S 60
  • BASH 在变量非文件中提取字符串后的值[重复]

    这个问题在这里已经有答案了 我发现了一个无法解决的奇怪问题 我需要提取变量中的一些值 这些值位于字符串后面 本例中变量的名称是 DSLSTATE 这是其中值的示例 NewEnable 1 NewStatus Up NewDataPath F
  • 使用 matplotlib 在 qiskit 中可视化电路

    我正在学习如何使用 qiskit 并且正在使用 jupyter 笔记本 但是每次我尝试使用属性绘制来可视化电路时 我都会收到此错误 import qiskit from qiskit import from qiskit import IB
  • 如何在 Linux、Mac 和 Windows 上从 Java 启动 .NET 应用程序?

    我想从 Java 环境的上下文中启动 NET 应用程序 与 Mono 兼容 我的猜测是 我必须以某种方式确定是否安装了 mono 找到位置并使用 NET 应用程序路径作为参数启动它 但什么是可靠的方法呢 或者 还有更好的方法 也许我应该澄清
  • 按HOME后重新启动应用程序时如何返回到最新启动的活动? [复制]

    这个问题在这里已经有答案了 熟悉的场景 我有一个Main启动的活动Game按下按钮时的活动 如果用户按 HOME 然后再次启动我的应用程序 则应显示GameActivity 这是他最后一次使用该应用程序时所做的事情 然而 相反发生的事情是他
  • 为什么 div 会有这样的行为?

    有时我的 div 会出现这个问题 无法按预期运行 我想要的是让它们按照我的理解 流动 布局 但它们不是 我只是想知道为什么不 我已经使用 firebug 来检查 css 似乎没有任何不符合规范的内容 但它们并没有一个接一个地流动 我提供了两
  • 在领域驱动设计中,您可以在 UI 中使用领域实体吗?

    在许多领先的 DDD 项目中 尤其是 MVC 风格 我看到 UI 使用镜像域实体的显示对象 而不是直接使用这些域对象 这种风格显然是为了解耦和分离关注点 我个人更喜欢这种风格 但我不确定这是否是 DDD 的严格原则 或者这是否只是不同开发人
  • 我需要做直方图拉伸

    我有一个 BitmapFrames 数组 需要进行直方图拉伸 我知道这与直方图均衡不同 最终结果是什么 有点 问题是我完全不知道得到直方图后该怎么做 到目前为止 我的代码为直方图创建了一个数组 因此我知道每个值有多少个像素 但在那之后我不知
  • 让semantic_errors呈现准确的错误消息

    我有一个模型Camping which has many Images 露营至少需要一张图片 class Camping lt ActiveRecord Base attr accessible images attributes has
  • PostgreSQL:如何实现最小基数?

    正如这个问题中的回答 PostgreSQL 中的基数 https stackoverflow com questions 3135206 cardinality in postgresql 基数是使用强制执行的限制条件 http www p
  • 使用游标获取字段值

    我正在创建一个应用程序 但遇到问题Cursor 我有一个SQLiteDatabase这给我返回了一个Cursor当我尝试使用此函数获取值时 public Cursor fetchOption long rowId throws SQLExc
  • 如何将“zd”说明符与“printf()”一起使用?

    寻求有关使用的说明 zd with printf 当然 对于 C99 及更高版本 以下内容是正确的 void print size size t sz printf zu n sz C 规范seems允许printf zd n sz 取决于
  • 如何正确对齐此文本?

    我今天写了这个极地时钟 我几乎完成了 除了我想在行内对齐我的文本 类似于this http blog pixelbreaker com polarclock 有谁知道如何做到这一点 我尝试使用 FontRenderContext 和字体指标
  • Android HttpClient 性能

    我正在开发 Android 应用程序 它使用大量对 Web 服务的 http 请求 起初 我在每个请求之前创建一个新的 HttpClient 实例 为了提高性能 我尝试在多个线程中执行请求 因此 我使用 ThreadSafeConnecti
  • 带有 c:foreach jstl 标签的二维数组列表

    我在两个叠瓦式 JSTL 中使用二维数组列表
  • 计算多个 CSV 文件中一列的平均值

    我的文件夹中有 300 多个 CSV 文件 名为 001 csv 002 csv 等 每个包含一个带有标题的数据帧 我正在编写一个函数 该函数将采用三个参数 文件的位置 要计算平均值的列的名称 数据框内 以及计算中使用的文件 这是我的功能
  • 如何在 Eclipse 中调试在 jetty 上运行的 Web 应用程序?

    以前从未做过网络编程 有没有办法设置断点 在 Eclipse 中查看变量值 我想要调试的应用程序会生成一个我想轻松提取的查询字符串 单击外部工具配置 Select program and click the new button top l
  • 无法将 React.lazy 与 Material UI 图标一起使用

    因为我的应用程序中的很多地方都有很多图标 所以我想对它们使用代码分割 我创建了辅助组件来执行此操作 import React FunctionComponent Suspense from react interface LazyMuiIc