はじめに!

Nuxt は、モダンな web アプリケーションを作成する Vue.jsに基づいたプログレッシブフレームワークです。Vue.js 公式ライブラリ(vuevue-routervuex)および強力な開発ツール(webpack、Babel や PostCSS)に基づいています。Nuxtの目標は、優れた開発者エクスペリエンスを念頭に置き、Web 開発を強力かつ高性能にすることです。

Nuxt.jsとは?

Nuxt は、Vueの公式ガイドラインに沿って強力なアーキテクチャを提供するように設計されたフレームワークです。一部分から徐々に採用することが可能で、静的なランディングページから複雑な企業向けweb アプリケーションまで、あらゆるものの作成に使用できます。

本質的に汎用性があり、さまざまなターゲット(サーバー、サーバーレス、または静的)をサポートし、サーバーサイドのレンダリングは切り替えることができます。

強力なモジュールエコシステムにより拡張可能で、REST や GraphQLエンドポイント、お気に入りの CMS や CSS フレームワークなどさまざまなものに簡単に接続できます。PWA および AMPのサポートは、Nuxt プロジェクトからは隔離されたモジュールにすぎません。

NuxtJS は Vue.js プロジェクトのバックボーンであり、柔軟でありながら自信を持ってプロジェクトを構築するための構造を提供します。

ファイル名app.html
1 2 3 <html> <a href="https://www.yahoo.com/">Yahoo Japan!へのリンク</a> </html>
コードのブロック

主な機能

  • Vue ファイルで記述できること *.vue

  • コードを自動的に分割すること

  • サーバーサイドレンダリング

  • 非同期データをハンドリングするパワフルなルーティング

  • 静的ファイルの配信

  • ES2015+ のトランスパイレーション

  • JS と CSS のバンドル及びミニファイ化

  • <head> 要素(<title><meta> など)の管理

  • 開発モードにおけるホットリローディング

  • プリプロセッサ: Sass, Less, Stylus など

  • HTTP/2 push headers ready

  • モジュール構造で拡張できること

どのように動作するか?

Nuxt.js はリッチなウェブアプリケーションを構築するために下記のものを含んでいます :

  • Vue 2

  • Vue Router

  • Vuex(ストアオプションを利用している場合に限る)

  • Vue Server Renderer(mode: 'spa' を利用している場合を除く)

  • Vue Meta

すべて合わせてもわずか 57kB min+gzip です。(Vuex 利用時は 60kB)

バンドルやソースコードの分割やミニファイ化するために内部で webpack、vue-loader と babel-loader を使います。

図解

下の図は、サーバーサイドで処理が実行されたときや、ユーザーが <nuxt-link> を通して遷移したときに Nuxt.js によって何が呼び出されるかを表しています:

サーバーサイドレンダリング(ユニバーサル SSR)

Nuxt.js をプロジェクトの UI レンダリング全体を担うフレームワークとして使うことができます。

nuxt コマンドを実行すると開発サーバーが起動します。このサーバーはホットリローディング及び Vue Server Renderer を備えており、アプリケーションが自動的にサーバーサイドレンダリングするよう設定されています。

シングルページアプリケーション(SPA)

もし何らかの理由でサーバーサイドレンダリングを使いたくない、あるいはアプリケーションを静的にホスティングする必要があるときは nuxt --spa を使って、シンプルに SPA モードを使うことができます。generate 機能と組み合わせて使うことで、Node.js ランタイムや特別なサーバー処理を利用する必要なしに、SPA のパワフルなデプロイを実現できます。

コマンドについてより深く理解するには コマンド を参照してください。

サーバーが既にある場合は、Nuxt.js をミドルウェアとして組み込むことができます。ユニバーサルなウェブアプリケーションの開発に Nuxt.js を利用する際、制限は何ひとつありません。 Nuxt.js をプログラム的に使う ガイドを参照してください。

Authenticated Request!!!!!
1 2 3 $ curl https://api.stripe.com/v1/charges \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc : # The colon prevents curl from asking for a password.
Your api key my key
A sample test API key is included in all the examples here, so you can test any example right away. Do not submit any personally identifiable information in requests made with this key. To test requests using your account, replace the sample API key with your actual API key or sign in.

貢献ガイド

Nuxt.js への貢献はどんなものでも大歓迎です!

問題の報告

このプロジェクトに貢献する一番の方法は、問題に遭遇したときに詳細なレポートを送ることです。貢献者とメンテナーが問題を把握しやすくするために、私たちは CMTY を使用しています。 問題を再現できるリポジトリか CodeSandBox を報告に含めてください。そうすれば、多大な努力なしにバグを再現できます。バグが再現できれば修正を早く進めることができます!

