Accueil
Explorer
Soumettre la recherche
Mettre en ligne
S’identifier
S’inscrire
Publicité
Check these out next
Node.js Hands-On
Akinari Tsugo
Node.jsではじめるサーバ構築
AimingStudy
jQueryを中心としたJavaScript
hideaki honda
Node.js で Web アプリ開発
Tatsumi Naganuma
Sails.jsのメリット・デメリット
Ito Kohta
いまさら聞けない!?Backbone.js 超入門
Kohei Kadowaki
React.js + Reduxで作るSPA
Shohei Saeki
Rubyで始めるWebスクレイピング
Takuro Sasaki
1
sur
64
Top clipped slide
Vue.js 2.0 で自社プロダクトを SPA + SSR 化した話
27 May 2017
•
0 j'aime
15 j'aime
×
Soyez le premier à aimer ceci
afficher plus
•
21,244 vues
vues
×
Nombre de vues
0
Sur Slideshare
0
À partir des intégrations
0
Nombre d'intégrations
0
Télécharger maintenant
Télécharger pour lire hors ligne
Signaler
Technologie
2017.05.27 の 初夏の JavaScript 祭 in mixi でお話した時のスライドです。
Yutaro Miyazaki
Suivre
Publicité
Publicité
Publicité
Recommandé
ライオンでも分かるVuejs
lion-man
8K vues
•
26 diapositives
React Redux Redux-Saga + サーバサイドレンダリング
エンジニア勉強会 エスキュービズム
17K vues
•
42 diapositives
React系(別言語含む)の サーバーサイドレンダリング について考えよう
Kazuhiro Hara
7.7K vues
•
29 diapositives
Node.jsで始める Modern JavaScript Framework
kamiyam .
2.7K vues
•
41 diapositives
Hello, Node.js
Shin Sekaryo
1.4K vues
•
39 diapositives
RailsでReact.jsを動かしてみた話
yoshioka_cb
4.7K vues
•
37 diapositives
Contenu connexe
Présentations pour vous
(20)
Node.js Hands-On
Akinari Tsugo
•
1.8K vues
Node.jsではじめるサーバ構築
AimingStudy
•
3.4K vues
jQueryを中心としたJavaScript
hideaki honda
•
16.8K vues
Node.js で Web アプリ開発
Tatsumi Naganuma
•
2.3K vues
Sails.jsのメリット・デメリット
Ito Kohta
•
2.6K vues
いまさら聞けない!?Backbone.js 超入門
Kohei Kadowaki
•
21.2K vues
React.js + Reduxで作るSPA
Shohei Saeki
•
2.1K vues
Rubyで始めるWebスクレイピング
Takuro Sasaki
•
34.7K vues
Nodeにしましょう
Yuzo Hebishima
•
294 vues
Node.jsに縁のない職場でnode.jsを使い始める戦術
Isamu Suzuki
•
5.7K vues
Nodeとフロントエンド − 知っておかなければならない、今と未来の話 −
Kohei Asai
•
16.3K vues
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
Yusuke Murata
•
12.2K vues
Node.js を選ぶとき 選ばないとき
Ryunosuke SATO
•
83.1K vues
Capybaraで雑にWebスクレイピング
Koji Nakamura
•
1.5K vues
なぜ人は必死でjQueryを捨てようとしているのか
Yoichi Toyota
•
80.1K vues
React + FLUX + Redux + Redux Saga のお話
Shinichiro Yoshida
•
34.3K vues
Node js 入門
Satoshi Takami
•
82.6K vues
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Kazuhiro Hara
•
3.7K vues
Google Web Toolkit(GWT)入門
Yuki Naotori
•
990 vues
One Time Binding & Digest Loop
Kon Yuichi
•
5.8K vues
Similaire à Vue.js 2.0 で自社プロダクトを SPA + SSR 化した話
(20)
我が家のフロントエンド開発事情
Naoki Yamada
•
3.9K vues
Riot.jsを用いたweb開発 takusuta tech conf #1
Keisuke Imai
•
22.4K vues
【Web TECH FORUM 2017 in大阪】Webシステム開発とJavaScript UIコンポーネント
ツール事業部 グレープシティ株式会社
•
482 vues
Service workerとwebプッシュ通知
zaru sakuraba
•
3.7K vues
AngularJS x Chrome Apps (2014.08.23 #gdgkobe event)
pinmarch_t Tada
•
1.4K vues
第12回rest勉強会 これまでの補足・展望編
ksimoji
•
1.6K vues
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
慎二 山田
•
1.1K vues
React.js + Flux
dsuke Takaoka
•
18.3K vues
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
WESEEKWESEEK
•
252 vues
Vue.js Outline
Kei Yagi
•
324 vues
Web開発初心者がReactをチームに導入して半年経った
kazuki matsumura
•
684 vues
Interoperability of webassembly with javascript
Takao Tetsuro
•
214 vues
JavaScript(AngularJS・React.js)で作る iOS・Androidアプリハンズオン
Kazuhiro Yoshimoto
•
604 vues
アメブロ2016 アメブロフロント刷新にみる ひかりとつらみ
Kazunari Hara
•
6.6K vues
なるほどわかった!App Service on Linux
Yasuaki Matsuda
•
3.2K vues
フロントエンド技術の変遷
Ryo Higashigawa
•
134 vues
React.jsでサービスを作ってみた話
GIG inc.
•
2.2K vues
React.js・ReactNative・Redux入門
Kazuhiro Yoshimoto
•
8.6K vues
Web Component Framework Urushiのご紹介(OSC2017 Tokyo/Spring)
YuzoHirakawa
•
2.4K vues
Vue Fes Japan 2018 LINE株式会社 LunchスポンサーLT
LINE Corporation
•
4.5K vues
Publicité
Dernier
(20)
SoftwareControl.pdf
ssusercd9928
•
6 vues
3Dプリンタって いいね
infinite_loop
•
33 vues
JSTQB_テストプロセスの概念モデル.pdf
akipii Oga
•
178 vues
Forguncy製品概要.pptx
フォーガンシー
•
50 vues
JSONEncoderで詰まった話
とん とんぼ
•
65 vues
Forguncy8 製品概要 202305.pptx
フォーガンシー
•
54 vues
《杨百翰大学毕业证|学位证书校内仿真版本》
d520dasw12
•
2 vues
SoftwareControl.pdf
ssusercd9928
•
15 vues
20230516 @Mix Leap Hirohiko_Suwa
Masashi Nakagawa
•
90 vues
Omnis
DaisukeFujita10
•
15 vues
ネットワークパケットブローカー市場.pdf
HinaMiyazu
•
7 vues
AIEXPO_CDLE名古屋紹介
KotaMiyano
•
3 vues
TestSIP (1).pdf
DeependraSingh712859
•
2 vues
MC-800DMT intrusion detector manual
Vedard Security Alarm System Store
•
2 vues
【2023年5月】平成生まれのためのUNIX&IT歴史講座
法林浩之
•
16 vues
留信网认证可查【皇家霍洛威学院文凭证书毕业证购买】
32lkhng
•
2 vues
統計学の攻略_推測統計学の考え方.pdf
akipii Oga
•
182 vues
☀️【卡尔顿大学毕业证成绩单留学生首选】
15sad
•
2 vues
Üslup ve tercüme.pdf
1Hmmtks
•
2 vues
【DL輪読会】大量API・ツールの扱いに特化したLLM
Deep Learning JP
•
15 vues
Vue.js 2.0 で自社プロダクトを SPA + SSR 化した話
初夏のJavaScript 祭in mixi Vue.js
2.0 で自社プロダクトを SPA + SSR 化した話
Yutaro Miyazaki (@vwxyutarooo) ニート↓ フリーランス(Web制作)↓ アプリ屋のWeb(フロントエンド)
今日話すこと 導入してみてどうだった?ってとこ 地味に困ったこと
今日話さないこと Vue.jsSSRのしくみ、ロジックなど 他フレームワークとの比較
サービスの概要 マンガ無料配信サービス アプリを主軸に展開しているサービス Webでもコンテンツを活かそう
リニューアルと導入の背景 Web経験者無しでv1を作ってしまった イケてない
Webでももっとこう アプリっぽい体験できないですかね
v1:Riotでページ毎にマウント →SPA クライアントレンダリング →SSR(SEOほんとにいいのか?) Vue.jsの評判がいい どっかの調査で満足度1位
構成 (全体)
構成 (Web)
前提知識
vuejs/vue‑hackernews‑2.0 公式が作るSPA+SSRプロジェクト https://github.com/vuejs/vue‑hackernews‑2.0
Webpack の例 https://ssr.vuejs.org
地味に悩んだポイント集
SSRは誰がやる? 404ハンドリング デバイス切り替えってどうする? 共通処理どうする? メタタグの管理めんどいやりたくない Analyticsどうしよう? 広告 メモリリーク
Q: SSR は誰がやる?
バックエンドからもJSが起動できる go go‑duktape goja+goja‑node
素直にExpressから起動することに
Q: 404 ハンドリング
vue‑hackernews2では ルータ設定にマッチするページが見つからなければ Expressが404返すようになってる
if (err &&
err.code === 404) { res.status(404).end('404 | Page Not Found') }
404ページのデザイン欲しい // router.js [ { path:
'/', name: 'top', component: top }, ... { path: '*', name: 'not-found', component: notFound } ]
// server.js const termRoute
= (context.state.route.name === 'not-found'); if (termRoute) res.status(404);
ルータにマッチするけど404の時は? // router.js { path:
'/comics/tag/:id', name: 'tag-archive', component: tagArchive },
APIリクエスト時に、メインクエリを設定 // preFetch const options
= { isMainQuery: (key === mainQueryKey) }
メインクエリのAPIレスポンスが 200じゃなかったらstateにエラーをセット // action.js if (result.status
=== 200) { commit(mutation, { key, result: result.data }); } else if (options.isMainQuery) { commit(types.SET_STATUS, { key: type, value: {} }); commit(types.SET_STATUS, { key: 'error', value: result.status // 404 }); }
Expressサーバで、コンテキストを通じて stateのエラーからステータスを打つ // server.js const termState
= (context.state.error); // 404 | 50x if (termState) res.status(context.state.error);
ちょっとイケてないけど 対象Viewコンポーネント内でnotfoundを表示させた <div :key="`tag-archives-${id}-${currentPage}`"> <div v-if="isLoading"
class="l-root"> <screen-spinner></screen-spinner> </div> <content-not-found v-else-if="status === 404"></content-not-found> <template v-else="v-else"> ... </template> </div>
Q: デバイス切り替えってどうする?
PC/SP用エントリーポイントをそれぞれ用意 // webpack.config.client.js entry: { 'polyfills':
[path.join(..., 'app/entry/polyfills.js')], 'vendor': [path.join(..., 'app/entry/vendor.js')], 'app.pc': [path.join(..., 'app/entry/pc/client-entry.js')], 'app.sp': [path.join(..., 'app/entry/sp/client-entry.js')] }, // webpack.config.server.js entry: { 'server-bundle.pc': path.join(..., 'app/entry/pc/server-entry.js'), 'server-bundle.sp': path.join(..., 'app/entry/sp/server-entry.js') }
テンプレートも2つ // webpack.config.client.js new HTMLPlugin({ template:
path.join(..., 'templates/pc.html'), filename: 'index.pc.html', excludeChunks: ['app.sp'] }), new HTMLPlugin({ template: path.join(..., 'templates/sp.html'), filename: 'index.sp.html', excludeChunks: ['app.pc'] }),
createRendererでレンダラを2つ作成 // server.js const bundle
= { pc: fs.readFileSync(resolve('./dist/js/server-bundle.pc.js'), 'utf-8'), sp: fs.readFileSync(resolve('./dist/js/server-bundle.sp.js'), 'utf-8') } const template = { pc: fs.readFileSync(resolve('./dist/index.pc.html'), 'utf-8'), sp: fs.readFileSync(resolve('./dist/index.sp.html'), 'utf-8') } renderer = { pc: createRenderer(bundle.pc, template.pc), sp: createRenderer(bundle.sp, template.sp) };
ExpressでUA判定して起動するレンダラを切り替え // server.js const useragent
= require('express-useragent'); ... app.use(useragent.express()); app.get('*', (req, res) => { ... const device = (req.useragent.isMobile) ? 'sp' : 'pc'; ... renderer[device].renderToStream(context)... }
2.3.0からcreateRenderer にバンドル突っ込むのは非推奨に...
別の方法を考え中
Serverバンドルはエントリーポイント分けず contextにデバイス情報渡して切り替えるのもありか?
Q: 共通処理どうする?
vuejs/vue-class-component もともとTypeScriptで書けるようにするため Classでコンポーネントを定義できる 継承は非対応だが、Decoratorと組み合わせる
import Vue from
'vue' import Component from 'vue-class-component' @Component({ props: { propMessage: String } }) export default class App extends Vue { // initial data msg = 123 // use prop values for initial data helloMsg = 'Hello, ' + this.propMessage // lifecycle hook mounted () { this.greet() } ... }
import { createDecorator
} from 'vue-class-component'; export const Options = createDecorator((options) => { Object.assign(options, { ... watch: { // call again the method if the route changes '$route': 'routeUpdated' } }; });
使い方は君しだい!
Q: メタタグの管理めんどいやりたくない
declandewet/vue-meta
export default { name:
'App', metaInfo: { title: METAINFO.title, titleTemplate: METAINFO.titleTemplate, meta: [ { vmid: 'og:title', name: 'og:title', content: METAINFO.title }, { vmid: 'description', name: 'description', content: METAINFO.description } ... ] } }
コンポーネントの深いやつが勝つ 全コンポーネント検査してるからパフォーマンスは疑問 SSR対応(Vueの公式にも例あり)
Q: Analytics どうしよう?
WebAnalytics:MatteoGabriele/vue-analytics AppAnalytics:ScreamZ/vue-analytics
routerとくっつけて自動でPV|SV送れる
Q: 広告
GoogleAdsenseはSPA非対応
ページのリフレッシュ無しに広告を打ち直すことは禁止 impが絶望的 GoogleAdsense以外のSSP等広告運用が必須
Q: メモリリーク
起こしてた
1日でメモリを食い尽くし ガベージコレクション走りまくり、CPU回りまくり APIキャッシュ周りが原因 最新のVuehackernewsでは直ってる
所感
SSR の実装はそれほど大変ではないのかも 普通にSPAを作る+ちょっとの手間でいい メタタグとかアプリケーション側で扱いたいからついでに SSRしちゃってたり
まあまあ安定稼働もする CPUはそこそこ回るためページキャッシュを併用 コンポーネントキャッシュは考えて設計すべし 状態変化によるケースやslotが多いと効果的ではないかも?
KPI 的には PV/セッション上がり 滞在時間は平行 回遊しやすくなってるって思いたい なんか下がることはなかった
まとめ あり SEO対策としてだけやるなら要らない メタタグさえサーバ側で作れていれば 堅いこと言わずに作ってみようぜ
Vue.js 楽しいな! おい!!
ありがとうございました!
Publicité