Create a widget
This tutorial asumes that you already bootstrapped an extension as explained here.
After the bootstrap is done, change directory to the extension you've just created and add a new folder src
Now let's create the entry file for the widget.
touch src/index.ts
Open the index file and create and export the registration function
export widget's registration function
export const register = () => {
  return {};
};
Next, we'll need to add the following properties to the config object:
| Required | Description | |
|---|---|---|
| loadingFn | true | the loading function | 
| mountsIn | true | where to show this widget | 
Let's create a simple React component in a new file in the src folder.
touch src/my-widget-component.tsx
This file will be dynamically imported using the loadingFn and must export single-spa-react lifecycle methods:
src/my-widget-component.tsx
import React from "react";
import ReactDOMClient from "react-dom/client";
import singleSpaReact from "single-spa-react";
const MyWidget = () => {
  return <div>Hello World</div>;
};
export const { bootstrap, mount, unmount } = singleSpaReact({
  React,
  ReactDOMClient,
  rootComponent: MyWidget,
  errorBoundary: () => {
    return <div>Error in widget</div>;
  },
});
Now we are ready to complete the configuration of our widget:
export const register = (options: IntegrationRegistrationOptions) => {
  return {
    loadingFn: () => import("my-widget-component"),
    mountsIn: options.layoutSlots.widgetSlotId,
  };
};
Well done! Now if you rebuild the project you will see the widget in the right side of the page.