最終更新日:190904 原本2019-06-11

「Vue.js」でWebページを作成できるフレームワーク「Nuxt.js」最初の一歩

JavaScriptフレームワーク「Vue.js」と「Nuxt.js」の活用 第1回

 本連載では、Webページのユーザーインタフェイス(UI)フレームワーク「Vue.js」と、Vue.jsを利用してWebページを作成できるフレームワーク「Nuxt.js」の活用方法を、サンプルとともに紹介します。初回となる今回は、Vue.jsとNuxt.jsの概要を説明するとともに、プロジェクトの生成や実行、基本的な実装例を通して、Vue.jsやNuxt.jsの機能をいくつか紹介していきます。

はじめに

 Vue.jsは、Webページのユーザーインタフェイス(UI)作成にフォーカスしたJavaScriptフレームワークです。AngularReactと比較されることが多いフレームワークですが、導入や習熟のしやすさ、日本語ドキュメントの充実などが特徴として挙げられます。

図1:Vue.jsの公式ページ(https://jp.vuejs.org/)
図1:Vue.jsの公式ページ

 Vue.jsの機能はUIに特化しており、Webページ構築に有用なUI以外の機能(Ajaxやサーバーサイドレンダリングなど)は提供しません。そこで、Nuxt.jsは、Vue.jsのUI機能と、Vue.jsが提供しないUI以外の機能をまとめて利用できる環境を提供します。開発者はNuxt.jsを利用すれば、UIをVue.jsで構築しつつ、Nuxt.jsが提供するUI以外の機能も同時に利用できます。

図2:Nuxt.jsの公式ページ(https://ja.nuxtjs.org/)
図2:Nuxt.jsの公式ページ

 Nuxt.jsが提供する主な機能を表1にまとめます。

表1:Nuxt.jsが提供する主な機能
機能 説明 
プロジェクト生成 Vue.jsやNuxt.jsが設定済みのプロジェクトをコマンドで生成
サーバーサイドレンダリング サーバーサイドでWebページの内容を生成
静的ファイルの生成  Webサーバーにそのまま配置できるファイルを生成
ルーティング URLのパスでページを切り替え
Vuexストア Vuex(ページの状態を管理する仕組み)の利用をサポート

 本記事では、Vue.jsとNuxt.jsを使い始める最初の一歩として、プロジェクトを生成・実行する方法と、Webページの基本的な実装方法を説明します。また、Nuxt.jsの便利な機能として、サーバーサイドレンダリングや静的ファイルの生成を紹介します。

対象読者

  • Webページ作成を楽にしてくれるフレームワークを探している方
  • Vue.jsの環境をまとめて作成したい方
  • AngularやReactを経験して、他のフレームワークも試したい方

必要な環境

 Nuxt.jsのプロジェクト生成や実行には、Node.jsが必要になります。

 今回は以下の環境で動作を確認しています。Webブラウザーは、JavaScriptの有効/無効を設定で切り替えることができるGoogle Chromeを利用します。 

  • Windows 10 64bit版 
    • Node.js v10.15.3 64bit版
    • Nuxt.js 2.7.1
    • Vue.js 2.6.10
    • Google Chrome 74.0.3729.157

 サンプルコードを実行するには、サンプルのフォルダーで「npm install」コマンドを実行してライブラリーをダウンロード後、「npm run dev」コマンドを実行して、Webブラウザーで「http://localhost:3000/」を開きます(詳細は後述します)。

Nuxt.jsプロジェクトを生成して実行する手順

 最初に、Nuxt.jsが提供するCLIツール(create-nuxt-app)を利用して、プロジェクトを生成して実行する手順を説明します。プロジェクトを実行すると、図3の通りWebページが表示されます。

図3:create-nuxt-appで生成したNuxt.jsのプロジェクト(p001-cli)
図3:create-nuxt-appで生成したNuxt.jsのプロジェクト(p001-cli)

 プロジェクトを生成するには、Node.jsがインストールされている環境で、リスト1のコマンドを実行します。npxはNode.jsのコマンドで、create-nuxt-appを(別途インストールせずに)実行できます。

[リスト1]Nuxt.jsのプロジェクトを生成するコマンド
npx create-nuxt-app p001-cli

 コマンドラインでは、プロジェクトに関する表2の項目を設定できます。今回はすべての項目で改行キーを押下して、デフォルト値をそのまま受け入れます。

表2:Nuxt.jsプロジェクト生成時に設定できる項目
No. 設定項目  意味    デフォルト値
1 Project name プロジェクト名 リスト1のコマンドで指定したプロジェクト名
2 Project description プロジェクトの説明  実行のたびに変わる
3 Use a custom server framework Webサーバーフレームワーク none
4 Choose features to install  インストールする追加機能  未選択
5 Use a custom UI framework UIフレームワーク none
6 Use a custom test framework テストフレームワーク  none
7 Choose rendering mode レンダリングモード  Universal
8 Author name 作者名 Gitに登録された名前、なければ空文字
9 Choose a package manager パッケージマネージャー npm

 すべての項目を設定するとプロジェクトが生成されるので、リスト2(1)のコマンドでプロジェクトのフォルダーに移動して、(2)のコマンドで実行します。実行後、Webブラウザーで「http://localhost:3000/」を開くと、図3の通り表示されます。

[リスト2]Nuxt.jsのプロジェクトを実行するコマンド
cd p001-cli # …(1)
npm run dev # …(2)

[補足]Nuxt.jsプロジェクト生成時に設定できる項目(表2のNo.3~7)の詳細

 表2のNo.3(Webサーバーフレームワーク)は、表3から1つ選択できます。

表3:Webサーバーフレームワークの選択肢
選択肢  詳細(参照URL)
none -
express https://github.com/expressjs/express
koa https://github.com/koajs/koa
adonis https://github.com/adonisjs/adonis-framework
hapi  https://github.com/hapijs/hapi
feathers https://github.com/feathersjs/feathers
micro https://github.com/zeit/micro
fastify https://github.com/fastify/fastify

 表2のNo.4(インストールする追加機能)は、表4から複数選択できます。

表4:インストールする追加機能の選択肢
選択肢  詳細 
Progressive Web App (PWA) Support PWA機能
Linter / Formatter ESLintによるコードチェック/整形機能
Prettier Prettierによるコード整形機能
Axios AxiosによるHTTPクライアント機能

 表2のNo.5(UIフレームワーク)は、表5から1つ選択できます。

表5:UIフレームワークの選択肢
選択肢  詳細(参照URL) 
none  -
bootstrap  https://github.com/bootstrap-vue/bootstrap-vue
vuetify https://github.com/vuetifyjs/vuetify
bulma  https://github.com/jgthms/bulma
tailwind https://github.com/tailwindcss/tailwindcss
element-ui  https://github.com/ElemeFE/element
buefy https://buefy.github.io/
ant-design-vue https://github.com/vueComponent/ant-design-vue
iview https://github.com/iview/iview
tachyons  https://github.com/tachyons-css/tachyons

 表2のNo.6(テストフレームワーク)は、表6から1つ選択できます。

表6:テストフレームワークの選択肢
選択肢 詳細(参照URL) 
none -
jest  https://github.com/facebook/jest
ava https://github.com/avajs/ava

 表2のNo.7(レンダリングモード)は、表7から1つ選択できます。「ユニバーサル」は、コードがサーバーとクライアントの両方で実行されるという意味です。

表7:レンダリングモードの選択肢
選択肢 詳細
Universal ユニバーサル(サーバーサイドレンダリング有効)
Single Page App シングルページアプリケーション(サーバーサイドレンダリング無効)

Nuxt.jsプロジェクトの内容

 create-nuxt-appで生成できるプロジェクトの内容を、以下で説明します。

プロジェクトで利用できるコマンド

 生成されたプロジェクトでは、表8のコマンドが利用できます。

表8:Nuxt.jsプロジェクトで利用できるコマンド
No.  コマンド 内容
npm run dev 開発用にプロジェクトを実行
npm run build 本番用にプロジェクトをビルド
3 npm run start  ビルドされた本番用プロジェクトを実行
npm run generate 静的ファイルを生成する

 No.1は開発用の実行コマンドで、実行中にファイルを変更すると、Webページを更新して変更を反映します。No.2は本番用にビルドするコマンドで、ビルド結果はNo.3のコマンドで実行できます。No.4は静的ファイルを生成するコマンドで、詳細は後述します。

プロジェクトに含まれるファイルやフォルダー

 プロジェクトに含まれる、Nuxt.js固有のファイルやフォルダーの概要を表9に示します。詳細は本連載で順次説明していきます。

表9:Nuxt.jsプロジェクトに含まれるファイルやフォルダー
項目名  種類 説明
nuxt.config.js ファイル Nuxt.jsの設定ファイル
pages フォルダー  ページのファイル(*.vue)を配置
components フォルダー コンポーネントのファイル(*.vue)を配置
assets フォルダー  アセット(CSSや画像ファイルなど)を配置
layouts フォルダー レイアウト(Webページのテンプレート)を配置
middleware フォルダー ミドルウェア(ページレンダリング前に実行される処理)を配置
plugins フォルダー プラグイン(Webページ初期化時に実行される処理)を配置
static  フォルダー 静的ファイル(robots.txt、favicon.icoなど)を配置
store フォルダー Vuexストア(状態を保持するオブジェクト)を配置

デフォルトで生成されるページやコンポーネントの内容

 生成されたプロジェクトに含まれるページと、ページの一部分に対応するコンポーネントのファイルについて、以下で説明します。pages/index.vueが、最初に表示されるインデックスページのファイルです。

[リスト3]インデックスページのファイル(p001-cli/pages/index.vue)
<template><!-- テンプレート …(1)-->
  <section class="container">
    <div>
      <logo /><!-- コンポーネント …(1a)-->
(略)
    </div>
  </section>
</template>
<script><!-- スクリプト …(2)-->
import Logo from '~/components/Logo.vue' // 参照 …(2a)
export default {
  components: {
    Logo // 公開 …(2b)
  }
}
</script>
<style><!-- スタイル …(3)-->
(略)
</style>

 *.vueファイルでは、<template>タグ(1)内にテンプレート(表示内容のHTML)、<script>タグ(2)内にスクリプト(JavaScript)、<style>タグ(3)内にスタイル(CSS)を、それぞれ記述します。(1a)の<logo>タグは、ロゴを表示するコンポーネントに対応します。コンポーネントを実装したcomponents/Logo.vueを(2a)で参照して(2b)で利用できるようにしています。

 コンポーネントは、ページと同じ形式の*.vueファイルで記述します。ロゴを表示するコンポーネントのファイル(components/Logo.vue)をリスト4に示します。ここでは、ロゴを構成する三角形に対応するdiv要素が<template>に、それらのスタイルやアニメーションの指定が<style>に記述されています。詳細はサンプルコードを参照してください。

[リスト4]コンポーネントのファイル(p001-cli/components/Logo.vue)
<template>
  <div class="VueToNuxtLogo">
    <div class="Triangle Triangle--two" />
    <div class="Triangle Triangle--one" />
    <div class="Triangle Triangle--three" />
    <div class="Triangle Triangle--four" />
  </div>
</template>
<style>
(略)
</style>

 Nuxt.jsのページやコンポーネントの概要をまとめると、以下の通りになります。

  • ページやコンポーネントは*.vueファイルに記述する
  • ページのファイルはpages、コンポーネントのファイルはcomponentsの各フォルダーに配置する
  • *.vueファイルは<template>、<script>、<style>の部分に分かれる

Vue.jsの基本的な実装方法

 *.vueファイルの基本的な実装方法を、図4のサンプルで説明します。このサンプルは、テキストボックスに入力した内容をそのまま画面に表示します。テキストボックスの内容を変更すると、リアルタイムで画面に反映されます。

図4:入力内容を画面に表示するWebページのサンプル(p002-basic)
図4:入力内容を画面に表示するWebページのサンプル(p002-basic)

 このサンプルのindex.vueは、リスト5の通りです。

[リスト5]図4のWebページに対応する実装(p002-basic/pages/index.vue)
<template>
  <div>
    <h1>Hello {{name}}!</h1> <!-- nameの表示 …(1) -->
    <input v-model="name"><!-- nameの入力 …(2)-->
  </div>
</template>
<script>
export default {
  data() { // ページに表示するデータの指定 …(3)
    return {
      name: 'World' // nameの初期値 …(4)
    }
  }
}
</script>

 テンプレートの「{{name}}」(1)は、name変数の内容を表示することを表します。(2)では、<input>タグに「v-model="name"」と指定して、name変数の値とテキストボックスの内容が双方向に同期(バインディング)されるようにしています。「v-model」のように、要素の属性に指定して機能を設定する記述を、ディレクティブと呼びます。

 スクリプトでは、「export default」記述で、テンプレートで利用する実装をエクスポートします。このサンプルでは、画面に表示するデータを指定するdata関数(3)で、name変数の初期値を設定します(4)。

 より詳細なVue.jsの実装方法は、本連載の次回以降で説明します。

Nuxt.jsのサーバーサイドレンダリングと静的ファイル生成を試す

 ここでは、Vue.jsを補完するNuxt.jsの機能として、サーバーサイドレンダリングと、静的ファイル生成を紹介します。

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

 サーバーサイドレンダリングは、サーバーサイドでWebページの内容を生成する機能で、検索エンジン最適化(SEO)や表示の高速化に有用です。また、JavaScriptが無効な環境でも、最低限の内容を表示できるメリットがあります。

 Nuxt.jsのプロジェクトでは、デフォルトでサーバーサイドレンダリングが有効になるため、JavaScriptを無効にしたWebブラウザーでもWebページを表示できます(ただし、動的な処理は機能しません)。例えば、図4のWebページをJavaScript無効のWebブラウザーで表示すると、初期表示は行えますが、テキストボックスの内容を変更しても画面に反映されません。

[補足]ChromeでJavaScriptの有効/無効を切り替える

 ChromeでJavaScriptの有効/無効を切り替える設定は、設定画面の「詳細設定」-「サイトの設定」-「JavaScript」にあります。「chrome://settings/content/javascript」のURLを開いて、設定画面を直接表示することもできます。

図5:ChromeでJavaScriptの有効/無効を設定する画面
図5:ChromeでJavaScriptの有効/無効を設定する画面

 図4のサンプルで、Webページのソースコードを参照すると、サーバーサイドレンダリングされた初期表示の内容がHTMLで記述されていることがわかります(図6の赤枠部)。

図6:サーバーサイドレンダリングされたWebページのソースコード(p002-basic)
図6:サーバーサイドレンダリングされたWebページのソースコード(p002-basic)

 Nuxt.jsの設定ファイルnuxt.config.jsで、「mode」を「universal」から「spa」に変更すると、サーバーサイドレンダリングを無効にできます。

[リスト6]サーバーサイドレンダリングを無効化するnuxt.config.jsの設定
export default {
  mode: 'spa', // 'universal'から変更
(略)

 図4のサンプルでリスト6のmodeを変更後、「npm run dev」を実行して、JavaScript無効のWebブラウザーでWebページを開くと、真っ白なページが表示されます。ソースコードを参照すると、初期表示のHTML記述を含まないことがわかります。

図7:サーバーサイドレンダリングされていないWebページのソースコード(p002-basic)
図7:サーバーサイドレンダリングされていないWebページのソースコード(p002-basic)

 なお、リスト6のmodeは、プロジェクト生成時に、表2のNo.7(レンダリングモード)で初期設定できます。デフォルト値の「Universal」を選択するとmodeがuniversalに、「Single Page App」を選択するとmodeがspaに、それぞれ設定されます。

静的ファイル生成

 Nuxt.jsでは、プロジェクトから静的なファイルを生成できます。生成した静的ファイルは任意のWebサーバーにホストできます。Webサーバーにnode.jsやサーバーサイドアプリケーションの実行環境は必要ありません。

 「npm run generate」コマンドを実行すると、図8の通り、プロジェクトのdistフォルダーに静的ファイルが生成されます。

図8:Nuxt.jsプロジェクトから生成した静的ファイルの例
図8:Nuxt.jsプロジェクトから生成した静的ファイルの例

 ダウンロードできるサンプルに、図4のプロジェクト(p002-basic)から生成した静的ファイル(distフォルダー)を、Node.jsのWebサーバーでホストする例(p003-generated)を含めています。実行すると図4と同じ画面が表示されます。実行方法などの詳細は、サンプルコードのreadmeを参照してください。

まとめ

 本記事では、UIフレームワーク「Vue.js」を利用してWebページを作成できるJavaScriptフレームワーク「Nuxt.js」について、フレームワークの概要、プロジェクトの生成/実行方法、基本的な実装方法を説明しました。また、サーバーサイドレンダリングや静的ファイルの生成といった、Nuxt.jsの特徴的な機能を紹介しました。

 Nuxt.jsを使いこなすには、Vue.jsの基本について理解することが必要です。次回は、Vue.js(*.vueファイル)のバインディングやディレクティブの基本を説明していきます。

参考資料

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5