react-imported-library

Code split any library using React renderProps

Usage no npm install needed!

<script type="module">
  import reactImportedLibrary from 'https://cdn.skypack.dev/react-imported-library';
</script>

README

IMPORTED LIBRARY ✂


imported library

Dont code-split components - code split libraries

Build status

Use the power of renderprop to delived a Library as a React component. Based on React-imported-component. Support SSR and React Suspense.

  • ⛅️ You can codesplit momentjs, you may async load any library and use it.
  • 🏎 Sync on server, and for already loaded stuff, async on client.
  • 🚀 Bundler-independent SSR (when used with react-imported-component).
  • 🔒 Written in TypeScript.
  • 😴 Suspense friendly

Usage

Have you heard, than moment.js is super hudge? Code split it!

import {importedLibraryDefault, setConfig} from 'react-imported-library';

// do you need SSR support? Probably not (affects react-imported-component settings)
setConfig({SSR: false});

// this will import `default` export
const Moment = importedLibraryDefault( () => import('momentjs'));

<Moment>
 { (momentjs) => <span> {momentjs(date).format(FORMAT)}</span> }
</Moment>

// You can use suspense
const Moment = importedLibraryDefault( () => import('momentjs'), { async: true });

<Suspense>
    <Moment>
     { (momentjs) => <span> {momentjs(date).format(FORMAT)}</span> }
    </Moment>
</Suspense>

May be you have a small library, you may use somewhere inside your components?

Codesplit it!

import {importedLibrary} from 'react-imported-library';
const Utils = importedLibrary( () => import('./utils.js'));

<Utils>
 { ({a,b,c }) => <span> {a(b+c())} </span> }
</Utils>

May be you also have to calculate something heavy, not to do it on every render?

// you may use "initialization hook" to offload some computations

<Utils
  initial={ ({a,b,c}) => ({ result: a(b+c()) })}
>
 {(_,state) => <span>{state.result}</span>} 
</Utils>


API

importedLibrary

  • importedLibrary(importer, options?): Component
    • importer is an import statement, or any Promise resolver
    • options
      • options.async:boolean - enables React.suspense, ie throws a Promise on loading
      • options.exportPicker - allows you to "pick" export from the original file

importedLibraryDefault

  • importedLibraryDefault(importer, options?): Component - is just importedLibrary with exportPicker configured to pick .default

lazyLibrary

  • lazyLibrary(importer): Component - is just importedLibrary with async configured be true

all helpers returns "Component"

  • Component
    • initial: (library: T) => K; - state initializator, state will be passed as second argument to a children.
    • children: (library: T, state: K) => React.ReactNode - function-as-children
    • -- does not work in async mode --
    • error: ReactComponent - error indicator
    • loading: ReactComponent - unthrottled loading indicator.

Licence

MIT