Component Registration - グローバル登録とローカル登録

ロードマップ: Vue.js学習ロードマップ

What(何についてか)

Vueコンポーネントをテンプレート内で使うには、Vueにその実装を認識させる必要がある。このページでは、コンポーネント登録の方法として global registration と local registration を扱う。

Why(なぜ必要か)

コンポーネント登録は、単に表示のための儀式ではなく、依存関係の見え方や保守性、ビルド最適化に影響する。

  • global registration はアプリ全体で使えて便利
  • local registration は依存関係が明示され、保守しやすい
  • 実務では local registration を基本にした方が構造が追いやすい

How(どう動くか)

Global Registration

app.component() を使って、Vueアプリ全体で使えるコンポーネントとして登録する。

import { createApp } from 'vue'
import MyComponent from './MyComponent.vue'
 
const app = createApp({})
 
app.component('MyComponent', MyComponent)

この方式で登録したコンポーネントは、そのアプリ配下の任意のコンポーネントから利用できる。

Local Registration

利用するコンポーネントの中でだけ使えるようにスコープを限定する。

<script setup> では import するだけでテンプレートから利用できる。

<script setup lang="ts">
import ComponentA from './ComponentA.vue'
</script>
 
<template>
  <ComponentA />
</template>

<script setup> を使わない場合は components オプションに明示登録する。

import ComponentA from './ComponentA.vue'
 
export default {
  components: {
    ComponentA
  }
}

local registration したコンポーネントは、そのコンポーネント内でのみ有効であり、子孫コンポーネントには自動で伝播しない。

実務上の判断軸

flowchart TD
  A["コンポーネントを使いたい"] --> B{"利用範囲は広いか"}
  B -->|"アプリ全体で共通"| C["global registration を検討"]
  B -->|"特定コンポーネントだけ"| D["local registration を採用"]
  D --> E["依存関係が明示される"]
  D --> F["tree-shaking に有利"]
  C --> G["便利だが依存関係が見えにくい"]

実務では、まず local registration を基本とし、アプリ全体で頻出する共通UIなどに限って global registration を慎重に採用するのが自然。

Component Name Casing

コンポーネント名は PascalCase を基準に扱う。

  • JavaScript の識別子として自然
  • import 名と一致しやすい
  • IDE 補完と追跡がしやすい
  • HTML要素との区別がつきやすい

テンプレートでは PascalCase と kebab-case の両方が使える。

<MyComponent />
<my-component />

Options API → Composition API 差分

項目Options API(旧)Composition API(新)
ローカル利用宣言components: { ComponentA } に登録する<script setup> では import だけでテンプレート利用可能
依存の見え方options の中に定義が集まるimport がそのまま依存宣言になる
記述量やや定型的より短く直接的

Key Concepts

用語説明
Global Registrationアプリ全体でコンポーネントを使えるようにする登録方式
Local Registration現在のコンポーネント内だけで利用可能にする登録方式
<script setup>Composition API の簡潔なSFC記法。importしたコンポーネントをそのままテンプレートで使える
PascalCaseMyComponent のような先頭大文字の命名規則
kebab-casemy-component のようなハイフン区切りの命名規則
tree-shaking未使用コードを最終bundleから除去する最適化