#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 КБ, сжатый уменьшенный. Так что, на мой взгляд, это действительно не будет узким местом в производительности.