In my experience there are two problems you have to face.
The relativly easy one is the technical solution. HOW to provide the shared data. By providing the final artefacts (per component) as a JS file that could be included. Or as NPM /YARN / Whatever packages from your private repository. Or, or, or.
The interesting problem is, how to handle updates in your shared components. And that has a huge impact which technical solution is applicable.
For example if you know that you will never (really NEVER) change the API of your shared components, then each application can load the artefact at runtime from a central server. That way each application will always use the most up to date version. Still, if any application depends used knowledge about the inner implementation of a shared component and depends on it, a change in that componentn may still break the application.
Or each application uses a defined version of a shared component. That means that each project has to update their dependency to that component on their own. A new release of a shared component then means the need for a new release of that application (if they want to take advantage of the updated component).
Or you could use semantic versioning. And provide artefacts for each major release (which may contain breaking changes). Each minor or bugfix release of a component will replace the old artefact for that mayor release. That way each application will download the most current version, without breaking changes.
BUT there is a big caveat.
Those who change a shared component, do not know how it is used. That means they have to be much more carefully with changes. Also the testing of a shared component may work fine in application A but will totaly fail for application B. That means that developers of a shared component must apply a much stricter quality assurance then if every project just copies the data and therefore is responsible for that code on their own.
This includes not only API and code quality but also the quality of the documentation.
Long Story Short:
The technical solution is not really the problem. There are many possible solutions to it, not all easy, but still doable.
The real problem lurks behind the danger of changing a shared component.