사용자 정의 요소 또는: 걱정을 멈추고 웹 구성 요소를 사랑하는 법을 배웠습니다.

만약 당신이 이 글을 읽고 있고 인터넷 개발자라면, 당신은 언젠가는 전단 코드를 작성해야 할 것이다.사용자 정의 페이지와 날짜 선택기, 이미지 회전 목마 또는 스타일링 단추를 만들어야 할 수도 있습니다.전단 개발자로서, 당신은 이런 구성 요소를 한 번 또 한 번 만들어야 할 수도 있습니다.예를 들어 스타일화된 단추를 만들어야 한다면 1300여 개의 사용자 정의 단추 라이브러리를 찾아서 NPM에서 사용할 수 있습니다!
1344 버튼 구성 요소 라이브러리
대부분의 단추는 Angular, Vue, React 등 프레임워크에 특정되어 있는데, 이것은 현재 웹에서 가장 유행하는 프레임워크이기 때문이다.그러나 단추 (또는 다른 구성 요소) 가 프레임워크와 호환되지 않는 것을 발견하면 어떻게 됩니까?
나의 전형적인 반응은 내가 좋아하는 것을 찾을 때까지 다음 라이브러리로 돌아가는 것이다.그러나 일부 라이브러리, 예를 들면Ionic은 너무 좋아서 무시할 수 없다.문제는 오랫동안 Ionic는 Angular만 지원하기 때문에 다른 프레임워크를 사용할 경우 비공식적인 패키지 라이브러리를 사용해야 한다는 것이다.

There should be a framework-agnostic solution!


우리는 세 가지 틀로 알 수 없는 방법으로 이 문제를 처리할 수 있다.

CSS 방법


CSS 라이브러리를 사용할 수 있습니다.좋은 예는 Bootstrap.
<html>
<head>
 <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css">
</head>
<body>
 <button type="button" class="btn btn-primary">Primary</button>
 <button type="button" class="btn btn-secondary">Secondary</button>
 <button type="button" class="btn btn-success">Success</button>
 <button type="button" class="btn btn-danger">Danger</button>
 <button type="button" class="btn btn-warning">Warning</button>
 <button type="button" class="btn btn-info">Info</button>
 <button type="button" class="btn btn-light">Light</button>
 <button type="button" class="btn btn-dark">Dark</button>
 <button type="button" class="btn btn-link">Link</button>
 <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"></script>
 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script>
