Реагировать на ленивые компоненты, не загруженные на динамических маршрутах

Я использовал реагировать ленивый и неизвестный на динамических маршрутах, но почему-то я не могу рендерить лениво загруженные компоненты.

Я уже искал об использовании lazy на маршрутах, но я не видел, чтобы кто-нибудь использовал его на динамических (localhost: 8080 /dynamic/dynamic) маршрутах.

загрузка компонентов по динамическим маршрутам работает для меня, ленивая загрузка также работает, если у меня есть статический маршрут, но когда я попытался объединить их, компонент не загружается.

вот пример того, что я сделал,

import Loader from './path/toFile';
import Home from './path/toFile';
const LazyLoadedComponent = lazy(() => import('./path/toFile'));

const App = () => {
 return(
  <Router>
     <Switch>

        // Home has multiple views controlled by buttons
        // A view contains selections with corresponding id
       <Route exact path="/:viewType?" component={Home} /> 

       // this component doesn't load when I select something which links me to this dynamic route.
       <Suspense fallback={Loader}>
         <Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
       </Suspense>

     </Switch>
   </Router>
 )
}

Я просто хочу, чтобы мой компонент загружался, когда я иду по этому маршруту. Но результат в том, что он загружает Home, но когда я выбираю один из них, он просто показывает index.html с пробелом, и я не вижу никакой ошибки.

4 ответа

Решение

Я нашел решение.. или вроде как в моем случае.

Я включил publicPath для своих пакетов.

Я добавил это в мой webpack.config.js

output: {
        publicPath: '/',
      },

и проблема, почему это не сработало в прошлый раз, заключается в том, что я просто обновляю страницу, зная, что установлен hotmodule, но он не обновляет мои конфигурации.

Поэтому после перезапуска сервера я увидел строку

Вывод webpack подается из (publicPath, который я объявил)

Хотя я потратил на эту проблему больше времени, чем следовало бы. Это работает сейчас, спасибо за все комментарии.

Я думаю, нет проблем в использовании, реагируют на приостановку или ленивость. просто используйте Switch неправильно.

Как реагирует роутер док:

Все дети <Switch> должно быть <Route> или же <Redirect> элементы. Будет обработан только первый дочерний элемент, соответствующий текущему местоположению.

Так, Switch Компонент может не распознавать маршрут, который обернут компонентом Suspense.

например:

import Loader from './path/toFile';
import Home from './path/toFile';
const LazyLoadedComponent = lazy(() => import('./path/toFile'));

const App = () => {
 return(
   <Router>
     <Suspense fallback={Loader}>
       <Switch>
         <Route exact path="/:viewType?" component={Home} /> 
         <Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
       </Switch>
     </Suspense>
   </Router>
 )
}

Вот пример в песочнице кода: https://codesandbox.io/s/async-react-router-v4-w-suspense-8p1t6

Попробуй это,

 <Suspense fallback={Loader}>
   <Switch>
     <Route path="/viewType/:selectionId" />
         <LazyLoadedComponent />
     </Route>
   </Switch>
 </Suspense>

Я решил это, внеся некоторые дополнительные изменения в webpack.config. первая конфигурация извлечения с использованием

npm run eject.

webpack.config.js

      path: isEnvProduction
            ? path.resolve(__dirname, "..", "build")
            : undefined,
    
filename: isEnvProduction
            ? "[name].js"
            : isEnvDevelopment && "static/js/bundle.js",
    
chunkFilename: isEnvProduction
            ? "[name].chunk.js"
    
publicPath: "/",
Другие вопросы по тегам