Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nuxt.jsのComponent分割単位と,SSRをする上で気をつけること
Search
omiend
January 26, 2019
Programming
810
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Nuxt.jsのComponent分割単位と,SSRをする上で気をつけること
omiend
January 26, 2019
More Decks by omiend
See All by omiend
スクラッチ組織活用術 Salesforce Developers Meetup #24
omiend
0
1.4k
Nuxt.js_Vue.js_のVuexの動かしかたをまとめてみたよ.pdf
omiend
0
120
20181208_好きだけじゃツライScala.js_共有版_.pdf
omiend
0
120
20181110 Scala関西Summit 懇親会LT「Scalaのかわいいところ」
omiend
0
590
Other Decks in Programming
See All in Programming
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
720
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
240
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
180
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.2k
今さら聞けない .NET CLI
htkym
0
130
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
230
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
120
AIエージェントで 変わるAndroid開発環境
takahirom
2
720
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
240
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
540
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
250
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
370
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
170
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
380
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
420
30 Presentation Tips
portentint
PRO
1
350
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Six Lessons from altMBA
skipperchong
29
4.3k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
390
Building Applications with DynamoDB
mza
96
7.1k
Visualization
eitanlees
152
17k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Transcript
Nuxt.jsのComponentについて @omiend Store
自己紹介 @omiend 恵比寿で働くプログラマー歴13年目のおじさん 一応フロントエンドからバックエンドまで一通り出来ると思い込んでいるダメェンジニア 時々パン売ってます。(次回予定3月横浜赤レンガ/4月新宿たかしまや) PeopleSoft,Java,Shell,MySQL,SQL,Salesforce(Force.com/ApexCode/VisualCode),GAE(Slim3),ABAP Scala(ScalaMatsuri Staff),Ruby on Rails,Docker,Angular(1.4…),React/Redux,Riot.js,Vue.js,Nuxt.js
Musics,Movies,Joging,Walking,Drink Driven Development
話すこと - Nuxt.js のComponent分割単位 - Nuxt.js SSRする時に気をつけること @omiend 今日も一日
@omiend Nuxt.jsのComponent分割単位
@omiend Nuxt.js は Vue アプリケーションを作成するフレームワークです。 ユニバーサルアプリケーション、静的に生成されるアプリケーショ ン、シングルページアプリケーションの中から作成するアプリケー ションを選ぶことができます。 はじめに -
Nuxt.js https://ja.nuxtjs.org/guide/ Nuxt.jsとは
Nuxtは - Layouts - Pages - Components という単位でページを構成する。 @omiend Nuxt.jsのページ定義
layouts/default.vue pages/index.vue components/TheFooter.vue components/TheHeader.vue components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue
@omiend 右ののようなページを作成する場合、下記のようなディレクトリ構 造となる。 . ├── components │ ├── TheSideNavi.vue │
├── TheFooter.vue │ ├── TheHeader.vue │ ├── SomeSection.vue │ └── UserCard.vue ├── layouts │ └── default.vue └── pages └── index.vue Nuxt.jsのページ定義 layouts/default.vue pages/index.vue components/TheFooter.vue components/TheHeader.vue components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue
Layoutsは全ページ共通のレイアウトを定 義するソースファイル。 Nuxtがデフォルトで用意するdefault.vue とは別のソースファイルを定義し、ページご とに適用を分けることもできる。 @omiend Layouts layouts/default.vue pages/index.vue components/TheFooter.vue
components/TheHeader.vue components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue
Pagesは各ページ(トップページやアバウト ページなど)を定義するソースファイル。 定義したディレクトリによりNuxtがRouting を自動生成してくれる。 @omiend Pages layouts/default.vue pages/index.vue components/TheFooter.vue components/TheHeader.vue
components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue
Componentsでは、再利用性の高い部品を 定義する。 例では、HeaderやFooter、または GlobalNaviなどを定義してLayoutで importしたり、ユーザ1人1人の情報を表 示するカードを定義している。 @omiend Components layouts/default.vue pages/index.vue
components/TheFooter.vue components/TheHeader.vue components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue
このComponentsはHTMLの要素としてど の単位にも分割・定義をすることができる。 しかし、設計・再現無く分割・定義しまくると カオス化することが想定される。 では、Componentsはどの粒度で分割して 定義するのが良いか? @omiend Componentsの分割単位 layouts/default.vue pages/index.vue
components/TheFooter.vue components/TheHeader.vue components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue
ざっくりまとめると、弊社では - (HTML5の)Sectionタグ - 部品(Cardなど) の粒度で分割・定義することとした。 Blogに書きました: #Nuxt.jsのComponentをどの単位で分けるか悩んだ話 https://omiend.hatenablog.jp/entry/2018/12/27/203359 @omiend
layouts/default.vue pages/index.vue components/TheFooter.vue components/TheHeader.vue components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue Componentsの分割単位
@omiend その上で、書きのディレクトリ構造を少し変更して・・・ . ├── components │ ├── TheSideNavi.vue │ ├──
TheFooter.vue │ ├── TheHeader.vue │ ├── SomeSection.vue │ └── UserCard.vue ├── layouts │ └── default.vue └── pages └── index.vue Componentsの分割単位 layouts/default.vue pages/index.vue components/TheFooter.vue components/TheHeader.vue components/SomeSection.vue components/ UserCard.vue components/ TheSideNavi.vue components/ UserCard.vue
このような感じにしました。 . ├── components │ ├── parts │ │ └──
UserCard.vue │ └── sections │ ├── TheSideNavi.vue │ ├── TheFooter.vue │ └── TheHeader.vue ├── layouts │ └── default.vue └── pages └── index.vue @omiend Componentsの分割単位 layouts/default.vue pages/index.vue components/TheFooter.vue components/sections/TheHeader.vue components/sections/ SomeSection.vue components/ parts/ Card.vue components/ sections/ TheSideNavi.vue components/ parts/ Card.vue
異論は認める。 @omiend Componentsの分割単位 layouts/default.vue pages/index.vue components/TheFooter.vue components/sections/TheHeader.vue components/sections/ SomeSection.vue components/
parts/ Card.vue components/ sections/ TheSideNavi.vue components/ parts/ Card.vue
※SSR = Server Side Rendering SPAだと当該ページにアクセスしてから DOM(仮想DOM)を構築してページを構成するので、クローラーが巡回してきた時は「なにも無いページ」と解釈されてしまう。 そこでSSRにて対応する。 ※SPA =
Single Page Application @omiend Nuxt.jsにおけるSSRのしかた
@omiend 日記はここで終わっている・・・ Nuxt.jsにおけるSSRのしかた
TL;DR - Componentsで利用するデータや機能は、 Components内部で完結させたい - Nuxt.jsでSSRをするときは、asyncData()とfetch()を利用する - ComponentsからはasyncData()を利用することが出来ない( Nuxt.jsの仕様) -
asyncData()はPagesで利用する必要があり、 Componentsにデータを渡す場合は Propsを利用する - Propsは利用したくない - Vuexを利用すれば良い - asyncData()からはVuexのStoreにアクセスできない - fetch()であれば、Storeにアクセスできる まとめ - SSRをしたい - Componentsにデータを渡すか? - Yes - Pagesにfetch()を定義し、Storeにデータを格納 - ComponentsからはStoreのデータを参照する - No - PagesにasyncData()を定義し、Pagesのdata要素とマージさせる @omiend Nuxt.jsにおけるSSRのしかた
ソース https://github.com/omiend/omiend-my-api アプリ(firebase) https://omiend-my-api.firebaseapp.com/ssr @omiend Nuxt.jsにおけるSSRのしかた
@omiend ご清聴 ありがとうございました Store