Отложенная загрузка компонентов в NextJS без использования `next / dynamic`

#javascript #reactjs #next.js

#javascript #reactjs #next.js

Вопрос:

Я создаю компонент (редактор), который всегда должен быть загружен лениво. Но это должно работать в любом приложении React.

React.lazy работает с CRA, но не с NextJS и Gatsby и другими решениями SSG / SSR.

Я не могу использовать next/dynamic , потому что тогда мой компонент привязывается к NextJS. И я стараюсь избегать использования react-loadable , чтобы сохранить размер пакета небольшим для пользователя, когда компонент не нужен.

Я пробовал отложенную загрузку следующими способами —

 const Title = () => <h1>title</h1>; // test component to lazy load 
 
 const Title = React.lazy(() => import("./Title"));
const Method1 = () => <Title />;
 
 const Method2 = () => {
  const [Title, setTitle] = React.useState(React.Fragment);
  React.useEffect(() => {
    import("./Title").then((module) => setTitle(module.default));
  }, []);
  return <Title />;
};
 
 const Method3 = () => {
  const [Title, setTitle] = React.useState(React.Fragment);
  React.useEffect(() => {
    setTitle(require("./Title"));
  }, []);

  return <Title />;
};
 
 const Method4 = () => {
  const Title = React.createRef(React.Fragment);
  const [isClient, setIsClient] = React.useState(false);
  React.useEffect(() => {
    Title.current = require("./Title");
    setIsClient(true);
  }, [Title]);

  const Component = Title.current;
  return isClient ? <Component /> : null;
};
 
 // Next JS `page/index.js`
export default function IndexPage() {
  return <Method4 />; //<Method1 />, <Method2 />, <Method3 /> doesn't work either.
}
 

Codesandbox с кодом — https://codesandbox.io/s/flamboyant-benz-emw2l?file=/pages/index.js:31-278

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

1. Вы пробовали использовать loadable-components ? Я думаю next/dynamic , использовать его внутренне

2. @AndrewZheng Не это, но я пробовал react-loadable , что работает, но я стараюсь избегать добавления внешних пакетов, если это возможно, чтобы, когда редактор не нужен, это оказывало минимальное влияние на размер пакета пользователя.

3. оба react-loadable и loadable-components имеют размер около 2 КБ, сжатый уменьшенный. Так что, на мой взгляд, это действительно не будет узким местом в производительности.