Development of Custom Element using Vue.js #kyotojs

이 슬라이드는 사내 학습회에서 발표하려고 제작됐으나 연말에 사람이 거의 없어 공양으로 #kyotojos vol.15에 발표됐다.
  • potato4d
  • real name: HANATANI Takuma
  • organizations
  • ElevenBack (self-employed)
  • LINE Corp
  • Maintainer at
  • vuejs/jp.vuejs.org
  • nuxt/docs
  • Web Application Developer
  • ♥ Vue.js, Nuxt.js, Node.js(w/TypeScript), Serverless
  • ♥ User interface, Micro interaction, Product development
  • 오늘 할 말

  • 개발 프레젠테이션
  • 웹 Components-Com Elements의 개발 방법
  • Vue CLI v3의 Vue를 사용합니다.js 기반 Custom Elements 개발
  • 실제 개발 프로세스에 대해
  • Vue.js의 개발 프로세스에 대한 함정
  • 가용성
  • 주의



    개발물


    Kamishibai Viewer


  • 사랑 이야기
  • Qita의 슬라이딩 모드 내장 뷰어
  • SlideShare/Slides.com/SpeakerDeck은 빠르게 삽입할 수 있지만 Qita는 안 됩니다
  • OSS로 만들면 다들 좋아할 것 같아서 개발
  • Vue.js로 제작
  • Custom Elements의 개발 방법


    하면, 만약, 만약...

  • lit-html
  • 최박
  • 그다지 기쁘지 않다

  • lit-element
  • 인간에게 적합
  • class &render 함수
  • 최근에 rc가 나왔어요. 차이가 많이 났어요. 스테이블을 해야 하나요?
  • Custom Elements의 개발 방법


    프레임이 작동하면(1)

  • Angular Elements
  • Anglar로 제작
  • 아직 개발 중(인 것 같다)
  • 큰 번들 크기(Anglar 포함)
  • Ivy가 오면 min12kb로 구성(비슷)
  • Custom Elements의 개발 방법


    프레임 작업하면(2)

  • Vue CLI v3
  • Vue.js로 제작
  • 번들 사이즈가 너무 많아서
  • 약간 괴벽
  • 하고 싶은 말→Custom Elements는 프레임으로 만들 수 있어요.


    Vue CLI v3 개발


    대략적인 절차


    환경 구축


    terminal
    $ vue create my-wc-project
    $ yarn add @vue/web-component-wrapper
    

    package.json 편집


    package.json
    {
      "name": "my-wc-project",
      "scripts": {
        "build": "VUE_CLI_CSS_SHADOW_MODE=true vue-cli-service build --target wc --name my-component ./src/wc.ts",
        "...": "..."
      },
      "...": "..."
    }
    

    Entrypoint 전용 제작


    src/wc.ts
    import Vue from 'vue'
    
    // TS の定義はない
    const { default: wrap } = require('@vue/web-component-wrapper')
    
    // ?shadow を使って Shadow DOM での Scoped CSS を有効化するのでこう読む
    const { default: MyComponent } = require('./MyComponent.vue?shadow')
    
    window.customElements.define('my-component', wrap(Vue, MyComponent))
    

    어셈블리의 스크래치


    src/MyComponent.vue
    <template>
      <div>
        <p>
          <span>Hi, {{username}}</span>
        </p>
      </div>
    </template>
    
    <script lang="ts">
    import Vue from 'vue'
    export default Vue.extend({
      props: {
        username: String
      }
    })
    </script>
    
    <style scoped>
    p span {
      padding-bottom: 8px;
      border-bottom: solid 2px #77CB5B;
    }
    </style>
    

    구축


    terminal
    $ yarn build
    

    완성



    실제로 해보세요 (시간 있으면)


    슬라이드만 보는 사람


    ……


    그럼 이게 뭐가 즐거워요?


    Custom Element의 기쁨(1)

  • (반)정적 내용의 삽입
  • 이번 엠베드처럼 SPA와 드문드문 결합해서 사용하는게 좋을 것 같다
  • 트위터 버튼은 웹 Components에서 생산
  • Ad 등에 최적
  • 내부 설치 공통화
  • WC라는 통용 언어가 최종적으로 나오면 기술 간 처리가 비교적 좋다
  • 근데 아직 멀었다고 생각해요
  • Custom Element의 기쁨(2)

  • 기억에서 솔직한 DOM의 세계로
  • 에도 가상 DOM이 있는데, 현재 Fw의 메모리에 DOM
  • 이 있다.
  • 격리된 공간에서public로 바뀐 DOM은 좋고 나쁨을 포함한다
  • Shadow DOM(Scoped CSS) 주변 통합
  • Shadow DOM과 통합(2018/12 현재)
  • 겨우 Fw인 제가 Scaped CSS잖아요.
  • 다른 소감

  • 솔직히 스파만 하면 Fw에서 뱉어도'이렇게?'느낌
  • 엠베드/Ad 등에서 많이 쓰는 것 같아서 좋죠
  • Draggable 같은 Vanilla & Fw wrapper의 세계는 아직 이르게 보인다
  • 그것은 포장이 편리하고 가치가 있기 때문이다
  • 조금만 접촉하면 잡담력이 있을 수 있다
  • Thanks

    좋은 웹페이지 즐겨찾기