Nuxt.js dynamic routing

Text

SPA ?

SSR ?

Pre-rendering ?

SPA

<html>
......

<div id="app"></div>

......
</html>

bundle_1.js

bundle_2.js

bundle_5.js

bundle_4.js

bundle_3.js

SSR

bundle_1.js

bundle_2.js

bundle_5.js

bundle_4.js

bundle_3.js

サーバー

.html

んで、

サーバに置く Node.js のプログラムが必要です。

サーバ側の負荷がかなり増えます。(CPU を多用する負荷)

Pre-rendering

固定内容が多いページに向け

例:

www.oro.com/ja/      80%

www.oro.com/bs/      10%

www.oro.com/cd/      10%

注意点:

SSR, Pre-rendering は

ユーザー最初ページにアクセスする時の UX を向上する技術です。

bundle_1.js

bundle_2.js

bundle_5.js

bundle_4.js

bundle_3.js

index.html

サーバー

bundle_1.js

bundle_2.js

bundle_5.js

bundle_4.js

bundle_3.js

index.html

ページ遷移する時

<html>
.....

    <header></header>
    <main>
        contents
        contents
        contents
        contents
    </main>
    <aside></aside>
    <footer></footer>
.....
</html>

xxxxx.{ js, json}

サーバ

<html>
.....

    <header></header>
    <main>
        new contents
        new contents
.......

使っている nuxt-template

全サイト Pre-rendering

遭った罠

Polyfill

IE に対する
promise polyfill

object-fit polyfill

polyfill をインポートする時、nuxt.config.js で

該当する JS に no-ssr オプションをつけないといけない

Created 問題

サーバ側で呼び出した Created lifecycle hook

クライアント側で呼び出した Created lifecycle hook

生成した内容が違う

じゃ動的な内容を処理してみようか。

Nuxt.js 動的ルーターリング

---/
    index.vue

   /- disclaim
      /- index.vue

   /- about
      /- index.vue

   /- _news
      /- _date
         /- _post-id

フォルダ構造

index_a.html

index_b.html

index_c.html

index_d.html

index_e.html

index_a.html がほしい

サーバ

index_a.html

index_b.html

index_c.html

index_d.html

index_e.html

index_f.html がほしい

??? 

404 の壁です。

サーバ

index_a.html

index_b.html

post1.json

post2.json

post3.json

post1.html を読みたい

404 の壁です。

サーバ

index_a.html

index_b.html

post1.json

post2.json

post3.json

post1.html を読みたい

サーバ

200.html

Post_template.html

template と結合

post1.html

index_a.html

index_b.html

post1.json

post2.json

post3.json

post4.html を読みたい

サーバ

200.html

Post_template.html

404

404.html

404.html

ここはちょっと怪しい

index_a.html

index_b.html

post1.json

post2.json

post3.json

200.html

Post_template.html

ここなんかやりたい

index_a.html

index_b.html

post1.json

post2.json

post3.json

200.html

Post_template.html

Middleware

404.html

MiddleWare

として使える機能

Nuxt.js:

asyncData: https://nuxtjs.org/guide/async-data

middleware: https://nuxtjs.org/guide/routing#middleware

Vue router:

Navigation Guard:

https://router.vuejs.org/guide/advanced/navigation-guards.html

コンポーネント内ガード

Asyncdata

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: 'Post not found' })
    })
  }
}

Page コンポーネントでしか使えない

Middleware

export default function ({ store, redirect }) {
  // If the user is not authenticated
  if (!store.state.authenticated) {
    return redirect('/login')
  }
}

グローバルで使える

middleware/authenticated.js

nuxt.config.js

export default {
  middleware: 'authenticated'
}
export default {
  router: {
    middleware: 'authenticated'
  }
}

page.vue

Vue router: ナビゲーションガード

Navigation Guards

export default {
    beforeRouteEnter (to, from, next) {
        console.log(to, from)

        next()
    }
}

page.vue

Nuxt.js

By azurewarth