Skip to content

ReactJS Suspense equivalent hook to dynamically import modules for code splitting

License

Notifications You must be signed in to change notification settings

nirus/useDynamicImport

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 

Repository files navigation

useDynamicImport Hook

Import modules dynamically & support webpack code splitting in Next.js and React compatible apps


<Suspense /> equivalent react hook to dynamically import modules for code splitting on client side only.

Typescript compatible for module type inference for easy development.

Note: Once the module is imported it is cached and subsequent import will always serve the previously import cache.

The Hook: (source code)

import { useEffect, useRef, useState } from "react";

const DEFAULT_VALUE: never[] = [];

export const useDynamicImport = <T>(modules: () => T[]) => {
  const [isMounted, setIsMounted] = useState(false);
  const modulesFnRef = useRef(modules);
  const [resolvedValues, setResolvedValues] = useState<
    [Awaited<T>[], { loading: boolean, isErrored: boolean, error?: unknown }]
  >([DEFAULT_VALUE, { loading: true, isErrored: false }]);

  useEffect(() => {
    /* Execute once only */
    if (isMounted) return;
    (async function importModule() {
      try {
        const result = await Promise.all(modulesFnRef.current());
        setResolvedValues([result, { loading: false, isErrored: false }]);
      } catch (e) {
        setResolvedValues([DEFAULT_VALUE, { loading: false, isErrored: true, error: e }]);
      }
      setIsMounted(true);
    })();
  }, [isMounted]);
  return resolvedValues;
};

Hook Usage:

import useDynamicImport from 'hook/useDynamicImport'

export default function Home() {
  const [[module1], { isErrored, loading }] = useDynamicImport(() => [import("./test")]);

  return <div>HOME PAGE {module1.pageName()}</div>
}

About

ReactJS Suspense equivalent hook to dynamically import modules for code splitting

Topics

Resources

License

Stars

Watchers

Forks