- From: Filimon Danopoulos <notifications@github.com>
- Date: Mon, 30 Sep 2024 10:17:39 -0700
- To: WICG/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <WICG/webcomponents/issues/1074@github.com>
I would like to discuss the possibility of using custom elements without requiring the custom element registry.
## Overview
Allowing a custom element to be used without a custom element registry allows us to sidestep a lot of the issues around the global registry that are discussed in #716. Instead of introducing a new registry we allow a per-element definition.
In order to get the conversation started I propose the working name of anonymous custom elements. The primary drive is to couple custom elements with ESM modules. This would require no changes to the DOM-api as we can simply use a constructor directly.
```js
// my-example.js
export class MyExampleElement extends HTMLElement {
constructor() {
super()
const root = this.attachShadow({ mode: 'open' })
root.innerHTML = '<span>example</span>'
}
}
// index.js
import { MyExampleElement } from './my-example.js'
document.body.appendChild(new MyExampleElement ())
```
The HTML for this could be
```html
<body>
<anonymous>
#shadow
<span>example</span>
</anonymous>
</body>
```
This new `<anonymous>` element would keep track of the module that defines the custom element in the property `module` and the constructor in a property `definition`. In the example above `module` would be the value of `import.meta.url` and `definition` the local name of `MyExampleElement` in that module.
These two would also allow for an HTML API.
```html
<anonymous module="./my-example.js" definition="MyExampleElement"></anonymous>
```
This would load the ESM module `./my-example.js` and use the constructor defined from that module. A similar thing could be done via DOM
```
const anonymous = document.createElement('anonymous')
anonymous.module = './my-example.js'
anonymous.definition = 'MyExampleElement'
document.body.appendChild(anonymous)
```
## Benefits
- Utilizing ESM-modules instead of a registry allow for custom elements to be defined more closely to what one would expect coming from other component systems.
- Since tag name is not relevant a lot of the edge cases that arise with scoped element registries are sidestep entirely.
- Additionally this adds a much needed feature of on demand loading of custom elements based on usage.
## Drawbacks
- Possibly SSR support for a feature like this could be hard. Should declarative shadow DOM be allowed?
- Not possible to target specific custom elements with tag selectors.
I am happy to explore this idea with you all. This is my first issue so please guide me if something is missing or is formatted incorrectly.
--
Reply to this email directly or view it on GitHub:
https://github.com/WICG/webcomponents/issues/1074
You are receiving this because you are subscribed to this thread.
Message ID: <WICG/webcomponents/issues/1074@github.com>
Received on Monday, 30 September 2024 17:17:43 UTC