Share
Embed
Vue.js入門1ヶ月で自作の技術ブログをリリースした話
Yumemi.vue #2の10分枠LT資料です。
https://yumemi.connpass.com/event/148953/
技術ブログ: https://subroh0508.net
Github: https://github.com/subroh0508/techblog
subroh_0508
October 17, 2019
Transcript
21 slides
-
"CPVU.F w ʹ͜͠Γ͞ͿΖʙ w ౦ژɾҏ౾େౡग़ w גࣜձࣾ#FBS5BJM w "OESPJEΤϯδχΞ ,PUMJO+BWB
ˑ w 8FCΤϯδχΞ 3BJMT3FBDU w 7VFྺϲ݄ -
࡞ͬͨϞϊ w ԣਢլୈ۠ใہ w 7VFKT 8FCQBDL w WVFSPVUFSΛͬͨ41" w 4&0ରࡦͱͯ͠443
w WVFTFSWFSSFOEFSFS w &YQSFTTKT ϦϯΫTVCSPIOFU (JUIVCTVCSPIUFDICMPH -
࣮ղઆ σΟϨΫτϦߏ w "UPNJD%FTJHOͬΆ͍ߏ BUPNTNPMFDVMFT w υϝΠϯʹґଘ͠ͳ͍$PNQPOFOU w ྫ0VUMJOFE#VUUPOɺ4IBSF#VUUPO QBHFT
w 63-ͱରͷରԠ͕औΕΔը໘ PSHBOJTNTUFNQMBUFT w ͦΕҎ֎ ࠶ར༻ੑͦ͜·Ͱߴ͘ͳ͍$PNQPOFOU -
7VFKTྑ͔ͬͨͱ͜Ζ ςϯϓϨʔτߏจ࠷ߴʂ w )5.-ɾ$44ɾ+BWBTDSJQU͕ϑΝΠϧʹ·ͱ·ΔˠಡΈ͍͢ʂ w 3FBDUͰͰ͖Δ͕ɺTUZMFEDPNQPOFOUͷಋೖඞਢ w "UPNJD%FTJHOʹԊͬͨ͜ͱͰɺελΠϧͷཧ͕ΑΓָʹʂ w λάͰͭͷཁૉ͕͖ͬͪΓׂ͞ΕΔ
w 3FBDUͰ͋Γ͕ͪͳʮ)5.-ͷதʹෳࡶͳ+BWBTDSJQU͕ࠞೖͯ͠ർฐʯ ͢Δ͜ͱ͕গͳ͍ʂ ϑϩϯτΤϯυͷ։ൃαΫαΫʂɹ݄΄ͲͰ6*΄΅ʂ -
ݪҼௐࠪ w NFUBλάͷߋ৽ॲཧ w "QQWVFͷNPVOUFE ͱ SPVUFΦϒδΣΫτͷߋ৽ͰൃՐ w هࣄϖʔδʹΞΫηεͨ͠߹ɺ λάߋ৽લͷ)5.-͕ಡ·Εͯ͠·͏
ˠॳظঢ়ଶͷNFUBλά͕γΣΞ࣌ʹөʂ export default { ... mounted() { updateConfig(this.$route); insertMetaTags(this.$route); }, watch: { '$route': function (to, from) { updateConfig(to); insertMetaTags(to); } } } 41"։ൃͷৗࣝͰʁ ΅͘ɺ"OESPJEΤϯδχΞ͠ʜ -
ରࡦ w WVFTFSWFSSFOEFSFSΛͬͨ4FSWFS4JEF3FOEFSJOH w ެࣜΨΠυIUUQTTTSWVFKTPSH w ରԠखॱ w 7VFΠϯελϯεͷॳظԽΛؔԽ w
ΫϥΠΞϯτ༻αʔόʔ༻ͷΤϯτϦϑΝΠϧΛ࡞ w αʔόʔ༻ͷόϯυϧ+40/ͷੜ w &YQSFTTKT WVFTFSWFSSFOEFSFSͰOPEFKTαʔόʔΛ࣮ -
ରԠखॱ w 7VFΠϯελϯεͷॳظԽΛؔԽ export const createApp = () => {
const router = createRouter(); const app = new Vue({ router, render: h => h(App), }); return { app, router }; }; new Vue({ router, el: '#app', components: { App }, template: '<app/>', }); CFGPSF BGUFS -
ରԠखॱ w ΫϥΠΞϯτ༻αʔόʔ༻ͷΤϯτϦϑΝΠϧΛ࡞ FOUSZDMJFOUKT FOUSZTFSWFSKT const { app, router }
= createApp(); router.onReady(() => { app.$mount('#app'); }); export default (context) => { return new Promise((resolve, reject) => { const { app, router } = createApp(); router.push(context.url); router.onReady(() => { resolve(app); }); }); }; ˞8FCQBDLͷFOUSZʹࢦఆ͢ΔϑΝΠϧ -
ରԠखॱ w αʔόʔ༻ͷόϯυϧ+40/ͷੜ w 7VF4434FSWFS1MVHJOΛՃ w ZBSOSVOXFCQBDL࣮ߦ w TFWFSCVOEMFKTPO͕ੜ module.exports
= merge(common, { ... plugins: [ ... new VueSSRServerPlugin({ filename: 'server-bundle.json', }), ], }); XFCQBDLTFSWFSKT -
ରԠखॱ w &YQSFTTKT WVFTFSWFSSFOEFSFSͰOPEFKTαʔόʔΛ࣮ TFSWFSKT const renderer = createBundleRenderer(serverBundle, {
template }); const app = express(); app.get('*', (req, res) => { const context = { ...metatags(req.path, req.query), url: req.url }; renderer.renderToString(context, (error, html) => { res.end(html); }); }); app.listen(port, () => console.log('Server start: 8080')); -
ରԠखॱ w &YQSFTTKT WVFTFSWFSSFOEFSFSͰOPEFKTαʔόʔΛ࣮ TFSWFSKT const renderer = createBundleRenderer(serverBundle, {
template }); const app = express(); app.get('*', (req, res) => { const context = { ...metatags(req.path, req.query), url: req.url }; renderer.renderToString(context, (error, html) => { res.end(html); }); }); app.listen(port, () => console.log('Server start: 8080')); લͷखॱͰੜͨ͠+40/ -
ରԠखॱ w &YQSFTTKT WVFTFSWFSSFOEFSFSͰOPEFKTαʔόʔΛ࣮ TFSWFSKT const renderer = createBundleRenderer(serverBundle, {
template }); const app = express(); app.get('*', (req, res) => { const context = { ...metatags(req.path, req.query), url: req.url }; renderer.renderToString(context, (error, html) => { res.end(html); }); }); app.listen(port, () => console.log('Server start: 8080')); NFUBλάੜؔ -
ରԠखॱ w &YQSFTTKT WVFTFSWFSSFOEFSFSͰOPEFKTαʔόʔΛ࣮ TFSWFSKT const renderer = createBundleRenderer(serverBundle, {
template }); const app = express(); app.get('*', (req, res) => { const context = { ...metatags(req.path, req.query), url: req.url }; renderer.renderToString(context, (error, html) => { res.end(html); }); }); app.listen(port, () => console.log('Server start: 8080')); DPOUFYUͱόϯυϧ+40/͔Β ΠΠײ͡ʹ)5.-ੜͯ͘͠ΕΔؔ -
·ͱΊ w 7VFKTΛٕͬͯज़ϒϩάΛࣗ࡞ͨ͠ w 8FCΞϓϦ։ൃͷϊϋෆ͕ݪҼͰԕճΓͯ͠͠·ͬͨ w 7VFKTͰͷ443ͷΈΛਂΊʹ͏͜ͱ͕Ͱ͖ͨ w 6*ͷ࣮ͰຆͲ٧·Δ͜ͱ͕ͳ͔ͬͨɺςϯϓϨʔτߏจ࠷ߴʂ w
ࠓޙͷల w /VYUKT৮ͬͯΈΔˠҠߦͳͦ͞͏ͳΒҠߦ͢Δ ٕज़ϒϩάͷ%*:ɺແݶʹݟͨ·ΔͷͰΦεεϝʂ