Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Angular Elements from different scripts

Is it possible to use Angular Elements generated from diffrent scripts?

I have 2 projects weather-widget and clock widget which generates their own script(concated all required ones).

When I use these widgets individually it works fine but when these are used on same page it gives error shown as below:

DOMException: Failed to execute 'define' on 'CustomElementRegistry': this name has already been used with this registry
at CustomElementRegistry.define (http://172.27.147.64:8080/node_modules/document-register-element/build/document-register-element.js:2:18538)
at new AppModule (http://172.27.147.64:8080/dist/weather-widget/main.js:115:24)
like image 254
Rahul Bhooteshwar Avatar asked May 31 '18 08:05

Rahul Bhooteshwar


People also ask

How can I use angular element in another angular project?

In order to use it in another Angular app, we don't really need to build the component; as it is a simple Angular component, we can just import and use it. But if we only have access to compiled files, we can include them with the scripts field in our angular.

What are Webcomponents in angular?

Web components are a way of creating custom elements that work alongside the standard HTML elements. The goal for web browsers, such as Google and Mozilla, is to provide a standardized way for developers to create custom elements with any framework.

Does angular use custom elements?

Angular elements are Angular components packaged as custom elements (also called Web Components), a web standard for defining new HTML elements in a framework-agnostic way.


2 Answers

Just to update this so other users will find a solution. This is now possible using the Angular Custom Webpack Builder.

In angular.json

      "architect": {
        "build": {
          "builder": "@angular-builders/custom-webpack:browser",
          "options": {
            "customWebpackConfig": {
              "path": "./apps/custom-elements/extra-webpack.config.js",
              "mergeStrategies": { "externals": "replace" }
            },
            ...

And in the extra-webpack.config.js file add something like this:

module.exports = {
  output: {
    jsonpFunction: 'webpackJsonpElements',
    library: 'elements',
  },
}

If it still doesn't work have a go at adding/removing the polyfills from the Polyfills.ts file and adding/removing the custom-elements-es5-adapter.js which you can pull from here

like image 103
Andrew Dover Avatar answered Nov 02 '22 12:11

Andrew Dover


The feature to have multiple angular micro apps on the same page is currently not supported.

The error that you see actually describes the issue well. When you load your second micro app, bootstrap will run and try to bootstrap the module by calling it's ngDoBootstrap method. If you do some detailed logging though, you will notice that it tries to invoke ngDoBootstrap on the first micro app for the second time. If you want to make this work, you would need to do some manual work to control the bootstrap process yourself and make sure to bootstrap the correct module when it is introduced on the page.

Resource

like image 23
Andrej Kikelj Avatar answered Nov 02 '22 12:11

Andrej Kikelj