Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nuxt.jsが掲げる"Universal Vue.js Applications"とは何者か

Nuxt.jsが掲げる"Universal Vue.js Applications"とは何者か

Yosuke Ishikawa

October 04, 2017
Tweet

More Decks by Yosuke Ishikawa

Other Decks in Programming

Transcript

  1. Nuxt.js
    が掲げる
    "Universal Vue.js Applications"
    とは何者か

    View full-size slide

  2. Universal Mode
    SPA Mode

    View full-size slide

  3. Universal Mode ←
    こっち
    SPA Mode

    View full-size slide

  4. わかるようでわからない

    View full-size slide

  5. でも、使ってみたら理解できた

    View full-size slide

  6. デベロッパーは1
    つの
    Nuxt.js
    アプリ(
    ≒ Vue.js
    アプリ)

    開発するが...

    View full-size slide

  7. SSR
    するサーバーも生成される

    View full-size slide

  8. "Universal Vue.js Applications"

    View full-size slide

  9. そういう感じか~

    View full-size slide

  10. Vue.js
    のアプリと
    生成されるサーバーの関係は?

    View full-size slide


  11. ディレクトリ構造 →
    ルーティングに反映
    asyncData() →
    サーバーサイドで実行

    View full-size slide

  12. ルーティング

    View full-size slide

  13. pages
    ├── index.vue
    └── items
    ├── _id.vue
    ├── create
    │ └── index.vue
    └── index.vue
    Nuxt.js
    アプリのディレクトリ構造

    View full-size slide

  14. export function createRouter () {
    return new Router({
    mode: 'history',
    base: '/',
    (中略)
    routes: [
    {path: "/", component: _d26d9516, name: "
    {path: "/items", component: _8ac95cea, nam
    {path: "/items/create", component: _4bfc3
    {path: "/items/:id", component: _07563ab3
    ]
    })
    }
    生成されたサーバーのルーティング

    View full-size slide

  15. asyncData()
    最初に取得するデータをSSR

    View full-size slide

  16. ...
    <br/>export default {<br/>async asyncData ({ app }) {<br/>const res = await app.axios.$get('/api/item<br/>return {<br/>items: res.items,<br/>nextCursor: res.nextCursor,<br/>}<br/>}<br/>}<br/>
    Nuxt.js
    アプリの.vue
    ファイル

    View full-size slide

  17. let asyncDatas = await Promise.all(Components.m
    let promises = []
    if (Component.options.asyncData && typeof Com
    let promise = promisify(Component.options.a
    (中略)
    promises.push(promise)
    }
    (中略)
    return Promise.all(promises)
    }))
    context.nuxt.data = asyncDatas.map(r => r[0] ||
    で実行してdata
    にセット

    View full-size slide

  18. 要するに

    View full-size slide

  19. Vue.js
    アプリを書いてたら
    SSR
    するサーバーが生成される

    View full-size slide

  20. サーバーはNode.js

    View full-size slide

  21. サーバーの動作はカスタマイズ可能
    外れすぎない範囲で使うのが良さそう

    View full-size slide