Nuxt.js
API
方針を決める
Nuxt のプロダクション環境での使い方は 3 つある。
Universal Mode(サーバあり)
mode: 'universal'
- デプロイ方法 --- Node.js サーバにソースをクローンし
yarn start
する。サーバが必要。 - 非同期データは、
- 初回リクエスト時はサーバ側で取得する(常に最新)
- ページ遷移時など、2 回目以降はクライアント側で取得する
Universal Mode(サーバなし)
mode: 'universal'
- デプロイ方法 ---
nuxt generate
で生成された静的ファイルを単に配布する。サーバが不要。 - 非同期データは、
- 初回リクエスト時は、ビルド時に取得したデータで固定される(=疑似的な SSR と考えればよい)。このため、動的データに変更があったときは再ビルド・再デプロイが自動で行われるフローを構築するなどの処置が必要となる。
- ページ遷移時など、2 回目以降はクライアント側で取得する
SPA Mode
mode: 'spa'
- デプロイ方法 ---
nuxt generate
で生成された静的ファイルを単に配布する。サーバが不要。 - 非同期データは常にクライアント側で取得する
インストール
create-nuxt-app を使う
yarn global add create-nuxt-app
create-nuxt-app some-app
cd some-app
yarn dev
自前で作る
package.json
{
"name": "my-app",
"scripts": {
"dev": "nuxt"
},
"dependencies": {
"nuxt": "^2.0.0"
}
}
pages/index.vue
<template>
<h1>Hello world!</h1>
</template>
yarn
yarn dev
Directory Structure
Directories
assets
- webpack でコンパイルされるべき Less, Sass, Javascript ファイルなどを格納する
components
- Vue コンポーネントを格納する
- Nuxt.js は
components
ディレクトリ内のコンポーネントの data メソッドについては手を加えない - 一方、Nuxt.js は
pages
ディレクトリ内のコンポーネントの data メソッドには非同期データを扱えるよう手を加える
layouts
- アプリケーションのレイアウトファイルを格納する。
middleware
- ミドルウェアを格納する
- ミドルウェアは、ページやレイアウトをレンダリングする前に動作するファンクションである。
pages
.vue
ファイルを格納する。ここに配置したファイルが、View と Routes になる。
plugins
- root Vue.js Application が動きはじめる前に動作させたいプラグインを格納する
static
- 静的ファイルを格納する。
- ここに置いたファイルは webpack を経由せず、そのまま
/
に配置される
store
- Vuex 関連のファイルを格納する
nuxt.config.js
- nuxt.js のコンフィグファイル
Aliases
~
or@
はsrcDir
を指す~~
or@@
はrootDir
を指す
デフォルトでは srcDir と rootDir は同じ
vue テンプレートでファイルを相対指定する時に、次のように使う
~/assets/your_image.png
~/static/your_image.png
Configuration
設定項目
build
- webpack 関連の設定を行う
- 例えば、webpack の
vendor.bundle.js
に入れ込むモジュールを指定する。これにより本体 bundle の容量を減らすことができる。
- 例えば、webpack の
css
グローバルに使用する CSS を指定する。
dev
development
or production
モードを指定する。
env
環境変数を指定する。環境変数はサーバサイド、クライアントサイドの両方から参照できる。
generate
nuxt generate
(Static Generated Deployment)した時、動的なルーティングは無視される。
動的なルーティングも含めて静的な HTML ファイルに変換したいときは、ここに設定を記述する。
head
デフォルトの meta タグを指定する
loading
ローディング中に表示するコンポーネントを指定する
modules
nuxt で使用するモジュールを指定する。モジュール= nuxt の設定を一括して行うプラグインのようなもの
modulesDir
node_modules
フォルダの場所を指定する。
yarn の workspaces 機能を使っているなら、下記の設定が必須。
// 例えば`<projectRoot>/packages/nuxt`にnuxtプロジェクトを格納している場合
modulesDir: ['../../node_modules'],
plugins
root Vue.js Application を開始する前に動作させたいプラグインを指定する。
rootDir
nuxt のルートディレクトリを指定する
server
ポート番号、IP、証明書の場所など、サーバのセットアップに関する情報を指定する。
router
vue-router の設定を指定する。
srcDir
ソースディレクトリを指定する。
transition
ページのトランジションを指定する。
Routing
Routes
- ファイル名が
index.vue
だと、パスは''
(ホーム)になる - フォルダ名 or ファイル名に
_
をつけると Dynamic Route(:id
など) になる - フォルダ内の
_
ファイルは一つまで。2 つ以上あると名前順で一番上のものが採用される - フォルダ内に
index.vue
が存在しない場合、_
から始まるファイルは任意のDynamic Route になる(index.vue の役割を兼ねる) - Dynamic Routes は
nuxt generage
コマンドでは無視される
pages/
--| category/
-----| _id.vue
--| users/
-----| _id.vue
-----| index.vue
--| index.vue
routes = [
{
name: 'index',
path: '/',
component: 'pages/index.vue',
},
{
name: 'category-id',
path: '/category/:id?',
component: 'pages/category/_id.vue',
},
{
name: 'users',
path: '/users',
component: 'pages/users/index.vue',
},
{
name: 'users-id',
path: '/users/:id',
component: 'pages/users/_id.vue',
},
];
Nested Routes
- ネストした Routes を定義するには、フォルダ名と同名の vue ファイルを作成する
pages/
--| users/
-----| _id.vue
-----| index.vue
--| users.vue
routes = [
{
path: '/users',
component: 'pages/users.vue',
children: [
{
path: '',
component: 'pages/users/index.vue',
name: 'users',
},
{
path: ':id',
component: 'pages/users/_id.vue',
name: 'users-id',
},
],
},
];
Dynamic Nested Routes
Dynamic Routes をネストさせることもできる。
pages/
--| _category/
-----| _subCategory/
--------| _id.vue
--------| index.vue
-----| _subCategory.vue
-----| index.vue
--| _category.vue
--| index.vue
routes = [
{
path: '/',
component: 'pages/index.vue',
name: 'index',
},
{
path: '/:category',
component: 'pages/_category.vue',
children: [
{
path: '',
component: 'pages/_category/index.vue',
name: 'category',
},
{
path: ':subCategory',
component: 'pages/_category/_subCategory.vue',
children: [
{
path: '',
component: 'pages/_category/_subCategory/index.vue',
name: 'category-subCategory',
},
{
path: ':id',
component: 'pages/_category/_subCategory/_id.vue',
name: 'category-subCategory-id',
},
],
},
],
},
];
SPA fallback
TODO: よくわからない
Dynamic Routes で SPA フォールバックを有効にするには設定が必要らしい。ドキュメント参照。
リンクの貼り方、子コンポーネントの配置の仕方
<!-- リンクを貼る router-linkは使えない-->
<nuxt-link to="/">Home page</nuxt-link>
<!-- 子コンポーネントの配置 router-viewは使えない -->
<nuxt-child />