-
-
Save CITguy/6c407eb6e243bb092ca4acf0472ff9eb to your computer and use it in GitHub Desktop.
This guide is in reference to modern versions of Angular (v2+).
If you want use @angular/cli
to bootstrap your application,
you'll need to make sure to do the following to ensure maximum compatibility with custom elements.
Add CUSTOM_ELEMENTS_SCHEMA
to the list of schemas in src/app/app.module.ts
to allow 3rd-party custom elements in angular components (see snippet below).
/*
* src/app/app.module.ts
*/
import { BrowserModule } from '@angular/platform-browser';
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
export class AppModule { }
This guide is in reference to legacy 0.x and 1.x versions of AngularJS.
However, according to custom-elements-everywhere.com,
AngularJS 1.7.8 has perfect compatibility with custom elements.
Compatibility with earlier versions of AngularJS 1.x are unknown, though.
If you are using AngularJS, you might want to consider upgrading or porting to a modern framework.
As announced by the AngularJS team,
AngularJS 1.7 is the last feature release and will remain in a 3-year Long Term Support period.
On June 30, 2021, AngularJS will reach the end of its support.
(a.k.a. No framework)
- Be aware of built-in methods and properties of HTMLElement and its prototype chain.
- Node ← Element ← HTMLElement
- WARNING: Be aware that
autocomplete
for forms has browser compatibility issues.
React 15 does not fully support Custom Element v1 spec
It lacks support for the slot
attribute, which is required in order to take advantage of
Light DOM redistribution into Shadow DOM slots. For this redistribution to happen,
the slot
attribute needs to be present in the rendered markup.
React 15 ignores unknown attributes and slot
isn't a known attribute, so it's missing
from the rendered markup. This results in Light DOM elements being redistributed into
the wrong Shadow DOM slots.
Assume the following React/JSX Template:
<my-custom-element>
<p id="first">
I will be redistributed into the default, unnamed slot in Shadow DOM.
</p>
<p id="second" slot="extra">
I should be redistributed into the "extra" slot in Shadow DOM.
React 15 doesn't include [slot="extra"], so I get redistributed
into the default, unnamed slot instead.
</p>
</my-custom-element>
React 15 Renders the following: (notice how slot
is missing from <p id="second">
)
<my-custom-element>
<p id="first">...</p>
<p id="second">...</p>
</my-custom-element>
React 16+ Renders the following: (the slot
attribute is still present)
<my-custom-element>
<p id="first">...</p>
<p id="second" slot="extra">...</p>
</my-custom-element>
- Listening for custom events in React requires the use of a
ref
in order to attach event listeners viaref.addEventListener()
- Warning: React's synthetic events violate non-bubbling specifications.
- It is a "known and intentional deviation".
- See facebook/react#12786 and facebook/react#6410 for information.
TL;DR - All HTMLElement
(custom element) lifecycle methods execute during render()
React.Component
- constructorReact.Component
- componentWillMount()React.Component
- render()HTMLElement
- create/connect- constructor
- attributeChangedCallback()
- connectedCallback()
React.Component
- componentDidMount()
React.Component
- componentWillUnmount()React.Component
- render()HTMLElement
- disconnect- disconnectedCallback()
React.Component
- componentWillUpdate()React.Component
- render()HTMLElement
- disconnect- disconnectedCallback()
HTMLElement
- create/connect- constructor
- attributeChangedCallback()
- connectedCallback()
There are no known compatibility issues when consuming custom elements in Vue templates.
- FYI: nesting a
<div>
within a<p>
seems to break data binding in VueJS 2.5- (codepen example)
- trying to track down the reason why this breaks
- To be continued...