无法获取动态导入的模块:

2024-04-18

我有一些延迟导入的 React 组件App.tsx. App.tsx用于Index.tsx它被渲染并附加到的地方body.

   const IndexPage = lazy(() => import("../features//IndexPage"));
    const TagsPage = lazy(
      () => import("../features/tags/TagsPage")
    );
    const ArticlePage = lazy(() => import("../features/article/ArticlePage"));

    const SearchResultPage = lazy(
      () => import("../features/search-result/SearchResultPage")
    );

    const ErrorPage = lazy(() => import("../features/error/ErrorPage"));

    ----

    <BrowserRouter basename={basename}>
      <Suspense fallback={<Fallback />}>
        <Routes>
          <Route path={INDEX} element={<IndexPage />} />
          <Route path={ARTICLE} element={<ArticlePage />} />
          <Route path={TAGS} element={<TagsPage />} />
          <Route path={SEARCH} element={<SearchResultPage />} />
          <Route path={ERROR} element={<ErrorPage />} />
          <Route path="/*" element={<ErrorPage />} />
        </Routes>
      </Suspense>
    </BrowserRouter>

在生产中经常会出现以下错误。

无法获取动态导入的模块:

所有路线都发生过这种情况。

 https://help.example.io/static/js/SearchResultPage-c1900fe3.js

 https://help.example.io/static/js/TagsPage-fb64584c.js

 https://help.example.io/static/js/ArticlePage-ea64584c.js

 https://help.example.io/static/js/IndexPage-fbd64584c.js

我已经改变了构建路径。因此它是/static/js.

  build: {
    assetsInlineLimit: 0,
    minify: true,
    rollupOptions: {
      output: {
        assetFileNames: (assetInfo) => {
          var info = assetInfo.name.split(".");
          var extType = info[info.length - 1];
          if (/png|jpe?g|svg|gif|tiff|bmp|ico/i.test(extType)) {
            extType = "img";
          } else if (/woff|woff2/.test(extType)) {
            extType = "css";
          }
          return `static/${extType}/[name]-[hash][extname]`;
        },
        chunkFileNames: "static/js/[name]-[hash].js",
        entryFileNames: "static/js/[name]-[hash].js",
      },
    },
    outDir: "./../backend/src/main/resources/static/articles/",
    emptyOutDir: true,
  },

有人知道如何解决这个问题吗?

Update:

我在开发中从来没有遇到过这个错误。我用Sentry跟踪错误。两个月内至少发生了274次。

这就是 Sentry 上的全部内容。

{
  arguments: [
    {
      message: Failed to fetch dynamically imported module: https://help.example.io/static/js/SearchResultPage-c1900fe3.js,
  name: TypeError,
    stack: TypeError: Failed to fetch dynamically imported module: https://help.example.io/static/js/SearchResultPage-c1900fe3.js
  }
],
  logger: console 
}

Update

过去两个月我们的访问量达到了 50 万。这样的事发生了 274 次。自从tracesSampleRate is 0.3,绝对不止于此。

  Sentry.init({
    dsn: "",
    integrations: [new BrowserTracing()],
    tracesSampleRate: 0.3,
  });

这种情况在各种浏览器上都发生过,但主要是在 Chrome 上。

我无法在开发或产品中重现它。

Update

我终于重现了这个bug。如果您在某个页面上并且发布了新版本,就会发生这种情况。包含动态导入模块的文件不再存在,例如:

https://help.example.io/static/js/IndexPage-fbd64584c.js

上面的链接返回404.


以下是对此问题的一些替代看法。

完全回避这个问题。

这是显而易见的,我怀疑从您的角度来看这可能不是一个理想的答案,但切换到静态导入将解决您的问题。

在许多情况下,即使使用静态导入,包的大小仍然足够小,不会影响您的用户体验,而且绝对比遇到错误要小。

这也可以说是解决问题的唯一有保证的方法,因为即使您的问题是由您设法追踪和修复的某个地方的故障引起的,仍然存在发生此问题的合法情况。

优雅地管理错误

另一方面,仍然认为错误可能并且仍然会发生,React 具有 ErrorBoundaries 的概念,您可以利用它来处理发生时的用户体验:https://reactjs.org/docs/error-boundaries.html https://reactjs.org/docs/error-boundaries.html and https://reactjs.org/docs/code-splitting.html#error-boundaries https://reactjs.org/docs/code-splitting.html#error-boundaries

把事情掌握在自己手中

最后,反应lazy需要一个返回解析为模块的 Promise 的函数。如果没有,那就是你的类型错误。显然,它的使用方式与您完全相同,但如果您愿意,您可以自由地将其包装在更智能的东西中。您需要做的就是确保承诺最终解析为导入的模块。如需灵感,请参阅此处有关重试 Promise 的一些看法。Promise 重试设计模式 https://stackoverflow.com/questions/38213668/promise-retry-design-patterns

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

无法获取动态导入的模块: 的相关文章

