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
Rails使いのNuxt.js入門 - 銀座Rails#12
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
nof
August 29, 2019
Programming
2.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rails使いのNuxt.js入門 - 銀座Rails#12
nof
August 29, 2019
More Decks by nof
See All by nof
オープンセミナー2020@広島 発表資料
nof
1
1.1k
Stripeでよかった
nof
0
150
Other Decks in Programming
See All in Programming
スマート反転とウェブアクセシビリティ
camiha
0
140
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
130
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
580
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
120
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
120
AIの中の人になってみる
htkym
0
170
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
170
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
AIエージェント時代のコードレビューを設計する
nogu66
6
2.5k
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
420
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Building an army of robots
kneath
306
46k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
840
The Spectacular Lies of Maps
axbom
PRO
1
980
The SEO Collaboration Effect
kristinabergwall1
1
550
Writing Fast Ruby
sferik
630
63k
How to build a perfect <img>
jonoalderson
1
6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Making the Leap to Tech Lead
cromwellryan
135
10k
Odyssey Design
rkendrick25
PRO
2
800
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Transcript
Rails͍ͷNuxt.jsೖ ۜ࠲Rails#12 2019/08/29 גࣜձࣾιχοΫΨʔσϯ ࡔխढ़
ࣗݾհ • ࡔխढ़ @ssh_nof • גࣜձࣾιχοΫΨʔσϯॴଐ • ౡͷ͔ࣗΒϦϞʔτϫʔΫ • झຯɿαφ
(༵αφͷ)
͢͜ͱ • Rails ϓϩάϥϚͷ͕ Nuxt.js Ͱ։ൃ͢Δ࣌ͷྲྀΕ • ࡐΑ͋͘ΔTODOফ͠ࠐΈॲཧ • ͍ͬͪΐ৮ͬͯΈΑ͏͔ͳͱࢥͬͯΒ͏ͨΊͷೖฤ
Nuxt.js ?
Nuxt.js • Vue.js ։ൃͷͨΊͷϑϨʔϜϫʔΫ • SSR (αʔόʔαΠυϨϯμϦϯά) • SPA (γϯάϧϖʔδΞϓϦέʔγϣϯ)
• ଞʹϑϨʔϜϫʔΫͱͯ͠ͷ༷ʑͳػೳ͕͋Γ·͕͢ɺׂѪ ࠓճͪ͜Β
͓
Πϝʔδ νΣοΫϘοΫεͷΫϦοΫͰɺϦετΛΓସ͑ ↓ νΣοΫϘοΫεͷΫϦοΫ ͬͨ͜ͱϦετʹҠಈ
ϓϩδΣΫτͷ࡞ʙىಈ
ϓϩδΣΫτΛ࡞Δ w CPPUTUSBQ w WVFUJGZ w CVMNB w UFJMXJOE w
FMFNFOUVJ w CVFGZ w &4-JOU͏ w 1SFUUJFS͏ w OQNPSZBSO ରࣜͰઃఆ npx create-nux-app <project name> ( npx :μϯϩʔυ͔Β࣮ߦ·ͰҰൃͰͰ͖ΔίϚϯυɻ࠷ۙͷ Node.js ʹೖ͍ͬͯ·͢ɻ )
ىಈ http://localhost:3000/ $ cd todo-list $ yarn dev ϑΝΠϧͷฤूͰࣗಈͰը໘͕ΓସΘΓ·͢ (ϗοτϦϩʔυ)
+
։ൃ͢Δ
pugʹ͍ͭͯগ͠ <template lang="pug"> ul.list-group li.list-group-item foo li.list-group-item bar </template> •
؆ུه๏ͰHTMLΛָʹॻ͚ΔςϯϓϨʔτΤϯδϯ • Rails͍ͷօ༷ʹ͓ͳ͡Έͷ slim ͱ΄ͱΜͲಉ͡ • yarn add —dev pug pug-plain-loader ͰΠϯετʔϧ • ࠓճHTMLͰઆ໌͢ΔͱεϥΠυͷେ͖͕͞Γͳ͍ͷͰ pug Λ͍·͢ <ul class="list-group"> <li class="list-group-item">foo</li> <li class="list-group-item">bar</li> </ul>
pagesσΟϨΫτϦʹ.vueϑΝΠϧΛஔ pages !"" index.vue #"" tasks #"" index.vue λεΫҰཡIUUQMPDBMIPTUUBTLT pages
ʹϑΝΠϧΛஔ͢Ε vue-router ͷ ઃఆΛࣗಈతʹͬͯ͘Ε·͢ τοϓϖʔδIUUQMPDBMIPTU
./pages/index.vue <template lang="pug"> section.container nuxt-link(to="/tasks") λεΫҰཡ </template> τοϓϖʔδ IUUQMPDBMIPTU •
nuxt-link ίϯϙʔωϯτͰผ vue ͷભҠ • ੜ͞ΕΔͷaλάͰ͕͢ɺઌಡΈͯ͠ύϑΥʔϚϯεΛߴΊͯ͘ΕΔ
./pages/tasks/index.vue (λεΫҰཡશମ૾) <template lang="pug"> section.container.pt-5 .row .col-6 .card .card-header Δ͜ͱ
ul.list-group.list-group-flush.px-3 li.list-group-item(v-for="task in unfinishedTasks" :key="task.id") input.form-check-input( :id="`task-checkbox-${task.id}`" v-model="task.finished" type="checkbox") label(:for="`task-checkbox-${task.id}`") {{ task.title }} .col-6 .card .card-header ͬͨ͜ͱ ul.list-group.list-group-flush.px-3 li.list-group-item(v-for="task in finishedTasks" :key="task.id") input.form-check-input( :id="`task-checkbox-${task.id}`" v-model="task.finished" type="checkbox") label(:for="`task-checkbox-${task.id}`") {{ task.title }} </template> <script> export default { data() { return { tasks: [ { id: 1, title: 'ڇೕΛങ͏', finished: false }, { id: 2, title: 'ͨ·͝Λങ͏', finished: false }, ] } }, computed: { finishedTasks() { return this.tasks.filter((task) => { return task.finished }) }, unfinishedTasks() { return this.tasks.filter((task) => { return !task.finished }) } }, } </script> IUUQMPDBMIPTUUBTLT UFNQMBUF TDSJQU ࣍ͷϖʔδͰॱʹઆ໌͠·͢ ΛڽΒͯ͠ಡ·ͳͯ͘େৎ
<script> <script> export default { data() { return { tasks:
[ { id: 1, title: 'ڇೕΛങ͏', finished: false }, { id: 2, title: 'ͨ·͝Λങ͏', finished: false }, ] } }, computed: { finishedTasks() { return this.tasks.filter((task) => { return task.finished }) }, unfinishedTasks() { return this.tasks.filter((task) => { return !task.finished }) } }, } </script> EBUB DPNQVUFE ͬͨ͜ͱҰཡ pOJTIFE pOJTIFEϑϥάΛΓସ͑Δ Δ͜ͱҰཡ pOJTIFE
<template> <template lang="pug"> section.container .card .card-header Δ͜ͱ ul li(v-for="task in
unfinishedTasks" :key="task.id") input( :id="`task-checkbox-${task.id}`" v-model="task.finished" type="checkbox") label(:for="`task-checkbox-${task.id}`") {{ task.title }} .card .card-header ͬͨ͜ͱ ul li(v-for="task in finishedTasks" :key="task.id") input( :id="`task-checkbox-${task.id}`" v-model="task.finished" type="checkbox") label(:for="`task-checkbox-${task.id}`") {{ task.title }} </template> νΣοΫϘοΫε WNPEFMͰσʔλͱଓ λΠτϧ UBTLUJUMFΛࢀর
։ൃͷྲྀΕৼΓฦΓ • ϓϩδΣΫτ࡞ • λεΫҰཡը໘࡞ /pages • λεΫҰཡ෦ΛίϯϙʔωϯτԽ /components w
શମϨΠΞτ w EBUBߟ͑Δ w EBUBͷมߋํ๏ߟ͑Δ w ཧ
/pages ͷΈʹ͍ͭͯ͏ͪΐͬͱ pages └── tasks ├── _id.vue └── _userId └──
edit.vue w IUUQMPDBMIPTUUBTLT w QBHFTUBTLT@JEWVF w UIJTSPVUFQBSBNTJEͰಘΒΕΔ w IUUQMPDBMIPTUUBTLTFEJU w QBHFTUBTLT@VTFS*EFEJUWVF w ϋϚΓϙΠϯτ w ಉ֊ʹಉ໊͡લ @JE Λ͏ͱOVYUDIJMEͷѻ͍ʹͳΔ • _ ࢝·ΓಈతϧʔςΟϯά • _id ͷ෦ԿͰྑ͍
·ͱΊ • TODOফ͠ࠐΈػೳΛNuxt.jsͰ࡞ͬͯΈͨ • pages ʹ vue ϑΝΠϧΛஔ͢Δϧʔϧ (ઃఆΑΓن) •
ࠓճհͨ͠ͷ΄ΜͷҰ෦ (layouts, store, middleware, …) • ͘͢͝؆୯ʹ࢝ΊΒΕΔͷͰɺࠓिʹͰ npx create- nuxt-app <project-name> ʂ
λεΫҰཡΛίϯϙʔωϯτԽ͢Δ
<template lang="pug"> section.container .card .card-header Δ͜ͱ task-list(:tasks="unfinishedTasks" @check="onTaskCheck") .card .card-header
ͬͨ͜ͱ task-list(:tasks="finishedTasks" @check="onTaskCheck") </template> <script> import TaskList from '~/components/TaskList.vue' export default { components: { TaskList }, data() { return { tasks: [ { id: 1, title: 'ڇೕΛങ͏', finished: false }, { id: 2, title: 'ͨ·͝Λങ͏', finished: false }, ] } }, computed: { finishedTasks() { return this.tasks.filter((task) => { return task.finished }) }, unfinishedTasks() { return this.tasks.filter((task) => { return !task.finished }) } }, methods: { onTaskCheck(taskId) { const task = this.tasks.find(task => task.id === taskId) this.$set(task, 'finished', !task.finished) } } } </script> ./pages/tasks/index.vue <template lang="pug"> ul.list-group.list-group-flush.px-3 li.list-group-item( v-for="task in tasks" :key="task.id") input.form-check-input( :id="`task-checkbox-${task.id}`" :checked="task.finished" @change="$emit('check', task.id)" type="checkbox") label(:for="`task-checkbox-${task.id}`") |{{ task.title }} </template> <script> export default { props: { tasks: { type: Array, required: true } } } </script> ./components/TaskList.vue DIFDLΠϕϯτൃՐ UBTLpOJTIFEస