🍀

ViteでVueコンポーネントテスト用のカスタム属性を削除する

2024/04/13に公開

はじめに

お久しぶりです、からころです。
突然ですが、みなさん Vite は利用してますか?
VitestJest をはじめ、Vueでコンポーネントのテストをする際に、
しばしばテスト用にカスタム属性を用意することがあります。

テスト属性がバンドルされてプロダクション環境に出てくると、
意図しない挙動を引き起こしたりするかもしれないから避けたい!
そもそもテストタグを追加するだけなのにビルド後のコードに変更が加わるのは気持ち悪い!
といった方に向けた記事になります。

設定について

  • nuxt.config.tsの場合
nuxt.config.ts
{
  ...
  // 下記を追加する
  vue: {
    compilerOptions: {
      nodeTransforms: [
        (node) => {
          if (node.type === 1 /* NodeTypes.ELEMENT */) {
            for (let i = 0; i < node.props.length; i++) {
              const p = node.props[i]
              if (p && p.type === 6 /* NodeTypes.ATTRIBUTE */ && p.name === '${任意のタグ}') {
                node.props.splice(i, 1)
                i--
              }
            }
          }
        },
      ],
    },
  },
 ...
}
  • vite.config.jsの場合
vite.config.js
{
  ...
  // 以下を追加します
  vueCompilerOptions: {
    nodeTransforms: [
      node => {
        if (node.type === 1 / * NodeTypes.ELEMENT */) {
          for(let i = 0; i < node.props.length; i++){
            const p = node.props[i]
            if (p && p.type === 6 /* NodeTypes.ATTRIBUTE */ && p.name === '${任意のタグ}') {
                node.props.splice(i, 1)
                i--
            }
          }
        }
      }
    ]
  }
  ...
}

少し解説

Vueコンパイラのトランスフォーム処理をHookでき、各種 node.type に割り振られた識別子で
それぞれ何の要素を表しているかが識別できるみたいで、 各識別子の対応は、 1 => HTML ELEMENT6 => HTML ATTRIBUTE みたいです。また、このタイミングで任意の属性データを削除すればトランスパイル後に出力されるファイルに含まれなくなるみたいですね。

参考URL: https://github.com/vitejs/vite/issues/636#issuecomment-665545551

おわりに

応用すれば、プロダクション環境時のみや、独自のHTMLタグなども削除できそうですね。
皆さんの快適なVueライフを送れることを祈っています。
何か不明な点などありましたらご質問やご指摘などよろしくお願いします!!

Vue・Nuxt 情報が集まる広場 / Plaza for Vue・Nuxt.

Discussion