随机推荐

  • 如何向 HPA 提供外部指标?

    问题设置 假设我有 2 个 pod A 和 B 我希望能够根据任意来源的任意数量动态扩展 pod A 假设 pod B 是这样一个源 例如 它可以拥有一个带有端点的 HTTP 服务器 该端点在请求时以 pod A 所需的副本数量进行响应 或
  • 如何使用 LiveData 和 ViewModel 发布改进 API 调用请求方法

    我是 android 和 java 的初学者 我在使用mvvm架构登录时遇到问题 并在android studio中用JAVA语言进行改造 我的代码如下所示 我的代码如下所示 API接口 FormUrlEncoded POST login
  • 从简单的 JSON 字符串加载 D3.js 数据

    图库中的大多数示例都会从 TSV 文件加载数据 如何将以下内容转换为使用本地 json 变量而不是 TSV 数据 d3 tsv data tsv function error data var myEntitiesJson getEntit
  • SQL Server:将 GROUP BY 的结果拆分为单独的列

    我有一个 SQL Server 2008 R2 数据库 其中包含大约 5 亿行数据 目前看起来像这样 ID Eventtype 201 1 201 3 201 4 201 1 201 1 664 1 664 0 664 1 664 3 我似
  • 在没有朋友的情况下给予基类受保护的访问

    我先解释一下我的情况 我有一个基类 它自动实现一种引用计数 它允许我包装 C 风格init and free 库调用引用计数 API template
  • 将 Spring Boot 2.0 与 Tomcat 7.0.82 结合使用

    我有一个使用 Spring Boot 2 0 0 RC2 的项目 我需要使用 Tomcat 7 0 82 的传统部署将其部署到客户环境 我已经成功构建了一场可以通过配置成功部署的战争web xml以 Spring 应用程序的典型方式 使用
  • 如何从 firebug 控制台隐藏 ajax 请求?

    如何隐藏来自 firebug 控制台或任何显示 ajax 调用的 ajax 请求 请在ajax成功或失败后调用此函数 result load testtemplateboth testpagetpl clearconsole functio
  • 在指定时间后自动删除 mongodb 中的文档

    我想自动删除文档collection在 mongodb 中基于ttl 我查看了其他答案并找到了以下方法 db collection createIndex createdAt 1 expireAfterSeconds 3600 这将删除之后
  • PySpark:反序列化 eventhub 捕获 avro 文件中包含的 Avro 序列化消息

    初始情况 AVRO 序列化事件被发送到 azure 事件中心 这些事件使用 azure 事件中心捕获功能持久存储 捕获的数据以及事件中心元数据以 Apache Avro 格式写入 应使用 py Spark 分析捕获 avro 文件中包含的原
  • Google Translator API 和一个单词的多种翻译

    我正在使用 google api translate java 0 92 jar Translate setHttpReferrer http translate google com http translate google com t
  • LWJGL 窗口具有透明背景?

    我想创建一个没有 黑色背景 区域的窗口 但您可以看到任何其他打开的窗口等 也就是说 渲染场景并且仅渲染场景 不留框架 不留背景区域 我读过一种方法 该方法涉及渲染到隐藏的 OpenGL 窗口并将其缓冲在内存中 创建透明分层窗口以及从内存复制
  • 如何强制 Idea 和 Maven 下载我的项目的所有源代码?

    我的 Java 项目是使用 Maven 构建的 并在 Intellij Idea 的帮助下编写的 我有很多开源项目依赖项 我想广泛研究它们以了解它们是如何工作的 为此 我经常在 Idea 中使用用法搜索 即 查找用法 选项 它告诉我在哪里可
  • 使用 Groovy 在 Java 属性中进行变量扩展

    我经常使用标准 Java 属性文件来配置我的 Groovy 应用程序 我一直缺少的一项功能是能够使用变量作为属性值的一部分 以便它们可以在使用过程中动态扩展 我想我可以使用以下设计提供此功能 使用特殊的格式来注释应该扩展的属性 我选择将此类
  • Zookeeper 错过了连续更改的事件

    我目前有一个带有单个 Zookeeper 节点和 Curator 的设置来访问数据 读取数据是通过 Curator TreeCache 完成的 我有以下测试 public void test callback successive chan
  • GNU 链接器:适应名称修改算法的更改

    我正在尝试重新编译现有的 C 应用程序 不幸的是 我必须依赖一个专有库 我只有一个预编译的静态存档 我使用 g 版本 7 3 0 和 ld 版本 2 30 无论它是用什么 GCC 版本编译的 它都是古老的 头文件定义了方法 class fo
  • 如何将嵌入式 PostgreSQL Server Java 组件作为单独的服务使用?

    我正在尝试为基于 RESTful 服务 Java 的应用程序创建一个全面的集成测试套件 该应用程序在 Tomcat 7 x 中运行并依赖于 Postgresql 9 x 实例 此外 我希望能够将这个套件作为一个独立的进程运行 如果可能的话
  • 如何为 UILabel 指定日语编码?

    当我尝试在 iOS 上的 UILabel 中显示日语字符串时 它会使用中文编码而不是日语显示 这两个编码是nearly除少数特殊情况外 完全相同 例如 以下是字符 直 Unicode U 76F4 在中文 上 与日文 下 中的呈现方式 se
  • 在 Python 中设置系统日期(在 Windows 上)

    似乎有许多软件包用于获取 格式化当前日期 或查找从现在开始的 n 个时间间隔的日期 但我一定忽略了在 Python 中设置日期的简单方法 如 Windows 的 date exe 的存在 这样的功能肯定存在吗 我无法在 Google Pyt
  • 将字符串传递给 settimeout 是不好的做法吗?如果是,为什么? [复制]

    这个问题在这里已经有答案了 可能的重复 是否有充分的理由将字符串传递给 setTimeout https stackoverflow com questions 6081560 is there ever a good reason to
  • 无法获取动态导入的模块:

    我有一些延迟导入的 React 组件App tsx App tsx用于Index tsx它被渲染并附加到的地方body const IndexPage lazy gt import features IndexPage const Tags