
Webpack을 통해 Shadow Root에 CSS 스타일 주입하기
Shadow Root를 사용하는 웹 컴포넌트를 다룰 때 스타일을 수정해야 할 필요가 있다면 일부 도전적인 상황에 직면할 수 있습니다. head 태그에 추가된 스타일은 캡슐화된 Shadow Root에 영향을 주지 않습니다. 이 블로그 포스트에서는 모든 컴포넌트의 스타일을 로드하고 웹팩을 사용하여 그림자 루트 내부에 주입하는 방법을 알아보겠습니다.
Shadow Root에 CSS 스타일 주입 문제 이해하기
Shadow Root를 가진 웹 컴포넌트를 생성할 때 스타일은 일반적으로 head 태그에 추가됩니다. 그러나 Shadow Root 내부의 스타일에는 어떠한 영향도 미치지 않습니다. 스타일이 Shadow Root 내부에 나타나도록 하려면 대안적인 해결책을 찾아야 합니다.
class AssetsWebComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
// ...
}
}
위의 코드 스니펫에서 보여지듯이, 웹 컴포넌트는 HTMLElement 클래스를 확장하고 그림자 루트를 연결하여 생성됩니다. 현재 스타일은 그림자 루트 외부에 추가되어 적용되지 않습니다.
‘css-loader’만 사용하기
해결책 중 하나는 ‘style-loader’를 제거하고 웹팩 설정에서 ‘css-loader’만 사용하는 것입니다. 이렇게 하면 스타일을 문자열로 가져와서 그림자 루트 내에 수동으로 주입할 수 있습니다.
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['css-loader'],
},
// ...
],
},
// ...
};
웹팩 설정의 rules 섹션에서 ‘style-loader’를 제거하세요. 이제 더 이상 필요하지 않기 때문입니다.
스타일 로드 및 주입하기
이제 웹 컴포넌트의 생성자 코드를 수정하여 스타일을 로드하고 그림자 루트 내에 주입합니다:
import styles from './tmp/mockComponent.css';
class AssetsWebComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
const styleTag = document.createElement('style');
styleTag.innerHTML = styles;
this.shadowRoot.appendChild(styleTag);
// ...
}
}
위의 코드 스니펫에서는 웹팩의 모듈 시스템을 사용하여 CSS 파일에서 스타일을 가져옵니다. 그런 다음 새로운 <style> 요소를 생성하고 그 innerHTML을 가져온 스타일로 설정합니다. 마지막으로 스타일 요소를 그림자 루트에 추가하여 캡슐화된 그림자 DOM 내부에 스타일이 적용되도록 합니다.
마무리
Shadow Root에 CSS 스타일 주입하기는 웹팩 설정에서 ‘css-loader’만 사용하고 스타일을 Shadow Root에 수동으로 주입함으로써 Shadow DOM 캡슐화를 사용하는 웹 컴포넌트의 스타일을 성공적으로 수정할 수 있습니다. 이 방법을 사용하면 모든 컴포넌트에 스타일을 로드하고 적용하여 애플리케이션 전체에서 일관된 스타일링을 보장할 수 있습니다.
변경된 웹팩 설정으로 애플리케이션을 다시 빌드하여 변경 사항이 적용되는지 확인하세요. 이 해결책을 사용하면 ‘style-loader’에 의존할 필요가 없으며Shadow Root 내부의 웹 컴포넌트 스타일링을 완벽하게 제어할 수 있습니다.
읽어주셔서 감사합니다! 이 튜토리얼이 Webpack을 사용해서 Shadow Root에 CSS 스타일을 주입하는 데 도움이 되었기를 바랍니다. 즐거운 코딩 하세요!
참고 자료 :
https://stackoverflow.com/questions/60659473/inject-css-styles-to-shadow-root-via-webpack
같은 카테고리의 다른 글 보기 :