Details Tech Note

クラスベース

すべてのコンポーネントで Component のクラスを継承しています。
決まった名前のメソッドを追加するだけで、イベントハンドラーなどよく使う機能を実装できるので、少ないコード量で速く実装できます。

import Component from '~/parentClass/Component';

export default class CMyParts extends Component {
  static componentName = 'cMyParts';

  onInit() {
    // コンポーネント初期化時に実行する処理
    // this.el にこのコンポーネントのルート要素が格納されている
    console.log(this.el);
  }

  onClick(e) {
    // コンポーネントのルート要素がクリックされたとき
  }

  onMouseenter() {
    // コンポーネントのルート要素にマウスが乗ったとき
  }

  onResize() {
    // ウィンドウがリサイズされたとき
  }

  onLeave() {
    // 非同期遷移で今のページから離脱するとき
  }

  onTick() {
    // requestAnimationFrame() (gsap.ticker)ループ内で実行される処理
    // this.playTick() を実行するとループスタート、 this.pauseTick() で停止
  }
}

パラメーター

param.js という設定用ファイルの true/false を変更するだけで、慣性スクロールを有効にしたり、非同期遷移を有効にしたりするのを簡単にできるようにしています。

param.js
const param = {
  // 圧縮
  enableMinify: true, // CSS,JSを圧縮するかどうか
  // ポリフィル
  enablePolyfill: false, // ポリフィルを使うかどうか
  // HTML
  enableWebP: true, // WebP変換を有効にするかどうか
  // CSS
  enableMinFontSize: false, // 自動で最小フォントサイズを10pxに設定するコードを出力する
  // アナリティクス
  enableAutoSendGaView: false, // 非同期遷移の場合にGAのページビューイベントを送信するかどうか
  // イベント
  enableEventTick: true, // グローバルの requestAnimationFrame イベンドなどを有効にするかどうか
  enableEventWindow: true, // グローバルの resize イベンドなどを有効にするかどうか
  enableEventScroll: false, // グローバルの scroll イベンドを有効にするかどうか
  enableEventMouse: false, // グローバルの mousemove イベンドなどを有効にするかどうか
  // アニメーション
  enableSmoothScroll: false, // スムーススクロールを有効にするかどうか
  enableEventAsynchronousTransition: false, // グローバルの非同期遷移イベンドを有効にするかどうか
  enableEventPace: false, // グローバルの Pace イベンドを有効にするかどうか
  // ライブラリ
  importLibraryThree: false, // three.js ライブラリを読み込むかどうか
  importLibraryThreePostProcessing: false, // three.js ライブラリのPost Processingを読み込むかどうか
  // ライブラリオプション
  isShowDatGui: false, // dat.GUI をブラウザ上に表示させるかどうか
  isOpenDatGui: false, // dat.GUI を開いた状態にするかどうか
};

これらはすべてソースコードの JS ファイルの中で process.env.enableSmoothScroll のような形で参照できるようにしています。

if (process.env.enableEventAsynchronousTransition) {
  require('~/events/asynchronousTransition').init(transitions);
}

このように if 文内で require を使って JS をインポートすると、パラメーターが false のときはインポートされずバンドルファイルに含まれなくなるので、Tree shaking のようにバンドルサイズを減らすことができます。