Как я могу выборочно отображать код в СПА-центре Create React App?

#reactjs #webpack #create-react-app #craco

#reactjs #webpack #create-react-app #craco

Вопрос:

В моем приложении React (созданном с помощью cli Create React App, а не извлеченном) Я настроил его так, что если он не REACT_APP_API_URL определен, то он использует поддельные данные.

Я делаю это, добавляя fakeFetch функцию в redux-api-middleware ala

 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 предотвратить включение всех моих фиктивных / поддельных данных в производственную сборку, предоставляя мне очень простой способ переключения между макетными и реальными данными?

Я не хочу извлекать приложение, но я открыт для использования плагина webpack, который вводится с помощью переопределений конфигурации Create React App.

Комментарии:

1. Отвечает ли эта статья на ваш вопрос? remarkablemark.org/blog/2017/02/25/webpack-ignore-module (Редактировать: Nvm, это включает в себя пользовательскую конфигурацию webpack, которая будет включать извлечение)

2. Я использовал github.com/pofigizm/redux-dynamic-middlewares для аналогичного варианта использования в моем приложении.

3. Спасибо @AbirTaheer, но это решение мне не полностью помогает. Недостаточно просто выборочно игнорировать модуль, основанный на регулярном выражении.

4. Разве вы не можете просто прочитать process.env.NODE_ENV и проверить, находитесь ли вы в разработке или в производстве?

Ответ №1:

Я думаю, что разделение кода webpack с динамическим импортом может быть вашим лучшим выбором. Таким образом, ваши фиктивные данные объединяются, но никогда не отправляются клиенту (что, я думаю, является главной целью здесь).

 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 . При разработке вы просто используете макет URL-адреса сервера process.env.REACT_APP_API_URL . Таким образом, тестовые данные хранятся в совершенно другой среде и обеспечивают четкое разделение задач. Вероятно, вы могли бы также просто создать простое локальное экспресс-приложение, которое просто возвращает жестко закодированный JSON, если вы не хотите использовать сторонние инструменты.

Комментарии:

1. это очень похоже на то, как я в конечном итоге решил эту проблему, поэтому я наградил награду — спасибо. У меня есть ряд причин, по которым я не хочу добавлять макет сервера (моделирование API в моем поддельном API довольно сложное и основано на тех же довольно сложных наборах данных об элементах, которые я использую в модульных тестах, поэтому было проще всего использовать все вместе). Теперь у меня все работает, так что спасибо.