プラグインディレクトリ
plugins ディレクトリにはルート Vue.js アプリケーションがインスタンス化する前に実行する Javascript プラグインが含まれています。
これは Vue プラグインを追加し、関数や定数を導入する場所です。Vue.use() を使用する必要がある時は都度 plugins/ ファイルを作成し、nuxt.config.js の plugins にそのパスを追加する必要があります。
外部パッケージ
サーバーとクライアント両方に HTTP リクエストを行うためには、アプリケーションで外部パッケージ/モジュール(著名な例は axios です)を使用することをお勧めします。
はじめに、npm か Yarn を介してインストールします。
yarn add @nuxtjs/axios
npm install @nuxtjs/axios
例えば、アプリケーション全体の API 呼び出しから発生する可能性のあるエラーに対応するよう、axios インターセプターを設定できます。この例では、API から 500 ステータスエラーが発生した時、sorry というカスタムエラーページにユーザをリダイレクトします。
export default function ({ $axios, redirect }) {
$axios.onError(error => {
if (error.response.status === 500) {
redirect('/sorry')
}
})
}
最後になりますが、モジュールと新しく作成したプラグインをプロジェクト構成に追加します。
module.exports = {
modules: ['@nuxtjs/axios'],
plugins: ['~/plugins/axios.js']
}
そのあとページコンポーネントで直接使用できます:
<template>
<h1>{{ post.title }}</h1>
</template>
<script>
export default {
async asyncData ({ $axios, params }) {
const post = await $axios.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
return { post }
}
}
</script>
モジュールのインストールなしで axios を使うための他の方法は、<script> タグで直接 axios をインポートすることです。
<script>
import axios from 'axios'
export default {
async asyncData ({ params }) {
const { data: post } = await axios.get(`https://api.nuxtjs.dev/posts/${params.id}`)
return { post }
}
}
</script>
nuxt.config.js の build > transpile オプションにパッケージを追加する必要があります。build: {
// ここでwebpack設定を拡張できます
transpile: ['npm-package-name'],
},
Vue プラグイン
v-tooltip などの Vue プラグインを使用してアプリケーションにツールチップを表示する場合、アプリを起動する前にプラグインを設定する必要があります。
はじめにインストールをする必要があります
yarn add v-tooltip
npm install v-tooltip
次にファイル plugins/vue-tooltip.js を作成します
import Vue from 'vue'
import VTooltip from 'v-tooltip'
Vue.use(VTooltip)
plugins プロパティ
次に nuxt.config.js の plugins キー内にファイルパスを追加します。plugins プロパティを使用すると、簡単に Vue.js プラグインをメインアプリケーションに追加できます。plugins プロパティで定義されているすべてのパスは、メインアプリケーションを初期化する前にインポートされます。
export default {
plugins: ['~/plugins/vue-tooltip.js']
}
ES6 プラグイン
プラグインが node_modules にあり、ES6 モジュールをエクスポートする場合、transpile ビルドオプションに追加する必要がある場合があります:
module.exports = {
build: {
transpile: ['vue-tooltip']
}
}
その他のビルドオプションについては、configuration build のドキュメントを参照してください。
クライアントまたはサーバーサイドのみ
一部のプラグインは SSR がサポートされていないため、ブラウザのみで機能する場合があります。
従来のプラグインに名前を付ける
プラグインがクライアント、もしくはサーバーサイドのみで実行されると想定される場合、.client.js または .server.js は、プラグインファイルの拡張子として適用できます。ファイルはそれぞれの(クライアントまたはサーバー)サイドのみに自動的に含まれます。
export default {
plugins: [
'~/plugins/foo.client.js', // クライアントサイドのみ
'~/plugins/bar.server.js', // サーバーサイドのみ
'~/plugins/baz.js' // クライアントサイドとサーバーサイド両方
]
}
オブジェクト構文
plugins の mode プロパティ('client' または 'server')でオブジェクト構文を使用することもできます。
export default {
plugins: [
{ src: '~/plugins/both-sides.js' },
{ src: '~/plugins/client-only.js', mode: 'client' }, // クライアントサイドのみ
{ src: '~/plugins/server-only.js', mode: 'server' } // サーバーサイドのみ
]
}
$root とコンテキストの挿入
ときどき、アプリケーション内で関数や値を利用できるようにしたい場合があります。これらの変数を Vue インスタンス(クライアントサイド)、コンテキスト(サーバーサイド)、さらには Vuex ストアに挿入できます。これらの関数の前に $ を付けるのが慣例です。
Nuxt はこれを簡単に行うための inject(key、value メソッドを提供します。関数をエクスポートするとき、2 番目のパラメーターとして Inject が指定されます。$ は、キーの先頭に自動的に追加されます。
beforeCreate フックと created フックのみがクライアント、サーバーサイド両方から呼び出されることを把握しておくことが重要です。他のすべてのフックはクライアントサイドからのみ呼び出されます。export default ({ app }, inject) => {
// Vue、コンテキスト、そしてストアに $hello(msg)を挿入します。
inject('hello', msg => console.log(`Hello ${msg}!`))
}
export default {
plugins: ['~/plugins/hello.js']
}
$hello サービスは、ページ、コンポーネント、プラグイン、ストアアクションの context と this にアクセスできるようになりました。
export default {
mounted() {
this.$hello('mounted')
// console.log 'Hello mounted!' が呼び出される
},
asyncData({ app, $hello }) {
$hello('asyncData')
// Nuxt <= 2.12 を使用する場合は 👇
app.$hello('asyncData')
}
}
export const state = () => ({
someValue: ''
})
export const actions = {
setSomeValueToWhatever({ commit }) {
this.$hello('store action')
const newValue = 'whatever'
commit('changeSomeValue', newValue)
}
}
Vue.use()、Vue.component() を使用しないでください、またグローバルに、Nuxt インジェクション専用のこの関数内に Vue を接続しないでください。サーバーサイドでメモリリークが発生します。extendPlugins プロパティ
プラグインを拡張したり、Nuxt によって作成されたプラグインの順序を変更したりすることができます。この関数は plugin オブジェクトの配列を受け入れ、プラグインオブジェクトの配列を返す必要があります。
プラグインの順序を変更する例:
export default {
extendPlugins(plugins) {
const pluginIndex = plugins.findIndex(
({ src }) => src === '~/plugins/shouldBeFirst.js'
)
const shouldBeFirstPlugin = plugins[pluginIndex]
plugins.splice(pluginIndex, 1)
plugins.unshift(shouldBeFirstPlugin)
return plugins
}
}
グローバルミックスイン
グローバルミックスインは Nuxt プラグインで簡単に追加できますが、正しく処理しないとトラブルやメモリリークが発生する可能性があります。アプリケーションにグローバルミックスインを追加するときは、常にフラグを使用して複数回登録しないようにする必要があります:
import Vue from "vue"
// 他の mixin と衝突しないように
// フラグの名前は必ずユニークなものにしてください。
if (!Vue.__my_mixin__) {
Vue.__my_mixin__ = true
Vue.mixin({ ... }) // ミックスインを設定する
}
Clément Ollivier
Daniel Roe
Alex Hirzel
Ajeet Chaulagain
René Eschke
Sébastien Chopin
Nico Devs
Muhammad
Nazaré da Piedade
Naoki Hamada
Tom
Yann Aufray
Anthony Chu
Nuzhat Minhaz
Lucas Portet
Richard Schloss
Xanzhu
bpy
Antony Konstantinidis
Hibariya
Jose Seabra
Eze
Florian LEFEBVRE
Lucas
Julien SEIXAS
Hugo
Sylvain Marroufin
Spencer Cooley
Piotr Zatorski
Vladimir Semenov
Harry Allen
kazuya kawaguchi
Unai Mengual
Hyunseung Lee
Alexandre Chopin
pooya parsa
Nick Medrano
Mosaab Emam
Iljs Путлер Капут
Heitor Ramon Ribeiro
Nero
Yoon Han
Ikko Ashimine
FamCodings
Ayouli
F. Hinkelmann
felipesuri
Christophe Carvalho Vilas-Boas
Leoš Literák
Trizotti
Marcello Bachechi
Rodolphe
Thomas Underwood
Shek Evgeniy
Lukasz Formela
Hugo Torzuoli