Tech Conf #0 (仮)

2019/08/27

Short LT

あるべきコミュニティの姿とは

  • 社(内)外問わず、知見を共有する
  • フロントやサーバ、インフラの垣根を超えて
  • 自社プロダクトについて考える時間を

jiyuujin

  • Vue/Nuxt/PHP/Scala/Java/Swift
  • v-kansai/kansai.ts/..
  • Web猫ブログ (webneko.dev)

お手軽にJAMStackを運用中

Web猫ブログの技術スタックは

  • Nuxt + TypeScript
  • Contentful
  • AWS Fargate

毎月大阪、京都交互で

ざっくり 仮想DOM について

ここで DOM を作ってみる

<div id="app"></div>

Vanilla.js

/**
 * 仮想DOMを完全に理解した
 */
const app = document.getElementById('app');

const p = document.createElement('p');
p.innerText = '仮想DOMを完全に理解した';

app.appendChild(p);

直接個別のDOMを操作できる👍

jQueryの何がイケナイのか

  • DOMを作るのに時間がかかる
  • 再描画に時間がかかる
  • 直DOMは複雑化の元でバグの温床になり得る

設計と速度を考えると。。ダメ🙄

脱jQueryしましょう👍

そこで、仮想DOMと言う存在😏

一言でいうと。。🤔

HTMLをツリー構造に見立てること

  • 予めHTMLを記述して自動的にレンダリング
  • オブジェクトを変更して差分を監視する

さらに細かく見てみると。。🤔

うーん。。😅

唐突過ぎました😅

ざっくり言うと

  • JSXとBabel
  • VNodeを作る単一の仮想DOM
  • 初期レンダリングを実行、DOMを作成
  • 再レンダリング
  • DOMを削除、置き換え

h (Preact) 関数と言うのがあって

  • JSXを使ってコンポーネントを書く
  • Babelによって PureJSに変換
  • h (Preact) 関数を使って VNodeに変換

仮想空間で変更を検知

  • 実DOMに差分を反映、基本的にこれの繰り返し
  • 仮想DOMとはいえ、差分が大きくなると遅くなる汗

Vueではこう使ってる話

ViewModelの存在

  • 基本は仮想DOMで差分を検知、実DOMに反映
  • Modelでロジックやステートに依存
  • Viewと双方向データバインディングを実現

Vueを始めてみよう😋

Vueを書くために

  • Webpackを一から書く
  • Vue CLIを使ってスタートアップ
  • Nuxtを使えばもっと楽チン

今回は Vue CLI を選択😌

npm i -g @vue/cli

vue create vue-cli-sample

Vue CLIとは

  • 基本的にwebpackを意識しない
  • webpack.config.jsを書かずに導入できる
  • 拡張する場合はwebpackベースに進められ汎用的

Cakephpから読み込ませるため

トランスパイルされるファイル名を設定

module.exports = {
    configureWebpack: {
        config.output.filename('[name].js')
        config.output.chunkFilename('js/[name].js')
        config.module
            .rule('frontend/src/static/')
            .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
            .use('url-loader')
            .loader('url-loader')
            .options({
                limit: 4096,
                name: 'static/[name].[ext]'
            })
        config.plugin('extract-css').use(MiniCssExtractPlugin, [
            {
                filename: '[name].css',
                chunkFilename: ''
            }
        ])
        config.splitChunks = {
            cacheGroups: {
                node_vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    chunks: 'all',
                    priority: 1
                }
            }
        }
    }
}

Babelを使ってESに対応も忘れず

先ほど登場したNuxtですが

  • Vue CLI以上に webpackを意識しなくても良い
  • Webpackベースで拡張するならVue CLI
  • SSRを考えているならNuxt

ご清聴ありがとうございました🙇‍♀️

参考資料..🙇‍♀️

Tech Conf #0 (仮)

By jiyuujin

Tech Conf #0 (仮)

記念すべき初回は 仮想DOM / Vue の始め方について簡単に喋らせていただきます

  • 1,048