자체 구성 요소 기반 JavaScript 라이브러리

React와 Angular는 두 개의 가장 큰 전단 웹 개발 프레임워크/라이브러리 외에 또 어떤 공통점이 있습니까?
그것들은 모두 구성 요소에 기초한 것이다!
본고에서, 우리는 좋은 구식 일반 자바스크립트를 가진 구성 요소를 사용하는 간단한 전단 라이브러리를 만들 것이다.이것은 우리가 구성 요소를 더욱 잘 이해하고 순수한 JavaScript에서의 기술을 향상시키는 데 도움이 될 수 있다.

선결 조건


본고의 JavaScript 부분을 깊이 연구하기 전에 프로젝트 구조를 설정해야 합니다.이를 위해 component library라는 새 폴더와 다른 하위 폴더와 파일을 만들었습니다.
$ mkdir component-library
$ cd ./component-library
$ mkdir lib style components
$ touch index.html index.js ./style/styles.css
다음은 다음과 같이 HTML 및 CSS 파일을 작성해야 합니다.
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="style/styles.css">
</head>
<body>
  <main id="app"></main>
  <script type="module" src="index.js"></script>
</body>
</html>
body {
  background-color: cornflowerblue
}

a {
  text-decoration: none;
  color: white;
}

.article {
  border: 1px solid cornflowerblue;
  margin: 0px 2px 5px 2px;
  padding: 10px 15px 15px 15px;
  background-color: white;
}
이제 우리는 자바스크립트를 작성할 준비가 다 되었다.

도서관 이름은 Eszett


나는 먼저 도서관이 이미 존재하는 척하는 것을 좋아한다.따라서 우리가 먼저 주목해야 할 것은 색인이다.js.
파일의 맨 위에 있는 라이브러리를 가져와서 새 응용 프로그램을 실례화해야 합니다.
// All our imports are here
import ß from ./lib/Eszett.js;
// Initialize app
const app = new ß('app');
이 코드는 Eszett에서 어떤 내용도 내보내지 않았기 때문에 오류가 발생합니다.js.이 파일에서 우리는 ß라는 클래스가 필요합니다. 이 클래스는 구조 함수를 가지고 있습니다. 이 구조 함수는 선택기를 문자열로 수신하고 내보냅니다.우선 다음과 같은 파일을 만들어야 합니다.
$ touch ./lib/Eszett.js
이 파일의 내용은 다음과 같습니다.
class ß {
  constructor(selector) {
    this.eszettElement = document.querySelector(`#${selector}`);
    console.log(Eszett initialized!);
  }
}
export default ß;
응용 프로그램을 실행하면 오류가 발생하지 않으며 브라우저 콘솔에 "Eszett initialized"텍스트가 있어야 합니다.그러나 지금까지 우리의 코드는 그렇게 많이 만들지 않았다.응용 프로그램에 구성 요소를 등록할 가능성을 실현함으로써 이 점을 바꾸자.

구성 요소


