In modern web development, web components have become a standard tool for creating modular, reusable UI components. AndShadow DOM Shadow DOM is a core part of Web component technology that allows developers to encapsulate the internal structure and style of a component to prevent the style and behavior of the component from affecting the global page. However, traditional Shadow DOM implementations require explicitly creating and attaching Shadow DOMs via JavaScript, which increases development complexity.
To simplify Web component development, theDeclarative Shadow DOM Provides a new way for developers to define the Shadow DOM directly from HTML without relying too much on JavaScript, a feature that is particularly useful in server-side rendering (SSR) and static page generation (SSG) scenarios, dramatically improving page loading efficiency and the development experience.
In this article, we will introduce the basic syntax of declarative Shadow DOM, its use in conjunction with Javascript, and its main application scenarios and advantages.
I. What is Shadow DOM?
Shadow DOM is an important part of Web components that allows the internal DOM and styles of a component to be isolated from the external page by creating an encapsulated DOM tree. This allows components to have independent styles and functionality without conflicting with the rest of the page.
Traditionally, developers need to call theattachShadow()
method to manually create the Shadow DOM and attach it to custom elements. This approach adds complexity to the code and is difficult to use directly in server-side rendering and static page generation.
The Basic Syntax of the Declarative Shadow DOM
Declarative Shadow DOMs allow developers to define Shadow DOMs directly in HTML templates without having to create them in JavaScript. This approach relies on the<template>
tags, and byshadowroot
attribute to specify that the DOM should exist as a Shadow DOM.
Sample code:
<my-element>
<template shadowrootmode="open">
<style>
p {
color: blue;
}
</style>
<p>This is declarative Shadow DOM content!</p>
</template>
</my-element>
In this example, the<template>
tag is used to define the internal structure and style of the component, while theshadowrootmode="open"
Indicates that this is an open Shadow DOM that can be accessed externally.
This declarative syntax is more concise and conducive to server-side pre-rendering than the traditional creation method.
III. Declarative Shadow DOM in conjunction with Javascript
While the declarative Shadow DOM allows component structures to be declared directly in HTML, the behavior and logic of custom elements still needs to be defined in Javascript. For example, if we need to add interactive behavior to a component, we still need to write JavaScript code to register the custom element.
Example: Declarative Shadow DOM + Javascript Implementation of Counting Buttons
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8"> <title>.
<title>Declarative Shadow DOM Example </title>
</head>
<body>
<! -- Defines the template for the component -->
<count-button>
<template shadowrootmode="open">
<style>
button {
font-size: 16px; padding: 10px 20px; <style> button {
padding: 10px 20px;
}
</style>
<button > clicks: <span >0</span> </button>
</template>
</count-button>.
<script>
// Define the custom element class
class CountButton extends HTMLElement {
constructor() {
super();
// Get the button and count display element
= ('#increment-btn');
= ('#count'); // Get the button and count display elements.
= 0; // Initialize the count
// Bind the event handler
('click', () => {
();
});
}
// Define a method to increment the count
increment() {
++;
= ;
}
}
// Register the custom element
('count-button', CountButton);
</script>
</body>
</html>.
previews
jcode
Code Explanation:
-
HTML section:
- utilization
<template>
tag defines the structure and style of the count button component, and is passed through theshadowrootmode="open"
Declared as an open Shadow DOM. - Component styles and content are declared in HTML, reducing the need for DOM manipulation in Javascript.
- utilization
-
Javascript section:
- Defined a custom element using Javascript
CountButton
。 - Added button click event, each time the button is clicked, the counter is added one and the display is updated.
- Defined a custom element using Javascript
-
Custom Element Registration:
- utilization
method registers the custom element
<count-button>
。
- utilization
Application Scenarios of Declarative Shadow DOM
1. Server-side rendering (SSR)
The declarative Shadow DOM is very server-side rendering friendly. Since the component structure and styles are already declared in the HTML, the server can pre-generate the complete component and send it directly to the client. This not only reduces the initial load time of the page, but also improves search engine crawling, which is good for SEO.
2. Static page generation (SSG)
In static page generation, declarative Shadow DOM allows developers to embed predefined component structures into static HTML files, thereby increasing page load speed and reducing Javascript computation on the client side.
V. Advantages and Limitations of Declarative Shadow DOM
Advantage:
- Streamline the development processShadow DOM: Declare Shadow DOM directly through HTML, reducing dependence on Javascript and making development less difficult.
- performance enhancement: In SSR and SSG scenarios, pre-rendered components can be sent directly to the client, reducing the first rendering time.
- SEO Friendly: Component content can be included directly in HTML for easy crawling by search engines.
Limitations:
- Javascript remains indispensable: While the structure and style of a component can be defined declaratively, the interaction and logic of the component must be realized in JavaScript.
-
Browser compatibility: The declarative Shadow DOM is now supported by virtually all browsers, but requires newer versions of browsers and requires developers to consider compatibility issues.
VI. Summary
Declarative Shadow DOM It is a powerful new feature of Web component development that reduces Javascript dependency by simplifying the creation of the Shadow DOM, especially for server-side rendering and static page generation scenarios. Although its advantages are obvious, in actual development, developers still need to combine Javascript to realize the interaction and logic of components.
As browser support for this new feature grows, declarative Shadow DOM will become one of the dominant approaches to Web component development. For Web development projects that require high performance and modularity, declarative Shadow DOM is a new tool worth trying.
References:
- Introducing Declarative Shadow DOM
- Custom Elements User Guide