Per-request account
1 2 3 4 $ curl https://api.stripe.com/v1/charges/ch_3KdWs62eZvKYlo2C0X2XQMJf \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc : -H "Stripe-Account: acct_1032D82eZvKYlo2C" : -G
http status code summary
A sample test API key is included in all the examples here, so you can test any example right away. Do not submit any personally identifiable information in requests made with this key. To test requests using your account, replace the sample API key with your actual API key or sign in.

インストール

Nuxt.js はとても簡単に始められます。シンプルなプロジェクトでは必要な依存パッケージは nuxt だけです。

Nuxt.js の基礎

ビデオで Nuxt.js をすぐに使い始める方法を学ぶ。

Nuxt.js の開発をサポートするために、VueSchool がビデオコースを作りました。

create-nuxt-app を使用する

素早くスタートできるようにするため、Nuxt.js チームは足場ツール create-nuxt-app を作成しました。

npx がインストールされていることを確認してください。(npx は NPM 5.2.0 からデフォルトでバンドルされています)

$ npx create-nuxt-app <project-name>

もしくは yarn を使ってください:

$ yarn create nuxt-app <project-name>

1. サーバーサイドのフレームワークを選択します:

2. 好きな UI フレームワークを選択します:

3. 好きなテスティングフレームワークを選択します:

  • None (後からでも追加できます)

  • Jest

  • AVA

4. Nuxt のモードを選択します。(Universal または SPA)

5. HTTP リクエストを簡単に行うために axios module を追加します。

6. 保存時にコードをチェックするために EsLint を追加します。

7. 保存時にコードを整形するために Prettier を追加します。

8. 回答が終わり次第、全ての依存関係がインストールされ、プロジェクトを開始する次のステップへ進めます:

$ npm run dev

するとアプリケーションは http://localhost:3000 で動いています。

Nuxt.js は pages ディレクトリ内のファイルの更新を監視します。そのため、新しいページを追加したときにアプリケーションを再起動する必要はありません。

プロジェクトのディレクトリ構造についてより深く理解するには ディレクトリ構造のドキュメント を参照してください。

スクラッチから始める

Nuxt.js プロジェクトをスクラッチから作ることも簡単で、必要なのは 1 つのファイルと 1 つのディレクトリ だけです。まずは空のディレクトリを作りましょう:

1 2 $ mkdir <project-name> $ cd <project-name>

情報: <project-name> の箇所はプロジェクト名に置き換えてください。

package.json

それぞれのプロジェクトには、 nuxt を起動するために package.json ファイルが必要です。下記の json を package.json にコピーをして、 npm install を実行する前に保存してください:

上のように書いておけば npm run dev で Nuxt.js を起動できます。

nuxt のインストール

package.json を作成したら nuxtnpm でプロジェクトに追加しましょう:

1 $ npm install --save nuxt

pages ディレクトリ

Nuxt.js は pages ディレクトリ内の *.vue ファイルについて、各ファイルがアプリケーションのひとつのルートに対応するものとして変換します。

pages ディレクトリを作ります:

1 $ mkdir pages

それから最初のページを pages/index.vue に作ります:

index.vue
1 2 3 <template> <h1>Hello world!</h1> </template>

そして、プロジェクトを起動します:

1 $ npm run dev

すると、アプリケーションは http://localhost:3000 で動いています。

Nuxt.js は pages ディレクトリ内のファイルの更新を監視します。そのため新しいページを追加した場合にアプリケーションを再起動する必要はありません。

プロジェクトのディレクトリ構造についてより深く理解するには ディレクトリ構造のドキュメント を参照してください。

package.json
1 2 3 4 5 6 { "name": "my-app", "scripts": { "dev": "nuxt" } }

ルーティング

Nuxt.js は pages ディレクトリ内の Vue ファイルの木構造に沿って、自動的に vue-router の設定を生成します。

ページ間を遷移するためには <nuxt-link> コンポーネントの使用を推奨します。

1 2 3 <template> <nuxt-link to="/">Home page</nuxt-link> </template>

ルーティングの基礎

下記のようなファイルの木構造のとき:

pages/
--| user/
-----| index.vue
-----| one.vue
--| index.vue

自動的に以下が生成されます:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 router: { routes: [ { name: 'index', path: '/', component: 'pages/index.vue' }, { name: 'user', path: '/user', component: 'pages/user/index.vue' }, { name: 'user-one', path: '/user/one', component: 'pages/user/one.vue' } ] }

