#javascript #reactjs
Вопрос:
Я пытаюсь реализовать контекстную боковую панель на основе маршрута. Идея заключается в том, что страница контейнера такая же, но боковая панель и часть содержимого загружаются динамически.
React.lazy()
делает именно то, что я хочу, но по какой-то причине это работает только в том случае, если я определяю свой путь к модулю как фактическую строку:
const SideNav = React.lazy(() =>
import("./navigation/concepts") // this is fine
);
Тем не менее, я бы очень хотел сделать эту динамику динамичной, чтобы я мог определить карту маршрутов к местоположениям модулей как таковую:
const module_map = {"/docs/concepts" : "./navigation/concepts"};
console.log(module_map[this.props.location.pathname] === "./navigation/concepts"); // Just for sanity: this print 'true'
const SideNav = React.lazy(() =>
import(module_map[this.props.location.pathname])
);
Это приводит к ошибке:
Error: Cannot find module './navigation/concepts'
Я попытался сначала определить путь к модулю как константу и даже передать его как свойство родительского компонента, но результат тот же.
Есть какие-нибудь идеи, почему это происходит и как я могу это решить?
Ответ №1:
используйте __dirname вместо использования относительных путей.
import React, { lazy, Suspense } from "react";
const file = `${__dirname}/components/MyComponent`;
const MyComponent = lazy(() => import(file));
export default function App() {
return (
<Suspense fallback="Loading">
<MyComponent />
</Suspense>
);
}
Комментарии:
1. Интересно, что в вашей песочнице кода
__dirname
разрешается/src
, предоставляя/src/components/MyComponent
. В моем коде он преобразуется в пустую строку, обеспечивая//components/MyComponent
. Модуль не может быть найден, даже если я вручную установлю путь к тому, который он разрешает в вашем примере.2. Это может быть связано с вашей структурой каталогов и, возможно, конфигурациями веб-пакетов. Потому что, как вы можете видеть в codesandbox, он работает при нормальных обстоятельствах.
3. Я предполагаю, что это конфигурация webpack, но я загрузил свое приложение с
create-react-app
помощью, и я думаю, что я могу сделать очень мало настроек?4. попробуйте это решение github.com/webpack/webpack/issues/1599 (внизу)