</body>
</html>
위의 설명과 같이 CDN을 통해 부트를 가져오고 <head> 에서 여러 가지 다른 단추가 있으며 마지막으로 <body> 의 하단에 필요한 JavaScript 라이브러리를 가져옵니다.
부트 버튼
최종 결과는 좋지만 몇 가지 일을 해야 한다.
  • 부트 기능을 정상적으로 실행하기 위해서는 구성 요소를 스타일링하는 데 필요한 CSS와 자바스크립트 파일을 도입하여 일부 구성 요소에 사용자 정의 동작을 가져야 합니다.사용자 정의 JavaScript 논리 자체는 아무런 문제가 없지만, 최종적으로 Bootstrap의 JavaScript 이외의 JavaScript 라이브러리, 예를 들어 JQuery와 Popper가 필요합니다.이것은 프로그램이 불러와야 실행할 수 있는 팽창을 증가시켰다.
  • 예쁜 단추를 얻을 수 있지만, Bootstrap이 사용하는 모든 종류를 기억하십니까?나는 그물과 관련된 종류만 안다.다른 방면에 관해서는 나는 갈 것이다 W3Schools.😅
  • 좋아, 이것은 해결 방안이지만, 그것은 아마도 가장 좋은 해결 방안이 아닐 것이다.

    JavaScript 메서드


    또 다른 솔루션은 Google Maps 같은 라이브러리에서 볼 수 있는 순수한 JavaScript를 사용하는 것입니다.
    <html>
    <head>
     <script src="https://maps.googleapis.com/maps/api/js?callback=initMap" async defer></script>
    </head>
    <body>
     <div id="map" style="height: 100vh; width: 100vw;"></div>
     <script>
       var map;
       function initMap() {
         map = new google.maps.Map(document.getElementById('map'), {
            center: { lat: -34.397, lng: 150.644 },
            zoom: 8
       });
     }
     </script>
    </body>
    </html>
    
    이 솔루션을 사용하면 페이지의 <body> 에 JavaScript 라이브러리를 포함할 수 있습니다.그런 다음 DOM 요소를 사용하여 어셈블리를 표시할 수 있습니다.
    구글 지도 JS Magic
    이 해결 방안은 결국 더욱 깔끔해져서 책벌레로서 매우 좋다.그럼에도 불구하고 몇 가지 문제가 발생했다.
  • Google Maps, Angular, React 등 자바스크립트 기반 라이브러리가 필요하면 패키지 라이브러리가 필요할 수 있습니다.왜?현대 프레임워크는 렌더링 엔진을 위해 DOM에 대한 접근을 추출하려고 하는데, 직접 DOM 조작을 권장하지 않는다.
  • 더 심각한 것은 이렇게 자바스크립트 기반의 라이브러리가 서버 쪽 렌더링에 잘 사용되지 않는다는 것이다.
  • 이 두 가지 해결 방안은 모두...🤮
    그렇다면 어떤 더 좋은 해결 방안이 있습니까?

    웹 구성 요소 방법


    보낸 사람https://www.webcomponents.org:

    Web components are a set of web platform APIs that allow you to create new custom, reusable, encapsulated HTML tags to use in web pages and web apps. Custom components and widgets build on the Web Component standards, will work across modern browsers, and can be used with any JavaScript library or framework that works with HTML.


    이것들의 규격은 무엇입니까?사용자 정의 요소, HTML 템플릿, 그림자 DOM 및 HTML 가져오기(비활성화) 등 4가지가 있습니다.비록 이 모든 규범들이 매우 중요하지만, 우리의 목적을 위해서, 사용자 정의 요소는 우리가 흥미를 느끼는 요소이다. (웹 구성 요소가 무엇인지 가장 곤혹스러워하는 요소이기도 하다.)
    Custom Elements spec 새 HTML 태그를 만들고 기존 HTML 태그를 확장하는 방법에 대해 설명합니다.내장된 HTMLElement 클래스를 확장하여 JavaScript, HTML, CSS만 사용하여 재사용 가능한 DOM 요소를 구축할 수 있습니다.최종적으로 얻어진 모듈화 코드는 응용 프로그램에서 다시 사용하기 쉬우며 작성해야 할 코드가 더욱 적다.더 이상 500개의 다른 클래스를 기억할 필요가 없습니다!
    사용자 정의 요소를 만드는 이유를 상상할 수 없다면, 제가 물어볼 수 있도록...
  • Vue에서 3주 전 당신의 회사인가, 아니면 React 상점에서 만든 같은 단추를 다시 만들어야 합니까?다음 달에 프레임을 다시 전환할 수 있습니까?
  • 만약 당신이 구성 요소 라이브러리를 만들고 싶다면, 예를 들어 Ionic는 어떤 프레임워크와 함께 사용할 수도 있고, 어떤 프레임워크와 함께 사용하지 않을 수도 있다. 어때!?
  • 당신이 큰 회사에서 일하고 각 부서가 제품에 대해 서로 다른 구조를 사용하며 회사가 을 갱신하기로 결정했을 때 무슨 일이 일어날까요?모든 팀은 반드시 같은 단추, 네비게이션 표시줄, 입력을 만들어야 합니까?
  • 하면, 만약, 만약...😍 90년대 <head> 라벨을 되찾고 싶어요?답은: 사용자 정의 요소 만들기!
    // ES6 Class That Extends HTMLElement
    class HelloWorld extends HTMLElement {
     // We Can Have Attributes And Listen To Changes
     static observedAttributes = [name];
     attributeChangesCallback(key, oldVal, newVal) {}
    
    // We Can Get And Set Properties
     set name(val) {}
     get name() {}
    
    // We Have Lifecycle Hooks
     connectedCallBack(){}
     disconnectedCallBack(){}
    
    // We Can Also Dispatch Events!!!!
     onClick() {
     this.dispatchEvent(new CustomEvent(nameChange, {}));
     }
    }
    
    // Register to the Browser from `customElements` API
    customElements.define(hello-world, HelloWorld);
    
    HTML 요소를 확장하여 사용자 정의 요소를 정의하고 현대 프레임워크에서 대부분의 작업을 수행할 수 있습니다.
  • 요소의 속성을 정의합니다. 이 속성들은 HTML 태그를 통해 요소에 전달되는 값입니다. 예를 들어 id나 클래스입니다.속성 변경에 따라 리셋을 트리거할 수도 있습니다.문자열만 전달할 수 있다는 것을 기억하십시오.
  • 요소의 속성은setter와getter가 있습니다. 복잡한 데이터 형식 (비문자열) 을 요소에 전달할 수 있습니다.
  • 라이프 사이클 연결을 사용하여 요소를 생성하고 제거합니다.
  • 원소의 상호작용과 다른 트리거 스케줄링 이벤트를 바탕으로 한다.
  • 이 모든 것이 완성되고 예쁜 요소를 구축한 후에 사용할 선택기와 생성된 클래스를 <blink> 방법으로 등록할 수 있습니다.

    활성 사용자 정의 요소


    다음은 사용 중인 사용자 정의 요소의 예입니다. 장시간 사용하지 않는 define 태그입니다.요소의 논리 및 DOM에 등록된 코드는 <blink> 의 CDN에서 로드된 JavaScript 파일에 바인딩됩니다.그리고 우리 <head> 에서 <body> 태그는 다른 HTML 요소와 마찬가지로 사용됩니다.만약 이것이 진정한 사용자 정의 요소라고 믿지 않는다면, inspect the TS 파일을 사용하도록 요청합니다.<blink> 태그는 간단한 DOM 작업을 통해 작성할 수 있는 등록 요소입니다.
    사용자 정의 요소에 대한 자세한 내용은 다음 리소스를 권장합니다.
  • https://www.webcomponents.org/introduction
  • https://polymer-library.polymer-project.org/3.0/docs/first-element/intro

  • <blink> 라벨에 관심이 있으시면 GitHub 에서 제 코드를 찾을 수 있고, NPM 에서 이 라이브러리의 패키지 버전을 찾을 수 있습니다.
    내가 하는 모든 일을 따라잡기 위해 따라와라.만약 네가 생각하고 있다면, "코드를 보여줘!"너는 GitHub에서 나를 찾을 수 있다.

    좋은 웹페이지 즐겨찾기