【问题标题】:How can I selectively render code in a Create React App SPA?如何在 Create React App SPA 中选择性地呈现代码?
【发布时间】:2021-05-22 01:01:44
【问题描述】:

在我的 React 应用程序中(使用 Create React App cli 构建,而不是弹出)我已经设置了它,所以如果没有定义 REACT_APP_API_URL,那么它使用模拟数据。

我通过为redux-api-middleware ala 提供一个fakeFetch 函数来做到这一点

import { apiMiddleware as aMl, createMiddleware } from 'redux-api-middleware'
import fakeFetch from 'fixtures/utils/fakeFetch'

const apiMiddleware = apiBase ? aMl : createMiddleware({ fetch: fakeFetch })

// etc... configure the `redux` store with the middleware

这在开发时很好,但我希望在实际构建部署时该代码完全与构建分离。

我有什么办法可以做一些事情

<% if process.env.REACT_APP_API_URL %>
import { apiMiddleware } from 'redux-api-middleware'
<% else %>
import { createMiddleware } from 'redux-api-middleware'
import fakeFetch from 'fixtures/utils/fakeFetch'

const apiMiddleware = createMiddleware({ fetch: fakeFetch })
<% endif %>

// etc... configure the `redux` store with the middleware

防止webpack 在生产构建中包含我所有的装置/假数据,同时为我提供一种在模拟数据和实时数据之间切换的非常简单的方法?

我不想退出应用程序,但我愿意使用通过 Create React App Configuration Overrides 注入的 webpack 插件。

【问题讨论】:

  • 这篇文章能回答你的问题吗? remarkablemark.org/blog/2017/02/25/webpack-ignore-module(编辑:Nvm,它涉及一个自定义的 webpack 配置,这将涉及弹出)
  • 我在我的应用程序中使用了github.com/pofigizm/redux-dynamic-middlewares 来处理类似的用例。
  • 感谢@AbirTaheer,但该解决方案并不能完全帮助我。仅仅基于正则表达式有选择地忽略一个模块是不够的。
  • 您能不能只阅读process.env.NODE_ENV 并检查您是处于开发阶段还是生产阶段?

标签: reactjs webpack create-react-app craco


【解决方案1】:

我认为webpack code-splittingdynamic imports 可能是您最好的选择。这样,您的模拟数据会被捆绑,但不会发送到客户端(我认为这是这里的主要目标)。

import { apiMiddleware, createMiddleware } from 'redux-api-middleware'

const getMiddleware = async () => {
   if (process.env.REACT_APP_API_URL) {
      return apiMiddleware;
   } else {
      // loads bundle over network
      const { default: fakeFetch } = await import('fixtures/utils/fakeFetch');
      return createMiddleware({ fetch: fakeFetch });
   }
}

我知道这并不能直接回答问题,但附带说明一下,我认为最干净的方法是使用模拟服务器,例如 mock-server.com。在开发中,您只需使用 process.env.REACT_APP_API_URL 中的模拟服务器 url。这样,测试数据就存在于一个完全不同的环境中,并提供了清晰的关注点分离。如果您不想使用第三方工具,您也可以只创建一个简单的本地快速应用程序,该应用程序只返回硬编码的 JSON。

【讨论】:

  • 这与我最终解决此问题的方式非常接近,因此我获得了赏金 - 谢谢。我不想添加模拟服务器有很多原因(我的假 API 中的 API 模拟相当复杂,并且依赖于我在单元测试中使用的相同的相当复杂的夹具数据集,因此最容易保留一起)。我现在可以正常工作了,谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 2022-06-19
  • 2019-02-01
  • 2020-09-16
  • 2020-07-15
  • 2018-11-27
  • 2018-04-08
  • 2018-01-14
相关资源
最近更新 更多