Slide 1

Slide 1 text

React のSSR をAWS Lambda 上の Express でServerlessFramework 使っ て簡単に(?) 実装できた話 Web アプリ 勉強会(FE/BE) in Prototype-cafe Vol.1 (2019/03/19 ) 1

Slide 2

Slide 2 text

⾃⼰紹介 Twitter: @kam1nchu 職種: フロントエンドエンジニア ⾔語: JavaScript, Java 最近: AWS ばかり触ってます 2

Slide 3

Slide 3 text

みなさんSSR してますか? 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

ではなくて 5

Slide 6

Slide 6 text

サーバーサイドレンダリング(SSR) とは 少なくとも私たちWeb デベロッパーのここ数年の⽂脈においては、 「( 元々ブラウザ上でしか動かなかった)JavaScript をサーバー内部で実 ⾏して、HTML を⽣成すること」を指します。 出典: ユーザー体験を向上させるサーバーサイドレンダリング JavaScript — 歴史と利点 6

Slide 7

Slide 7 text

サーバーサイドレンダリング(SSR) とは 今まで SPA などでは、bundle されたjs をロードし終わるまで、ブラウザに view が表⽰されなかった。 SSR 使うと 事前にある程度レンダリングしたHTML を返しておくことで、初期表 ⽰にかかる時間を短縮できる。 7

Slide 8

Slide 8 text

でもSSR って結構⼤変? 8

Slide 9

Slide 9 text

結構簡単( サーバー) react-dom/server の renderToString などが、component から⽂字列を くので、それをExpress でresponse.send すればサーバ側はおしまい。 import * as Express from "express"; import * as React from 'react'; import { renderToString } from 'react-dom/server'; import Component from "component"; const app = Express(); app.get("/", function (req, res) { res.send(renderToString()); }); // ... 9

Slide 10

Slide 10 text

結構簡単( クライアント) サーバ側のレンダリングだけだと、React のsetState などのjs 使った処 理ができないので、クライアント側もロードさせる。 ※サーバ側でレンダリングされたDOM が再利⽤される import * as React from 'react'; import * as ReactDOM from 'react-dom'; import Component from "component"; ReactDOM.hydrate( , document.getElementById('root') ); // ... 10

Slide 11

Slide 11 text

え、Express を使うの 11

Slide 12

Slide 12 text

Express ダルい... js 動かすので、少なくともnodejs は必要 nodejs って管理が結構⼤変 12

Slide 13

Slide 13 text

AWS Lambda 13

Slide 14

Slide 14 text

Express on Lambda aws-serverless-express や serverless-http を使うと割と難なく⾏ける import serverless from "serverless-http"; import * as Express from "express"; const app = Express(); app.get("/", function (req, res) { res.send("hello"); }); exports.handler =serverless(app); 14

Slide 15

Slide 15 text

Lambda 使うメリット フルマネージドなので管理いらず ~~( いらないとは⾔っていない)~~ Lambda はとてもスケールできる CloudFront やRoute53 など活⽤できる 15

Slide 16

Slide 16 text

AWS のデプロイって⼤変では? 16

Slide 17

Slide 17 text

AWS のデプロイ ServerlessFramework 使えば、とても簡単にデプロイできる plugins: - serverless-webpack provider: name: aws runtime: nodejs8.10 functions: app: handler: app.handler events: - http: method: ANY path: "{proxy+}" 17

Slide 18

Slide 18 text

他いろいろ TypeScript 使うととても捗る(serverless のテンプレートあります) react-router 使うと、クライアントとサーバのルーティングが共通 化できて便利 その時はExpress で app.get("*", () => {}) するといい API-Gateway のステージには注意( パスを上⼿に書かないと詰む) Redis やmemcached でレンダリング結果をキャッシュすることもで きるらしい 18

Slide 19

Slide 19 text

時間があったらデモ 19

Slide 20

Slide 20 text

おわり 20