プラグインアーキテクチャとapp.use()
プラグインオブジェクト{ install(app, options) }、app.component、app.directive、app.provideへのアクセス
「プラグインアーキテクチャとapp.use()」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。
Vueプラグインとは
Vueプラグインは、アプリケーション全体で使える機能(グローバルコンポーネント、ディレクティブ、注入サービス、設定など)を追加する再利用可能なコードです。例として、Vue Router、Pinia、i18nライブラリがあります。
app.use(plugin)を使って、プラグインを一度登録します。
installの契約
プラグインは、install(app, options)メソッドを持つオブジェクトか、installとして直接使う関数のいずれかです。Vueはアプリインスタンスと、渡されたオプションを引数にして呼び出します。
const myPlugin = {
install(app, options) {
// register things on the app here
console.log('installing with', options)
}
}
export default myPluginグローバルコンポーネントの登録
installの中でapp.component(name, definition)を使うと、インポートしなくてもすべてのテンプレートで利用できるコンポーネントを登録できます。
import BaseButton from './BaseButton.vue'
import BaseIcon from './BaseIcon.vue'
const uiKit = {
install(app) {
app.component('BaseButton', BaseButton)
app.component('BaseIcon', BaseIcon)
}
}グローバルディレクティブの登録
app.directive(name, definition)を使うと、v-focusやv-tooltipのようなカスタムディレクティブをグローバルに登録できます。
const focusPlugin = {
install(app) {
app.directive('focus', {
mounted(el) {
el.focus()
}
})
}
}
// usage in any template: <input v-focus />注入可能なサービスの提供
app.provide(key, value)は、すべての子孫コンポーネントがinject(key)で読み取れる値を公開します。これは、グローバル変数を使わずにサービス(APIクライアントや設定など)を共有する現代的な方法です。
const apiPlugin = {
install(app, options) {
const client = createClient(options.baseURL)
app.provide('api', client)
}
}提供されたサービスの利用
どのコンポーネントでもinjectを使って、プラグインが提供した値を読み取れます。安全性のために型付きの注入キー(Symbol)を使うことを推奨しますが、文字列のキーも使用できます。
<script setup>
import { inject } from 'vue'
const api = inject('api')
async function load() {
const data = await api.get('/users')
}
</script>プラグインへのオプションの受け渡し
app.useの2番目の引数は、installのoptionsパラメーターに渡されます。これを使って、登録時に動作を設定できます。
import { createApp } from 'vue'
import App from './App.vue'
import apiPlugin from './plugins/api'
const app = createApp(App)
app.use(apiPlugin, { baseURL: 'https://api.example.com' })
app.mount('#app')プラグインはmountの前に実行される
すべてのapp.use呼び出しはapp.mountの前に行います。mountの時点では、すべてのグローバルコンポーネント、ディレクティブ、提供値が登録済みなので、初回の描画からそれらにアクセスできます。
const app = createApp(App)
app.use(router)
app.use(pinia)
app.use(uiKit)
// everything is registered, now render
app.mount('#app')べき等なインストール
Vueは、1つのアプリに同じプラグインを2回インストールすることを防ぎます。同一のプラグインに対する2回目のapp.useは無視されます。それでも、installは安全に実行できるよう設計し、アプリインスタンスの外部で副作用を発生させないようにしてください。
app.use(myPlugin) // installs
app.use(myPlugin) // ignored, no double registration完全な最小プラグイン
ここまでの内容をまとめると、プラグインは1つのinstallメソッドで、コンポーネントの登録、ディレクティブの登録、サービスの提供をすべて行えます。
import Banner from './Banner.vue'
export default {
install(app, options = {}) {
app.component('AppBanner', Banner)
app.directive('focus', { mounted: (el) => el.focus() })
app.provide('config', { theme: options.theme || 'light' })
}
}プラグインとコンポーザブルの違い
プラグインは、アプリ全体に対して一度だけ実行するセットアップ(グローバルコンポーネントやシングルトンサービスの提供など)に使います。コンポーザブルは、コンポーネントごとに利用する再利用可能なステートフルロジックに使います。プラグインでセットアップしたものを、後からコンポーザブルがinjectで読み取る構成もよく使われます。
クイックチェック
プラグインアーキテクチャの理解度を確認しましょう。
まとめ
プラグインアーキテクチャについて学びました。
- プラグインは
install(app, options)を公開します(または関数そのものです) app.componentとapp.directiveでグローバル要素を登録しますapp.provideで、injectから読み取れる注入可能なサービスを公開しますapp.use(plugin, options)でmountの前に登録します- インストールはべき等であり、2回目のインストールは無視されます
よくある質問
「プラグインアーキテクチャとapp.use()」レッスンは無料ですか?
はい。「プラグインアーキテクチャとapp.use()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。
「プラグインアーキテクチャとapp.use()」で何を学びますか?
プラグインオブジェクト{ install(app, options) }、app.component、app.directive、app.provideへのアクセス ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Vue Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「プラグインアーキテクチャとapp.use()」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このVue Academyレッスンでコードを書いて実行できますか?
はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- プラグインアーキテクチャとapp.use()
- プラグインでのグローバルプロパティとprovide/inject
- 通知・Toastプラグインの例
- Vueプラグインの公開と型付け