이를 위해서는 다음과 같은 두 가지 작업이 필요합니다.
모든 등록 구성 요소를 저장하는 필드
registerComponent 방법
우선, 우리는 컨트롤러 바로 위의 구조 함수에 다음 줄을 추가합니다.로그:
this.components = {};
계획은 이 필드의 모든 구성 요소를 키 값 쌍으로 등록하는 것입니다.이를 위해서는 구조 함수 아래에 다음 방법을 추가해야 합니다.
registerComponent(component {
  this.components[component.name] = component;
}
현재 우리는 응용 프로그램에 구성 요소를 등록할 수 있다.등록은 색인에서 진행됩니다.js는 우리의 응용 프로그램 초기화 바로 아래에 있습니다.우리의 첫 번째 구성 요소는 MenuComponent입니다.이것은 두 가지 과정이 될 것이다. 우선, 우리는 구성 요소를 가져온 다음, 응용 프로그램이 초기화된 후에 그것을 등록한다.
그 후, 우리의 지수.js는 다음과 같이 해야 합니다.
// All our imports are here
import ß from ./lib/Eszett.js;
import MenuComponent from ./components/MenuComponent.js;
// Initialize app
const app = new ß(app);
// Adding our Components to the App
app.registerComponent(MenuComponent)
현재 MenuComponent가 없기 때문에 응용 프로그램에서 오류가 발생합니다. 이 오류는 다음과 같은 새 파일을 추가해서 만듭니다.
$ touch ./components/MenuComponent.js
이 파일에서, 우리는 아직 존재하지 않는 구성 요소를 가져올 것입니다.이렇게 하면 우리는 새로운 구성 요소를 만들 수 있다.그 다음에는 HTML 템플릿이 필요하지만 가장 중요하지 않은 것은 구성 요소 자체입니다.그것은 마땅히 이렇게 해야 한다.
// Import statements
import Component from '../lib/Component.js';

// HTML-Template
const menuTemplate = (state) =>`
  <header>
    <h1>
      <a href="#/posts">${state.name}'s Blog</a>
    </h1>
  </header>
`;

// Component
const MenuComponent = new Component(
  'menu', 
  {
    name: 'Jakob'
  },
  menuTemplate);

export default MenuComponent;
먼저 HTML 템플릿을 자세히 살펴보겠습니다.이것은 template literal (템플릿 문자열) 을 되돌려주고 매개 변수로 전송된 구성 요소 상태를 가져오는 함수입니다.여덟 번째 줄에서 우리는 이 상태가 블로그의 이름을 동적으로 나타내는 데 사용되는 것을 보았다.
구성 요소 자체를 보면, 우리는 그것이 세 개의 매개 변수에서 전달되는 것을 볼 수 있다.첫 번째 매개 변수는 구성 요소 자체의 이름이고, 두 번째 매개 변수는name라는 단일 속성을 가진 대상입니다.이것은 우리가 menuTemplate에 전달한 상태 대상이자 마지막 매개 변수입니다.
이 모든 것이 작용하기 위해서, 우리는 우리의 구성 요소를 실현해야 한다.js.먼저 다음과 같은 파일을 만들어야 합니다.
$ touch ./lib/Component.js
우리 구성 요소의 실현은 직접적이다.세 개의 매개 변수를 받아들이는 구조 함수가 필요합니다. HTML 템플릿 함수를 호출하고 결과를 되돌려주는 함수가 필요합니다.마지막은 이렇다.
class Component {
  constructor(name, state, template) {
    this.name = name;
    this.state = state;
    this.template = template;
  }

  view() {
    return this.template(this.state);
  }
}

export default Component;
현재 페이지에는 오류가 표시되지 않지만 MenuComponent도 표시되지 않습니다.

번역하다


우리는 구성 요소를 만들고 응용 프로그램에 등록할 수 있지만, 구성 요소 HTML을 표시할 수 없습니다.이 문제를 해결하기 전에, 나는 응용 프로그램에 PostsComponent를 추가하여 우리가 두 개의 구성 요소를 동시에 보여줄 수 있도록 하고 싶다.
그러려면 다음과 같이 등록해야 합니다.
// All our imports are here
import ß from './lib/Eszett.js';
import MenuComponent from './components/MenuComponent.js';
import PostsComponent from './components/PostsComponent.js';

// Initialize app
const app = new ß('app');

// Adding our Components to the App
app.registerComponent(MenuComponent);
app.registerComponent(PostsComponent);
만들려면 다음과 같이 하십시오.
$ touch ./components/PostsComponent.js
구현:
import Component from '../lib/Component.js';

const postsTemplate = (state) => `
  ${state.posts.map(post => `
    <li>
      <div class="article">
        <h3>${post.title}</h3>
        <p>${post.text}</p>
      </div>
    </li>`).join('')}
`;

const PostsComponent = new Component(
  'posts', 
  {
    posts: [{
      title: 'My first blog post',
      text: 'This is my first blog post EVER, its awesome!'
    },
    {
      title: 'Writing my own component library',
      text: 'In this article I want to share with you my experience on how to write a component library!'
    }],
  },
  postsTemplate
);

export default PostsComponent;
렌더링을 적용하기 위해서, 구성 요소의view 방법을 호출하고 HTML을 정의된eszettelent에 삽입해서 DOM을 업데이트해야 합니다.기술된 행위는 ß류의 한 방법이고registerComponent 방법에서 호출되어야 한다.이것은 우리 종류의 최종 실현이다.
class ß {
  constructor(selector) {
    this.eszettElement = document.querySelector(`#${selector}`);
    this.components = {};
    console.log('Eszett initialized!');
  }

  registerComponent(component) {
    this.components[component.name] = component;
    this.updateView();
  }

  updateView() {
    if (this.components) {  
      let mergedViews = '';
      Object.keys(this.components).forEach(key => {
        mergedViews += this.components[key].view()
      });
      this.eszettElement.innerHTML = mergedViews;
    }
  }
}

export default ß;
updateView 메서드는 먼저 등록된 구성 요소가 있는지 확인합니다.이 경우, 모든 구성 요소를 교체하고, 그 중 모든 구성 요소의view 방법을 호출합니다.반환된 HTML은 eszett Element의 innerHTML로 병합되고 설정됩니다.만약 모든 것이 순조롭다면, 너의 마지막 페이지는 반드시 이렇다.

다음은 뭘까요?


우리는 방금 Eszett라는 작은 도서관을 세웠다.격리 상태와 자체 HTML 템플릿을 포함하는 구성 요소를 만들 수 있습니다.이 구성 요소들은 응용 프로그램 단계에서 등록하고 보여줄 수 있다.
우리는 또 다른 기능을 추가할 수 있다.예를 들어, 특정 라우트에 특정 구성 요소의 라우터를 표시하거나 다른 구성 요소에 구성 요소를 중첩하여 상태를 전달할 수 있습니다.
자바스크립트 기술을 향상시키기 위해 새로운 기능을 추가하기만 하면 사용과 동시에 마음껏 즐길 수 있습니다!
평소와 같이, 너는 나의 GitHub에서 이 프로젝트의 코드를 찾을 수 있다.
사진은 Susan Yin에서 Unsplash으로 촬영되었다

좋은 웹페이지 즐겨찾기