Closed Joie-Kim closed 2 weeks ago
오 덕분에 뒤에 언급이 없어서 공부하지 않았던 섀도우DOM 에 대해 한번더 찾아보고 공부하는 계기가 되었습니다!!! bbbb
SEO 측면에서 섀도우 DOM의 장단점
구글의 검색 엔진에서는 섀도우 DOM을 평면화 해서 읽어 온다고 합니다!
<script>
class MyComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
let p = document.createElement('p');
p.innerHTML = 'Hello World, this is shadow DOM content. Here comes the light DOM: <slot></slot>';
this.shadowRoot.appendChild(p);
}
}
window.customElements.define('my-component', MyComponent);
</script>
<my-component>
<p>This is light DOM content. It's projected into the shadow DOM.</p>
<p>WRS renders this content as well as the shadow DOM content.</p>
</my-component>
위처럼 만들면 랜더링 후 구글은
<my-component>
Hello World, this is shadow DOM content. Here comes the light DOM:
<p>This is light DOM content. It's projected into the shadow DOM<p>
<p>WRS renders this content as well as the shadow DOM content.</p>
</my-component>
이렇게 읽어 온다고 합니다! 그렇기 때문에 mode : 'open'을 사용해서 만든다고 한다면 SEO저하는 없을 것이라고 생각됩니다! 'closed'모드에 대해서는 web.dev에서
라고 나왔고
Note: Closed shadow roots are not very useful. Some developers will see closed mode as an artificial security feature. But let's be clear, it's not a security feature. Closed mode simply prevents outside JS from drilling into an element's internal DOM.
라고도 언급 된걸 보니 open 과 매한가지로 읽어오지 않을까..요?
섀도우 돔에 대한 블로그 SEO와 섀도우 돔에 대한 테스팅 구글의 서치콘솔이 Shadow DOM을 처리하는 방법 closed 모드는 왠만하면 쓰지말아라!
@horang-e 갓서현 ....... 관련해서 리서치 하러 들어왔다가 감동하고 갑니다 ...... 🥹
- 섀도우 DOM에서 ARIA 속성을 사용할 때의 문제를 다루고 있다. 특히 aria-labelledby와 같은 속성이 전역 ID 참조에 의존하는데, 섀도우 DOM 내부에서는 ID가 로컬로 스코프되기 때문에 다른 섀도우 루트나 전역 DOM의 요소를 참조할 수 없다. 이로 인해 ARIA 속성 사용에 어려움이 생길 수 있고, 현재 이를 해결하기 위한 기술적 노력(AOM, ARIA 리플렉션 등)이 진행 중이지만, 브라우저 지원은 아직 제한적이다.
- 섀도우 DOM을 프레임워크 환경(React, Vue 등)에서 사용할 때 몇 가지 충돌 가능성이 있어.
- Virtual DOM과의 충돌: React와 같은 프레임워크는 Virtual DOM을 사용해 효율적으로 UI 업데이트를 처리하는데, 섀도우 DOM은 브라우저의 실제 DOM을 독립적으로 관리해. 이로 인해 React의 Virtual DOM이 섀도우 DOM 내에서 발생한 변화를 감지하지 못할 수 있어.
- 스타일 및 이벤트 관리: 섀도우 DOM의 스타일 캡슐화가 프레임워크의 스타일 시스템과 충돌할 수 있고, 이벤트 버블링도 섀도우 DOM과 프레임워크 간에 다르게 동작할 가능성이 있어.
- 이러한 문제를 해결하려면 섀도우 DOM을 적절히 관리하는 추가적인 코드나 설정이 필요할 수 있어.
오오 shadow dom을 책에서는 자세히 다루지 않아, 그냥 가볍게 읽고 넘겼는데 찾아보니 흥미로운게 많네요.
저는 shadow dom을 사용하면 왜 성능적으로 좋을까??
라는 물음 위주로 서칭 해보았는데요.
-> 결과적으로 독립적인 DOM으로 동작하다 보니 reflow, 리렌더링, dom 파싱 등 연산이 많이 드는 작업들도 shadow dom 스코프 안에서만 동작해서 더 효율적이라는 것 같아요.
추가로 video태그도 shadow DOM을 기반으로 동작한다고 하네요.
섀도우 DOM과 프레임워크(React, Vue 등)를 함께 사용할 때 추가적인 코드나 설정이 필요한 예시를 몇 가지 설명할게.
React에서 dangerouslySetInnerHTML 사용: 섀도우 DOM에 접근하고 직접 HTML을 삽입하려면 React에서는 dangerouslySetInnerHTML을 사용해 섀도우 DOM의 콘텐츠를 처리할 수 있어. 이는 React의 Virtual DOM이 해당 부분을 무시하도록 하기 때문에 필요해.
이벤트 버블링 관리: 섀도우 DOM 안에서 발생한 이벤트가 부모 컴포넌트로 전달되지 않도록 설정해야 해. React와 Vue에서 customEvent나 이벤트 위임을 사용해 이벤트를 관리할 수 있어.
스타일 호환성: 섀도우 DOM은 캡슐화된 스타일을 적용하므로 프레임워크에서 사용하는 전역 스타일이나 CSS-in-JS 방식은 제대로 적용되지 않을 수 있어. 이 경우 스타일을 컴포넌트 안에 직접 정의하거나 ::part와 같은 방법을 사용해 스타일을 외부에서 제어할 수 있어.
이런 방식으로 섀도우 DOM과 프레임워크 간 충돌을 완화할 수 있어.
🧐 Question
1. SEO 측면에서 섀도우 DOM의 장단점
2. 접근성과 성능 최적화
📝 Reference