ルーティングのパラメータのバリデーション

Nuxt.js では、動的なルーティングをするコンポーネント内に、パラメータをバリデーションするメソッドを定義することができます。

例えば pages/users/_id.vue 内にこのように書きます:

_id.vue
1 2 3 4 5 6 export default { validate({ params }) { // 数値でなければならない return /^\d+$/.test(params.id) } }
pages/users/_id.vue
1 2 3 4 5 6 export default { validate({ params }) { // 数値でなければならない return /^\d+$/.test(params.id) } }

ビュー

Views セクションでは、Nuxt.js アプリケーション(アプリテンプレート、レイアウト、ページ、および HTML ヘッド)内の特定のルートのデータとビューを設定するために必要なことを全て説明しています。

1 2 3 4 5 6 <template> <div> <div>ブログのナビゲーションバーをここに設置します</div> <nuxt /> </div> </template>
コンセプト
コンセプト

nuxt-views-schema

アプリテンプレート

スクリプトまたは条件付きの CSS クラスを含めるために Nuxt.js で使われる HTML アプリテンプレートをカスタマイズできます。

テンプレートを変更するために、プロジェクトのソースフォルダ(デフォルトはプロジェクトのルートディレクトリ)に app.html ファイルを作成します。

レイアウト

サイドバーを含めたり、モバイルとデスクトップに異なるレイアウトを使用したりするなど Nuxt.js アプリの外観を変更したい場合にレイアウトは非常に役立ちます。

デフォルトレイアウト

layouts/default.vue ファイルを追加することでメインレイアウトを拡張できます。メインレイアウトは、レイアウト指定がされていないすべてのページに使用されます。

情報: 実際にページコンポーネントが含まれるようにレイアウトを作成するときは、必ず <nuxt/> コンポーネントを入れておくことを覚えておいてください。

次にあるデフォルトのレイアウトはたった 3 行で、単純にページコンポーネントをレンダリングします:

<template> <nuxt> </nuxt> </template>

カスタムレイアウト

layouts ディレクトリのすべてのファイル(第一階層)は、ページコンポーネントの layout プロパティでアクセス可能なカスタムレイアウトを作成します。

ブログのレイアウトを作成して、それを layouts/blog.vue に書くときの例:

<template>

<div>

<div>ブログのナビゲーションバーをここに設置します</div>

<nuxt />

</div>

</template>

それからページ (例えば pages/posts.vue ) で、カスタムレイアウトを使うことを伝えます:

<template>

<!-- テンプレート -->

</template>

<script>

export default {

layout: 'blog'

// ページコンポーネントの定義

}

</script>

layout プロパティについての詳細: layout プロパティ

デモ動画で、カスタムレイアウトの動作する様子を確認して見てください。

Nuxt.js によって使われるデフォルトのテンプレート
1 2 3 4 5 6 7 8 9 10 <!DOCTYPE html> <html {{ HTML_ATTRS }}> <head {{ HEAD_ATTRS }}> {{ HEAD }} </head> <body {{ BODY_ATTRS }}> {{ APP }} </body> </html>
カスタムアプリテンプレートを使用して、IE 用に条件付きの CSS クラスを追加するユースケース:
1 2 3 4 5 6 7 8 9 10 <!DOCTYPE html> <!--[if IE 9]><html lang="en-US" class="lt-ie9 ie9" {{ HTML_ATTRS }}><![endif]--> <!--[if (gt IE 9)|!(IE)]><!--><html {{ HTML_ATTRS }}><!--<![endif]--> <head {{ HEAD_ATTRS }}> {{ HEAD }} </head> <body {{ BODY_ATTRS }}> {{ APP }} </body> </html>

非同期なデータ

サーバーサイドでデータを取得し、それをレンダリングしたいことがあるでしょう。 Nuxt.js はコンポーネントを初期化する前に非同期の処理を行えるようにするために asyncData メソッドを追加しています。

asyncData メソッド

場合によっては、ストアを使用せずにデータをフェッチし、サーバー上でプレレンダリングしたい場合があります。 asyncData は ページ コンポーネントがローディングされる前に常に呼び出されます。サーバーサイドでは 1 回だけ(Nuxt アプリへの最初のリクエスト)呼び出され、クライアントサイドではページ遷移をするたびに呼び出されます。このメソッドは、第一引数としてコンテキストを受け取ります。これを使用してデータを取得し、 Nuxt.js はコンポーネントデータとマージすることができます。

Nuxt.js は返されたオブジェクトとコンポーネントデータを自動的にマージします。

asyncData メソッド内の this を通してコンポーネントのインスタンスにアクセスすることは できません。それはコンポーネントが インスタンス化される前に このメソッドが呼び出されるからです。

Nuxt.js では asyncData メソッドを使うために、いくつかの異なるやり方があるので、お好きなものを選んでください:

  1. Promise を返す。 Nuxt.js はコンポーネントがレンダリングされる前に Promise が解決されるまで待ちます

  2. async/await を使う

私たちは isomorphic な HTTP リクエストを作るために axios を使っています。私たちはあなたの Nuxt プロジェクトに、私たちの axios module を使うことを強くオススメします。

node_modules 内の axios を直接使用しており、axios.interceptors を使用してデータを処理する場合、interceptors を追加する前にインスタンスを作成してください。そうしなければ、サーバレンダリングされたページをリフレッシュする際に、interceptor が複数追加され、データエラーが発生します。

Promise を返す

export default {

asyncData({ params }) {

return axios.get(`https://my-api/posts/${params.id}`).then(res => {

return { title: res.data.title }

})

}

}

async/await を使う

export default {

async asyncData({ params }) {

const { data } = await axios.get(`https://my-api/posts/${params.id}`)

return { title: data.title }

}

}

データを表示する

asyncData の結果はコンポーネントのデータと マージされ ます。下記のように template の内側でデータを表示することができます:

<template>

<h1>{{ title }}</h1>

</template>

コンテキスト

context 内で利用できるキーの一覧を確認するには API 基本 Context を参照してください。

req/res オブジェクトの利用

サーバーサイドで asyncData が呼ばれた場合、ユーザーリクエストの reqres オブジェクトにアクセスできます。

export default {

async asyncData({ req, res }) {

// req と res を使う前にサーバーサイドか

// どうかチェックしてください

if (process.server) {

return { host: req.headers.host }

}

return {}

}

}

動的なルートデータへのアクセス

context パラメータを利用して動的ルートデータにアクセスすることもできます。たとえば、動的ルートパラメータには、それを設定したファイルまたはフォルダの名前を使用してアクセスできます。 pages フォルダに _slug.vue という名前のファイルを定義した場合、 context.params.slug を介して値にアクセスできます。

export default {

async asyncData({ params }) {

const slug = params.slug // /abc というパスを呼び出した時、 slug は "abc" になる

return { slug }

}

}

クエリの変化のリスニング

デフォルトでは、クエリストリングの変化で asyncData メソッドは呼ばれません。ページネーションコンポーネントのビルド時などにこの振る舞いを変更したい場合は、ページコンポーネントの watchQuery プロパティを見るパラメータを設定することができます。より詳しい情報は API watchQuery プロパティ を参照してください。

エラー処理

Nuxt.js は、 contexterror(params) メソッドを追加し、エラーページを表示するためにそれを呼び出すことができます。 params.statusCode は、サーバーサイドから適切なステータスコードを表示するためにも使用されます。

エラーページをカスタマイズするには ビューのレイアウトセクション を参照してください。

axios
1 2 3 4 5 6 7 8 9 10 11 12 import axios from 'axios' const myaxios = axios.create({ // ... }) myaxios.interceptors.response.use( function (response) { return response.data }, function (error) { // ... } )
エラー処理:Promiseによる例
1 2 3 4 5 6 7 8 9 10 11 12 13 export default { asyncData({ params, error }) { return axios .get(`https://my-api/posts/${params.id}`) .then(res => { return { title: res.data.title } }) .catch(e => { error({ statusCode: 404, message: 'ページが見つかりません' }) }) } }

アセット

デフォルトでは、Nuxt は vue-loaderfile-loaderurl-loader webpack ローダーを使用して、強力なアセットを提供します。 静的アセットには static ディレクトリを使用することもできます。

  1. image.png

  2. package.json

  3. nuxt.js

Webpack

vue-loadercss-loader vue-template-compiler を用いて、スタイルやテンプレートファイルを自動的に処理します。このコンパイル処理の中で、 や background: url(...) や CSS @import などのすべてのアセット URL はモジュールの依存関係として解決されます。

例えば、次のようなファイル構成があるとします:

-| assets/

----| image.png

-| pages/

----| index.vue

CSS で url('~assets/image.png') と書いた場合、それは require('~/assets/image.png') に変換されます。

createElement('img', { attrs: { src: require('~/assets/image.png') } }).png は JavaScript ファイルではないため、Nuxt.js は file-loaderurl-loader を使ってそれらを処理できるよう webpack を設定します。

これらのローダーを利用する利点:

  • file-loader は、アセットファイルをコピー・配置する場所と、キャッシュ改善のためにバージョンハッシュを用いてファイル名を指定することができます。本番環境では、デフォルトで長期キャッシングの恩恵を受けるでしょう。

  • url-loader は、指定した閾値よりも小さい場合に、Base64 データ URL として条件付きでファイルに埋め込むことができます。これにより、小さなファイル取得のための HTTP リクエスト数を減らすことができます。もし閾値よりも大きい場合は、file-loader に自動的にフォールバックします。

これら 2 つのローダーのデフォルトの設定右の通りです。:

つまり、1 KB 未満のすべてのファイルは Base64 データ URL としてインライン化されます。それ以外の場合、画像/フォントは、対応するフォルダ(.nuxt ディレクトリの下)にコピーされ、より良いキャッシュのためにバージョンハッシュを含む名前が付けられます。

アプリケーションを nuxt コマンドで起動するとき、pages/index.vue 内のテンプレートは下記のようになっておりそこから次のように生成されます

Static

assets ディレクトリで webpack したくないアセットがある場合は、プロジェクトのルートディレクトリに static ディレクトリ(プロジェクトのルートフォルダに)を作成して利用することができます。

これらのファイルは Nuxt によって自動的に提供され、プロジェクトのルート URL からアクセスできます。(static/favicon.icolocalhost:3000/favicon.ico で利用することができます)

このオプションは robots.txtsitemap.xmlCNAME(GitHub Pages などで使う)などのファイルの扱いに役立ちます。

あなたのコードでは、それらのファイルを / を基準に参照することができます。

ローダーのデフォルト設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // https://github.com/nuxt/nuxt.js/blob/dev/packages/webpack/src/config/base.js#L297-L316 ;[ { test: /.(png|jpe?g|gif|svg|webp)$/, loader: 'url-loader', query: { limit: 1000, // 1kB name: 'img/[name].[hash:7].[ext]' } }, { test: /.(woff2?|eot|ttf|otf)(?.*)?$/, loader: 'url-loader', query: { limit: 1000, // 1kB name: 'fonts/[name].[hash:7].[ext]' } } ]

プラグイン

Nuxt.js では JavaScript プラグインを定義することができ、それはルートの Vue.js アプリケーションがインスタンス化される前に実行されます。この機能は、自前のライブラリや外部のモジュールを使用する際にとりわけ有用です。

Vue インスタンスの ライフサイクル において、beforeCreatecreated フックのみが クライアントサイドとサーバーサイドの両方で呼び出されることに注意してください。それ以外のすべてのフックはクライアントサイドでのみ呼び出されます。

外部パッケージ

アプリケーションにおいて、サーバーとクライアントの双方で HTTP リクエストを送るために、外部パッケージ/モジュールを使いたいときがあるでしょう(axios が素晴らしい例です)。 まず最初に、npm でパッケージをインストールします:

npm install --save axiosそうすると次のようにページコンポーネント内で直接それを使うことができます:

Vue プラグイン

アプリケーション内で通知を表示する vue-notifications のような Vue プラグインを使用したい場合には、アプリケーションを起動する前にプラグインをセットアップする必要があります。 plugins/vue-notifications.js ファイルを作成します:

それから nuxt.config.js の plugins キー内にファイルパスを追加します:

plugins 設定キーについてより深く理解するには plugins api を参照してください。

ES6 プラグイン

プラグインが node_modules にあり、ES6 モジュールをエクスポートしている場合、それを transpile ビルドオプションに追加する必要があるかもしれません:

その他のビルドオプションについては configuration build のドキュメントを参照することができます。

アプリケーションのルートや context に注入する

関数や値をアプリケーション全体で利用できるようにしたい場合もあるでしょう。そのような変数を Vue インスタンス(クライアントサイド)やコンテキスト(サーバーサイド)、さらに Vuex ストアへ注入することが可能です。それらの関数の前には $ を付けるのが一般的です。

Vue インスタンスに注入する

Vue インスタンスへのコンテキストの注入は、通常の Vue アプリケーションと同様に動作します。

plugins/vue-inject.js
1 2 3 import Vue from 'vue' Vue.prototype.$myInjectedFunction = string => console.log('This is an example', string)
nuxt.config.js
1 2 3 export default { plugins: ['~/plugins/vue-inject.js'] }

これで全ての Vue コンポーネントで関数を使用することができます。

example-component.vue:

export default {

mounted() {

this.$myInjectedFunction('test')

}

}

コンテキストに注入する

Vue インスタンスへのコンテキストの注入は、通常の Vue アプリケーションと同様に動作します。

クライアントサイド限定のプラグイン利用

いくつかのプラグインは、SSR をサポートしていないためにブラウザでのみ動作するかもしれません。そのような場合は、クライアントサイドのみでプラグインを使用するために、plugins 内の mode: client オプションを使用することができます。

サーバーサイドでのみライブラリを読み込む必要がある場合は、process.server変数に true がセットされているかでチェックできます。

また、もしあなたが生成されたアプリケーション(nuxt generate コマンドによって)の中にいるかどうか知る必要がある場合は、process.static 変数に true がセットされているかでチェックできます。これは、アプリケーションの生成中および生成後の場合のみです。

保存前に nuxt generate コマンドによって、ページがサーバレンダリングされている時の状態を知るには、2 つのオプションを組み合わせて使うことができます (process.static && process.server) 。

情報: Nuxt.js 2.4 以降、プラグインタイプを指定するための plugins のオプションとして mode が導入されました。指定可能な値は client または server です。 ssr:false は mode: 'client' に適応され、次のメジャーリリースでは非推奨になります。 例: nuxt.config.js: export default { plugins: [ { src: '~/plugins/both-sides.js' }, { src: '~/plugins/client-only.js', mode: 'client' }, { src: '~/plugins/server-only.js', mode: 'server' } ] }

プラグイン名の規約

プラグインがクライアント側またはサーバー側でのみ実行されると想定される場合、 .client.js または .server.js をプラグインファイルの拡張として適用することができ、ファイルは自動的に対応する側に含まれます。

plugins/vue-notifications.js
1 2 3 4 5 import Vue from 'vue' import VueNotifications from 'vue-notifications' Vue.use(VueNotifications)
nuxt.config.js の plugins キー内にファイルパスを追加
1 2 3 export default { plugins: ['~/plugins/vue-notifications'] }
transpileビルドオプションへの
1 2 3 4 5 module.exports = { build: { transpile: ['vue-notifications'] } }
nuxt.config.js
1 2 3 export default { plugins: [{ src: '~/plugins/vue-notifications', mode: 'client' }] }
plugins/vue-notifications.js
1 2 3 4 import Vue from 'vue' import VueNotifications from 'vue-notifications' Vue.use(VueNotifications)

モジュール

モジュールは、Nuxt.js のコア機能を拡張し、無限のインテグレーションを加える Nuxt.js の拡張機能です。

はじめに

Nuxt を使ってプロダクションレベルのアプリケーションを開発していると、Nuxt のコア機能が十分ではないことにすぐに気が付くでしょう。Nuxt はオプション設定やプラグインにより拡張できますが、複数のプロジェクトにわたってそれらのカスタマイズをメンテナンスしていくことは、退屈で、繰り返される、時間を浪費する作業です。しかし一方であらゆるプロジェクトのニーズを盛り込んでしまうと、Nuxt がとても複雑になり使いづらいものになってしまうでしょう。

これが Nuxt が、コア機能を簡単に拡張できるようにするために、より高度なモジュールシステムを導入する理由のひとつです。モジュールは、Nuxt 起動時に順番に呼び出される、シンプルな関数です。フレームワークは Nuxt が処理を続けるよりも前に、各モジュールが処理を完了するまで待機します。このようにして、モジュールは Nuxt のほとんどすべての項目をカスタマイズできます。Webpack の Tapable に基づいた Nuxt のモジュール設計のおかげで、モジュールは例えばビルドの初期化のような特定のエントリーポイントに、フックを簡単に登録できるのです。また、モジュールはテンプレートの上書き、webpack のローダーの設定、CSS ライブラリの追加、その他多くの便利なタスクを実行することができます。

素晴らしいことに Nuxt モジュールは npm パッケージと統合できます。したがって複数のプロジェクト間で再利用したり、Nuxt コミュニティでシェアすることが容易にできます。そして高品質の Nuxt アドオンのエコシステムをつくっていくことに繋がるでしょう。

もしあなたが下記に該当するならば、モジュールはきっと役に立ってくれるでしょう:

  • 新しいプロジェクトを素早く立ち上げる必要があるアジャイル・チームのメンバーである。

  • Google Analytics を統合するようなお決まりのタスクのための車輪の再発明にうんざりしている。

  • 愛すべきオープンソース熱狂者であり、あなたの成果をコミュニティと簡単にシェアしたいと思っている。

  • 品質と再利用性が重視されるエンタープライズ企業に所属している。

  • いつもタイトな締切に追われており、いろいろな新しいライブラリや統合の詳細を深く調べる時間がない。

  • 低レベルのインターフェースの破壊的な変更への対応にうんざりしていて、とにかく動くものを必要としている。

Nuxt.js 公式モジュール一覧

Nuxt.js チームが提供している 公式 モジュール:

  • @nuxt/http: ky-universal をベースにしており、軽量でユニバーサルな HTTP リクエストを送ります

  • @nuxt/content: content ディレクトリへの書き込みや、MongoDB のような API を通した Markdown や JSON、YAML、CSV ファイルの取得をします

  • @nuxtjs/axios: セキュアかつ簡単に Axios と Nuxt.js とを統合し、HTTP リクエストを送ります

  • @nuxtjs/pwa: 十分にテストされアップデートされた安定した PWA ソリューションを Nuxt に提供します

  • @nuxtjs/auth: Nuxt.js のための認証モジュールです。さまざまなスキームやストラテジーを提供します

コミュニティによって作成されたモジュール一覧は https://awesomejs.dev/for/nuxt/ と https://github.com/topics/nuxt-module で確認できます。

基本的なモジュールを書く

既に言及されているように、モジュールはただの関数です。npm モジュールとしてパッケージングしたり、あるいはプロジェクトのソースコードに直接インクルードすることができます。

moduleOptions

これは modules の配列を利用するために、モジュールの利用者から渡されるオブジェクトです。これを使うことで modules のふるまいをカスタマイズすることができます。

this.options

この参照を利用して Nuxt options へ直接アクセスすることができます。これはすべてのデフォルトのオプションがアサインされた、ユーザーの nuxt.config.js の内容です。モジュール間で共有されるオプションとして利用できます。

this.nuxt

現在の Nuxt インスタンスへの参照です。利用可能なメソッドは Nuxt クラスのドキュメント を参照してください。

this

モジュールのコンテキストです。利用可能なメソッドは モジュールコンテナ クラスのドキュメントを参照してください。

module.exports.meta

この行は npm パッケージとして公開するときは必須です。Nuxt はあなたのパッケージをより良く機能させるために、内部でメタ情報を利用します。

それから Nuxt にプロジェクトでいくつかの特定のモジュールをロードするよう伝えます。その際に任意のパラメーターを options として渡すようにします。詳しくは モジュール設定 を参照してください。

非同期モジュール

すべてのモジュールが同期的に処理を行うわけではありません。例えばどこかの API からフェッチしたり IO を非同期的に扱うモジュールを開発したい場合もあるでしょう。このような場合のために Nuxt は Promise を返したりコールバックを呼び出す非同期モジュールをサポートしています。

ビルド専用モジュール

通常、モジュールは開発時とビルド時のみ必要です。buildModules を使用すると、本番環境の起動を高速化し、本番環境のデプロイで node_modules のサイズを大幅に削減することができます。あなたがモジュールの作成者である場合、あなたのパッケージを devDependency としてインストールし、nuxt.config.jsmodules ではなく buildModules を使用するよう、ユーザーに提案することをお勧めします。

次の場合を除き、モジュールは buildModule です:

  • serverMiddleware を提供している

  • Node.js ランタイムフックを登録する必要がある(sentry のように)

  • vue-renderer の動作に影響を与えているか、server: または vue-renderer: ネームスペースのフックを使用している

webpack スコープ外にあるその他のもの(ヒント:プラグインとテンプレートはコンパイルされ、webpack スコープ内にあります)

注意: buildModules を使用する場合、この機能は Nuxt v2.9 以降でのみ使用することが可能です。 古いユーザーは Nuxt をアップグレードするか、modules セクションを使用する必要があります。

async/await を利用する

import fse from 'fs-extra'

export default async function asyncModule() {

// async/await を使って非同期処理ができる

const pages = await fse.readJson('./pages.json')

}

Promise を返す

import axios from 'axios'

export default function asyncModule() {

return axios

.get('https://jsonplaceholder.typicode.com/users')

.then(res => res.data.map(user => '/users/' + user.username))

.then(routes => {

// Nuxt のルートを拡張して何かの処理を行う

})

}

modules/simple.js
1 2 3 4 5 6 export default function SimpleModule(moduleOptions) { // ここにあなたのコードを書く } // モジュールを npm パッケージとして公開するのであれば必須 // module.exports.meta = require('./package.json')
nuxt.config.js
1 2 3 4 5 6 7 8 9 export default { modules: [ // シンプルな使い方 '\~/modules/simple'[ // 直接オプションを渡す ('\~/modules/simple', { token: '123' }) ] ] }

コマンド

Nuxt.js は便利コマンドのセットを備えています。開発時に役立つものも、プロダクション用途のものもあります。

コマンド一覧

引数

各コマンドに対して --help を使うと詳細な使用方法を入手できます。共通の引数は下記の通りです:

AWS IoTのコネクションを作成

ここでは、AWS IoTのコネクションを作成する方法を説明します。

AWS でコネクションの設定情報を準備する

コネクションを作成するためには、以下の設定情報が必要です。

  • IAM Role ARN

  • AWS Access Key ID

  • AWS Secret Access Key

  • AWS IoT Endpoint

これらを準備する手順を説明します。

IAM Role ARN を作成する

はじめに、IAM Role ARNを作成します。

  1. AWSマネジメントコンソールにサインインし、画面上部の「サービス」-「IAM」-「ロール」-「ロールの作成」の順にクリックします。

  2. 「このロールを使用するサービスを選択」で「IoT」を選択し、「ユースケースの選択」で「IoT」を選択して、「次のステップ:アクセス権限」ボタンをクリックします。

  3. アクセス権限ポリシーは変更せずに、「次のステップ:タグ」ボタンをクリックします。

  4. タグの追加変更せずに、「次のステップ:確認」ボタンをクリックします。

  5. 「ロール名」に、任意のロール名を入力します「ロールの説明」は必要に応じて入力してください。 ロール名の一覧から、作成したロール名をクリックし、以下のポリシーがアタッチされていることを確認します。

    • AWSIoTThingsRegistration

    • AWSIoTLogging

    • AWSIoTRuleActions

  6. ポリシーの右側にある「×」ボタンをクリックし、すべてのポリシーをデタッチします。 8.

  7. 「ポリシーをアタッチします」ボタンをクリックし、「AmazonSNSFullAccess」ポリシーと「AWSIoTDataAccess」ポリシーをアタッチします。 IAM Roleが作成されます。

  8. 表示される画面で、「ロールARN」をコピーします。 この「ロールARN」をコネクションの作成に使用します(コネクション情報01)。後で参照できるよう、メモなどに記録してください。

AWS のユーザーを作成する(AWS Access Key ID、AW Secret Access Key の取得)

次に、AWSのユーザーを作成し、AWS Access Key IDとAWS Secret Access Keyを取得します。

ここで作成するAWSのユーザーに付与する権限は、agentのインストールに必要な権限とは異なりますので注意してください。

AWS IoTのコネクション作成用agentのインストール用に、別のAWSユーザーを作成して利用することを推奨します(ユーザーが持つ権限を最小限にしておく方が安全であるため)。

PassRole ポリシーを作成する ユーザーを作成する前に、PassRoleポリシーを作成します。 PassRoleポリシーは、AWSユーザーに設定するポリシーです。ここでは、以下の目的のために作成します。

  • IAM Role ARNに、必要なポリシーが登録されていることを確認するため

  • AWS IoTのサービスに、IAM Role ARNで指定したRoleを渡すため

  1. AWSマネジメントコンソールにサインインし、画面上部の「サービス」-「IAM」-「ポリシー」-「ポリシーの作成」の順にクリックします。

  2. 「サービスの選択」をクリックし、「IAM」と入力して、表示される候補から「IAM」をクリックします。

  3. 「アクション」をクリックし、フィルタアクションの入力欄に「PassRole」と入力して、表示される候補にチェックを付けます。

  4. 同様にして、「GetRole」と入力し、表示される候補にチェックを付けます。

  5. 同様にして、「ListAttachedRolePolicies」と入力し、表示される候補にチェックを付けます。

  6. 「ARNの追加」をクリックします。

  7. 表示される画面に、以下を入力します。bv

  8. 「追加」ボタンをクリックします。

  9. 「ポリシーの確認」\\\\\\\\\\*\\\\\\\\\\*ボタンをクリックします。\\\\\\\\\\*\\\\\\\\\\*

  10. 「名前」に、任意のポリシー名を入力します。ここでは、「PassRole」と入力します。 「説明」は必要に応じて入力してください。

  11. 「ポリシーの作成」ボタンをクリックします。 PassRoleポリシーが作成されます。

ユーザーを追加する

PassRoleポリシーの作成後に、ユーザーを作成します。

  1. AWSマネジメントコンソールにサインインし、画面上部の「サービス」-「IAM」-「ユーザー」-「ユーザーを追加」の順にクリックします。

  2. 「ユーザー名」に、任意のユーザー名を入力します。ここでは、「-conn-user」と入力します。