SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
Vue.jsTokyov‑meetup#5
秋
Q.秋といえば?
A.読書の秋
Q.Vue.jsで作られたSPASSRな
電子書籍(マンガ)配信サービスは?
A.マンガZERO
Nuxt無しで作ってしまった
恨み辛み妬み
Vue.jsTokyov‑meetup#5
Nuxt less SPA SSR で乗り越えるべきnの壁Nuxt less SPA SSR で乗り越えるべきnの壁
const n = 5;
構成構成
SPAofVue.js+Vuex
SSRbyExpress
DeviceswitchingbetweenPC/SP
BackendasAPIbyGo
vue‑hackernews‑2.0頼み
1の壁: メタタグ1の壁: メタタグ
SSR対応
Fetchの結果から動的に扱えること
手間がかからないこと
declandewet/vue‑metadeclandewet/vue‑meta
メタタグ吐く
SSR対応
公式ドキュメントにも載ってる
export default {
metaInfo() {
let metaBase = {
title: this.title,
meta: [
{
vmid: 'og:title',
property: 'og:title',
content: this.title
},
{
vmid: 'description',
name: 'description',
content: this.description
},
...
],
link: [
{
vmid: 'canonical',
rel: 'canonical',
href: this.canonical
}
]
};
if (this.prev) {
metaBase.link.push({
rel: 'prev',
href: 'https://manga-zero.coroco3.com' + this.prev
});
}
// server.js
.on('beforeStart', () => {
const { title, link, meta } = context.meta.inject();
context.head = (context.head || '') + title.text() + meta.text() + link
})
Nuxtにも入ってる
2の壁: Google Analytics2の壁: Google Analytics
非SPAのPVと同じになること
手間がかからないこと
MatteoGabriele/vue‑analyticsMatteoGabriele/vue‑analytics
SSR対応
vue‑routerと同期し自動でPVを送ってくれる
// router.js
Vue.use(Router);
Vue.use(Meta);
if (process.env.VUE_ENV === 'client') {
Vue.use(VueAnalytics, {
id: 'UA-xxxxxxxx-xx',
router,
ready() {
const ga = window.ga || {};
ga('require', 'linkid');
ga('set', 'dimension1', val);
}
});
}
export default router;
イベントとか送るのもちょっと楽
this.$ga.event('グローバル', 'メニュータップ', '', 0, {
nonInteraction: true
});
Appanalyticsを使うならScreamZ/vue‑analytics
あるのかよ
3の壁: デバイス切り替え3の壁: デバイス切り替え
同一Expressから配信したい
Storeとか共通で使いたい
手間がかからないこと
デバイス切り替ェ
WebpackのMultiCompileでいける...
デバイス切り替ェ
// webpack.config.server.js
{
...
plugin: [
...
new VueSSRServerPlugin({
filename: 'sp/vue-ssr-server-bundle.json'
})
]
...
},
{
...
plugins: [
...
new VueSSRServerPlugin({
filename: 'pc/vue-ssr-server-bundle.json'
})
]
...
}
デバイス切り替ェ
const template = {
pc: fs.readFileSync(resolve('./src/app/templates/pc.html'), 'utf-8'),
sp: fs.readFileSync(resolve('./src/app/templates/sp.html'), 'utf-8')
};
デバイス切り替ェ
// srever.js
if (!isDevelop) {
const bundle = {
sp: require('./dist/sp/vue-ssr-server-bundle.json'),
pc: require('./dist/pc/vue-ssr-server-bundle.json')
};
const clientManifest = {
sp: require('./dist/sp/vue-ssr-client-manifest.json'),
pc: require('./dist/pc/vue-ssr-client-manifest.json')
};
renderer = {
sp: createRenderer(bundle.sp, { clientManifest: clientManifest.sp },
pc: createRenderer(bundle.pc, { clientManifest: clientManifest.pc },
};
} else {
readyPromise = setupDevServer(app, (bundle, options) => {
renderer = {
sp: createRenderer(bundle.sp, options, template.sp),
pc: createRenderer(bundle.pc, options, template.pc)
};
});
}
webpack.config.client.js も同様
dev‑middlewareとhot‑middlewareも同様
デバイス切り替ェ
// server.js
function render(req, res) {
...
const device = (req.useragent.isMobile) ? 'sp' : 'pc';
const context = { url: req.url, device };
renderer[device].renderToStream(context)
...
}
流石に無いよな... ?
4の壁: 他民族4の壁: 他民族
国内ではまだ若干弱め
1.0の時のイケてない印象
手間がかからないこと
☝ Angularぽく書けるよ ☝
vue‑class‑componentvue‑class‑component
TSでいい感じに書ける
ESでも使える
Angularぽく書けるイメージ
import Vue from 'vue';
import Component from 'vue-class-component';
@Component({
name: 'component-hoge',
metaInfo: { ... },
proprs: { ... }
})
export default class ComponentHoge extends Vue {
// initial data
msg = 123;
// lifecycle hook
mounted () {
this.greet();
}
// computed
get computedMsg () {
return 'computed ' + this.msg;
}
// method
greet () {
alert('greeting: ' + this.msg);
}
}
他民族においても他民族においても
直帰率の低下⬆⬆⬆
リテンションの底上げ⬆⬆⬆
布教にも貢献
親クラス作って継承したり
vue‑class‑component/createDecoratorvue‑class‑component/createDecorator
デコレータを作れる
例えばPC/SP間で
殆ど同じだけど微妙に異なる(Propsとか)
コンポーネントを沢山作る時
同じ:Template,Style,Props
違う:Method,Computed
import Vue from 'vue';
import createDecorator from 'vue-class-component';
function ComponentTopDefault() {
return createDecorator((options) => {
options = object.assign({}, {
name: 'view-top',
props: {
hoge: {
...
}
}
}, options);
});
}
@Component()
@ComponentTopDefault()
export default class ViewTop extends Vue {}
metaInfoとかproprsとか
Mixinはちょっと違うなってものを
createDecratorで定義した
v5.0.2でこの使い方はできなくなった
次の日にはPRできてた
Nuxt関係ない
5の壁: HTTP Status5の壁: HTTP Status
状況に合わせたHTTPステータスが打てる
404デザインがVueでレンダリングできる
手間がかからない
vue‑hackernews‑2.0の404は
さすがにこれはない
のでやってみた
Router にマッチしなかった時Router にマッチしなかった時
/unkounko
Router にマッチしなかった時Router にマッチしなかった時
/unkounko
// router
[
...
{ path: '*', name: 'not-found', component: notFound }
]
// server.js
.once('data', () => {
if (context.state.route.name === 'not-found') res.status(404);
})
API のステータスからAPI のステータスから
/product/999999
// store/action.js
export const FETCH_ITEMS = ({ commit }, { path, key, type }) => {
return fetchItem(path, key).then((result) => {
if (result.status === 200) {
...
} else if (result.mainQuery) {
/* ↑ メインクエリに値する API のレスポンスが200 じゃない時 ↑ */
/* ↓ state に error コードをセットする ↓ */
commit(types.SET_STATUS, { key: 'error', value: result.status });
} else {
...
}
}).catch((error) => {
console.error('catch FETCH_ITEMS', error);
});
};
API のステータスからAPI のステータスから
// server.js
.once('data', () => {
const termState = (context.state.error && context.state.error !== 0);
if (context.state.error !== 0) {
res.status(context.state.error);
}
})
Nuxtだと
でいいらしい
async fetch({ store, route, app, error }) {
let url = `/api/${route.params.id}`
let data = await app.$axios.$get(url)
if (data.items.length === 0) {
// there's no data this should be a 404
// No! there is no Content so throw `204 No Content` response:
// https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Succes
error({statusCode: 204, message: "The server successfully processed t
}
store.commit('item', data.Items[0])
}
結論結論
色々頑張ったけど...
もしかしてNuxt使えば楽なの ?
最後に最後に
お前誰?
Yutaro Miyazaki (@vwxyutarooo)Yutaro Miyazaki (@vwxyutarooo)
ニート↓
フリーのWeb屋↓
アプリ屋のフロントエンド
Dvorak+Vimに悩んでいる
ありがとうございましたありがとうございました

Weitere ähnliche Inhalte

Was ist angesagt?

WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.jsyomotsu
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Toshiro Shimizu
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.jsKei Yagi
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + VuexKei Yagi
 
-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろう-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろうnico0927
 
enchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorialenchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 TutorialRyo Shimizu
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップYasuhito Yabe
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)Ryuma Tsukano
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Kei Yagi
 
Brush up your Coding! 2013 winter
Brush up your Coding! 2013 winterBrush up your Coding! 2013 winter
Brush up your Coding! 2013 winterShogo Sensui
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with BrowserifyMuyuu Fujita
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門Yohta Kanke
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話terurou
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術Y Watanabe
 

Was ist angesagt? (20)

WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.js
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.js
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + Vuex
 
-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろう-入門- enchant.js でゲームを作ろう
-入門- enchant.js でゲームを作ろう
 
Vue.js入門
Vue.js入門Vue.js入門
Vue.js入門
 
enchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorialenchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorial
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
 
HTML5 on ASP.NET
HTML5 on ASP.NETHTML5 on ASP.NET
HTML5 on ASP.NET
 
One night Vue.js
One night Vue.jsOne night Vue.js
One night Vue.js
 
Brush up your Coding! 2013 winter
Brush up your Coding! 2013 winterBrush up your Coding! 2013 winter
Brush up your Coding! 2013 winter
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with Browserify
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術
 

Ähnlich wie Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁

13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めようAdvancedTechNight
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azureKeiji Kamebuchi
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Shotaro Suzuki
 
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>Eucen Stew
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -Hayato Mizuno
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編Daiyu Hatakeyama
 
Cloudstack networking の内側
Cloudstack networking の内側Cloudstack networking の内側
Cloudstack networking の内側Hiroaki Kawai
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
Node.js勉強会 Framework Koa
Node.js勉強会 Framework KoaNode.js勉強会 Framework Koa
Node.js勉強会 Framework Koakamiyam .
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!Midori Oge
 
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成Kiyoshi Sawada
 
Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例侑亮 原田
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 

Ähnlich wie Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁 (20)

13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
 
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
 
Cloudstack networking の内側
Cloudstack networking の内側Cloudstack networking の内側
Cloudstack networking の内側
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Node.js勉強会 Framework Koa
Node.js勉強会 Framework KoaNode.js勉強会 Framework Koa
Node.js勉強会 Framework Koa
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!
 
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Vue.js で XSS
Vue.js で XSSVue.js で XSS
Vue.js で XSS
 
Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 

Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