Skip to content

Instantly share code, notes, and snippets.

@julrich
Created September 25, 2021 18:15
Show Gist options
  • Save julrich/73441d0f94fcc581b29183168060d2c9 to your computer and use it in GitHub Desktop.
Save julrich/73441d0f94fcc581b29183168060d2c9 to your computer and use it in GitHub Desktop.
Usage of `loadable()` for dynamic component resolution for pages

Description

exports.json files include maps to all published components, and for different modules (base, blog, content). This is used to look up the correct library folder and component name to resolve.

import baseExports from '@kickstartds/base/lib/exports.json';
import blogExports from '@kickstartds/blog/lib/exports.json';
import contentExports from '@kickstartds/content/lib/exports.json';
const components = {};
const componentCounter = [];
Object.entries(baseExports).forEach(([key, value]) => {
components[key] = loadable(({component}) => import(`@kickstartds/base/lib/${component}/index.js`), {
resolveComponent: (exports) => exports[value[0]],
});
});
Object.entries(blogExports).forEach(([key, value]) => {
components[key] = loadable(({component}) => import(`@kickstartds/blog/lib/${component}/index.js`), {
resolveComponent: (exports) => exports[value[0]],
});
});
Object.entries(contentExports).forEach(([key, value]) => {
components[key] = loadable(({component}) => import(`@kickstartds/content/lib/${component}/index.js`), {
resolveComponent: (exports) => exports[value[0]],
});
});
const getComponent = (element) => {
const componentType = element['type'];
componentCounter[componentType] = componentCounter[componentType]+1 || 1;
const key = componentType+'-'+componentCounter[componentType];
const Component = components[componentType];
return <Component component={componentType} key={key} { ...element } />;
};
const getContent = (elements) => {
if (elements && elements.length > 0) {
return elements.map((element) => getComponent(element));
}
};
export const Page: FunctionComponent<any> = ({
elements,
}) => (
<Layout>
{getContent(elements)}
</Layout>
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment