Angular에 작성한 Web Component 사용하기 (How to use webcomponent in Angular)

1 분 소요

이번 글에서는 webcomponent를 Angular 프로젝트에서 사용하는 방법에 대해 살펴보겠습니다.
특히, index.html이 아닌 Angular component 에서 WebComponent를 호출하는 방법에 중점을 둘 것입니다.

webcomponent 준비

지난 글을 참조하여 webcomponent를 작성합니다.

새 프로젝트 생성

webcomponent를 적용하기 위한 새로운 angular project를 생성합니다.

npm new angular-webcomponent

script 파일 복사

이전에 작성한 WebComponent의 3개 파일(bundle.js, main.js, polyfills.js)을 새 프로젝트로 복사합니다.
폴더의 위치는 중요하지 않습니다. 이 글에서는 src/scripts 폴더를 생성하였습니다.

(만일 webcomponent를 npm으로 설치한 경우는 이 과정이 필요 없으므로 이 영역은 무시해도 됩니다.)

webcomponent tag 호출

임의의 component에서 webcomponent tag를 작성합니다.

<my-library-component></my-library-component>

script import

angular에서 외부 스크립트를 추가하는 방법은 3가지 입니다.

  • angular.json의 “script” 에 추가
  • index.html에
  • component의 import 에 추가

angular.json에 추가 (실패)

script 파일은 다음과 같이 angular.json의 script에 추가할 수 있습니다.

...
"scripts": [
  "./src/scripts/bundle.js"
]

이를 실행하면 다음의 경고가 나타나며 적용되지 않습니다.

Failed to resolve dependency: ./main.js, present in 'optimizeDeps.include'
Failed to resolve dependency: ./polyfills.js, present in 'optimizeDeps.include'

외부에서 접속 가능하도록 assets 폴더에 넣어도 마찬가지 현상이 발생하며, 만일 main.js와 polyfills.js를 추가하면 중복된 함수 에러가 발생하므로 이 역시 불가능 합니다.

index.html에 추가 (성공)

index.html에

...
<script src="./assets/scripts/bundle.js"></script>

단, 이 방법은 script가 모든 페이지에 로드되므로 최적화에 좋지 않습니다. 작은 프로젝트나 자주 사용되는 경우에만 추천됩니다.

component에 import 하기 (성공, 추천)

component에서 다음과 같이 js를 형태 그대로 import 할 수 있습니다.

import "./src/scripts/bundle.js";

이 방법은 필요한 컴포넌트에서만 스크립트를 로드하는 것이 최적화에 좋습니다.
특히 큰 프로젝트에서는 여러 컴포넌트에서 사용되는 경우에만 이 방법을 사용하세요.

CUSTOM_ELEMENTS_SCHEMA 설정

위와 같이 정의한 뒤 프로젝트를 실행해도 webcomponent가 로드되지 않는데 이는 webcomponent는 angular 프로젝트 내에서 작성된 component가 아니기 때문입니다.
따라서 외부 component를 허용하도록 schema를 설정해주어야 합니다.
사용 가능한 schema는 두 가지가 있는데 사용자 지정 요소를 허용하는 CUSTOM_ELEMENMTS_SCHEMA 와 알 수 없는 요소나 속성을 사용할 때 관련 에러를 무시하도록 허용하는 NO_ERRORS_SCHEMA 가 있습니다.
상황에 따라 선택할 수 있으나 NO_ERROES_SCHMEA의 경우 관련 에러를 모두 무시하므로 필요한 에러 메시지를 받을 수 없는 상황이 있을 수 있어 사용 전에 잘 검토해야 합니다.

import { CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core';

@Component({
  ...
  schema: [CUSTOM_ELEMENTS_SCHEMA]
})
...

이제 실행하면 원하는 결과대로 webcomponent를 성공적으로 호출하는 것을 확인할 수 있습니다.

component의 소스 코드는 다음과 같습니다.

import { CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core';
import "../scripts/bundle.js";

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [],
  template: `<my-library-component></my-library-component>`,
  styleUrl: './app.component.scss',
  schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppComponent {
  title = 'webcomponent-angular';
}

참고 사이트

Using Web Components in an Angular application: Joyful & Fun

댓글남기기