now と next.js の紹介
Introducing Now and Next.js౦ژNodeֶԂࡇ2016@nkzawa
View Slide
ࣗݾհ
@nkzawaZeit, Inc ॴଐnext.js ϝϯςφsocket.io ϝϯςφ
Zeit ?
nowmicrohyper (چhyperterm)next.js
Next.js
ϢχόʔαϧͳReactΞϓϦͷͨΊͷখ͞ͳϑϨʔϜϫʔΫ
Get started1. next.js ΛΠϯετʔϧ2. next ίϚϯυΛ࣮ߦ3. pages σΟϨΫτϦʹ ReactίϯϙωϯτΛฦ͢JSϑΝΠϧΛ࡞
ίϚϯυͰ͍͏ͱ$ npm install —save next$ node_modules/.bin/next$ vi pages/index.js
pages/index.jsimport React from ‘react’export default () => (Hello, world!)
ϑΝΠϧΛURLʹϚοϐϯάpages/index.js -> /pages/about.js -> /aboutpages/foo/bar.js -> /foo/bar
ࣗಈͰ͜ΕΒ͕ߦΘΕΔ• αʔόϨϯμϦϯά• ίʔυׂ + Ԇಡࠐ• ࠷৽ίʔυࣗಈ࠶ಡࠐ(hot-code reloading)• babelʹΑΔτϥϯεύΠϧ• webpackʹΑΔ݁߹
ઃఆͷඞཁͳ͔ͭ͠։ൃɺύϑΥʔϚϯεΛ࠷దԽ
SPAͰΑ͋͘Δ• ॳظද͕͍ࣔ• ϖʔδ͕૿͑Δͱॏ͘ͳΔ
Next.jsͷղܾํ๏
αʔόϨϯμϦϯάॳظදࣔύϑΥʔϚϯε্ɺSEOJSϑΝΠϧΛஔ͚ͩ͘
ϦονͳWebΞϓϦέʔγϣϯͷͨΊͷ7ͭͷݪଇhttp://yosuke-furukawa.hatenablog.com/entry/2014/11/14/141415“αʔόʔ͕ϖʔδΛϨϯμϦϯά͢ΔͷҙͰͳ͍ɻ”“tl;DR: αʔόʔϨϯμϦϯάSEO͚ͩͷͷ͡Όͳ͘ɺੑೳΛ্ͤ͞ΔͨΊͷͷͰ͢ɻʢޙུʣ”
ίʔυׂ + Ԇಡࠐϖʔδຖʹ݁߹ϑΝΠϧΛ࡞͠ɺॳظදࣔ࣌ʹෆඞཁͳϞδϡʔϧಡΈࠐ·ͳ͍ɻભҠ͕ൃੜͨ͠ॠؒʹॳΊͯɺ࣍ͷίϯϙʔωϯτΛऔಘ͠දࣔ͢ΔɻϖʔδಡΈࠐΉϞδϡʔϧ͕૿͑ͯɺଞͷϖʔδʹӨڹ͠ͳ͍ɻ
ͦͷଞͷػೳ
CSSglamor ϥΠϒϥϦΛͬͨελΠϧఆٛ- CSS-in-JS: JSͷදݱྗΛϑϧ׆༻- ίϯϙωϯτຖʹಠཱ: ύϑΥʔϚϯεతʹଞϖʔδӨڹͳ͠- vendor prefix ࣗಈ༩ͷαϙʔτ
import React from 'react'import css from 'next/css'const style = css({background: ‘red’,':hover': {background: 'gray'},'@media (max-width: 600px)': {background: 'blue'}})export default () => hi!
Link ίϯϙʔωϯτpushState ΛͬͨϖʔδભҠ
import React from 'react'import Link from 'next/link'export default () => (͜͜ΛΫϦοΫ)
Head ίϯϙʔωϯτheadλάͷࢠཁૉΛߋ৽
import React from 'react'import Head from 'next/head'export default () => (λΠτϧhi)
getInitialPropsτοϓϨϕϧίϯϙωϯτͷ props Λฦ͢staticϝιουΛఆٛ
IsomorphicʹσʔλΛऔಘ͢Δྫimport React from ‘react'import 'isomorphic-fetch'export default class extends React.Component {static async getInitialProps () {// CORS͕༗ޮͳAPIʹαʔόɺΫϥΠΞϯτํ͔ΒΞΫηεconst res = await fetch(‘http://api.example.com/user/123’)const user = await res.json()return { user }}render () {return hi, {this.props.user.name}!}}
ٞதͷIssue- Θ͔Γ͍͢URLͷ࣮ݱ /users/123- babel, webpack ͷΧελϚΠζৄ͘͠:https://github.com/zeit/next.js#future-directions
Ұ୴·ͱΊReactΛ͍ͬͯΕ͙͢ʹ͑ΔNext.jsϑϩϯτΤϯυ։ൃΛָʹ͠·͢!
now
ΠϛϡʔλϒϧͳσϓϩΠαʔϏε
Get started1. now ΛΠϯετʔϧ2. now ίϚϯυΛ࣮ߦ͢Δ3. ॳճͷΈϝʔϧʹΑΔϩάΠϯೝূ
ίϚϯυͰ͍͏ͱ$ npm install -g now$ now
package.json{“name”: “app”“scripts”: {“start”: “node server.js”}}
ϙʔτΛҰͭͪड͚Δconst http = require(‘http’)http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': ‘text/plain' })res.end(‘Hello, world’)}).listen(3000, () => {console.log(‘Ready!’)})
ඞཁͳͷ npm start ͷఆٛͷΈͲͷϙʔτΛlistenͯ͠Α͍
શͯͷΞϓϦɺ͜ͷΑ͏ʹಈ࡞͢Δ• ৗʹHTTPS• ඪ४ͰHTTP/2αϙʔτ• Φʔτεέʔϧ• Πϛϡʔλϒϧ
ΠϛϡʔλϒϧɾσϓϩΠσϓϩΠ͢Δຖʹ৽͍͠URL͕࡞͞ΕΔɻྫ͑: my-app-erkgfjtrna.now.shݹ͍URLআ͠ͳͯ͘Α͍ɻӬٱʹଘࡏ͠ଓ͚Δɻ
ຊ൪ެ։͢Δ࣌ʹɺΘ͔Γ͍͢ΤΠϦΞεɾυϝΠϯΛઃఆ$ now alias my-app-erkgfjtrna.now.sh my-app.now.sh
• URL͕ৗʹಉ͡ΞϓϦͷঢ়ଶΛද͢• ߋ৽ϩʔϧόοΫ͕Ұॠ• εςʔδϯάڥ͕ඞཁͳ͘ͳΔͳͲͷར
ΦʔτεέʔϧτϥϑΟοΫϦιʔεͷมԽʹԠͯ͡ɺΠϯελϯεΛ૿ݮτϥϑΟοΫΛෛՙࢄ
θϩͷεέʔϧ͠Β͘τϥϑΟοΫ͕ͳ͍߹ɺΠϯελϯε͕θϩʹͳΔ࠶ͼΞΫηε͕͋Εɺ৽ͨʹΠϯελϯε্ཱ͕͕ͪΔ
σʔλͷӬଓԽΠϯελϯε͕ࣗಈͰੜɺഁغ͞ΕΔͨΊ෦ʹσʔλΛͤͳ͍ΘΓʹ compose.com ͳͲͷΫϥυɾετϨʔδαʔϏεΛ͏
Dockerfile αϙʔτpackage.json ͷΘΓʹ Dockerfile Λ༻ҙͯ͠ɺ$ nowͲΜͳݴޠͰॻ͔ΕͨΞϓϦσϓϩΠՄೳ
੩తαΠταϙʔτhtmlϑΝΠϧը૾ͳͲͷΞηοτΛ༻ҙͯ͠ɺ$ nowࣗಈͰ੩తαΠτ͔Ͳ͏͔ผ͞ΕΔ
ଞʹ• Now.app: σεΫτοϓɾΫϥΠΞϯτ• zeit.world: Free DNS αʔϏε• now secret: γʔΫϨοτͷཧ
ϚΠΫϩαʔϏεmicro ϥΠϒϥϦΛͬͨϢʔεέʔεhttps://github.com/zeit/micro
microΛͬͨαʔό࣮const { json } = require(‘micro’)module.exports = async (req, res) => {// ϦΫΤετϘσΟͷऔಘconst body = await json(req)console.log(body.data)// Ϩεϙϯεreturn { message: ‘ok’ }}
package.json{“name”: “foo”,“scripts”: {“start”: “micro”},“dependencies”: {“micro”: “*”}}
σϓϩΠ & ΤΠϦΞεઃఆ$ now$ now alias foo-uiafeuzauf.now.sh foo.now.sh
ϚΠΫϩαʔϏε܈Λ࡞foo.now.shbar.now.shbaz.now.sh…
API GatewayͰ·ͱΊΔapi.my-app.com/foo -> foo.now.shapi.my-app.com/bar -> bar.now.shapi.my-app.com/baz -> baz.now.sh…
Serverless ʹ͍ۙੑ࣭(αʔόཧෆཁɺΦʔτεέʔϧɺؔɺ୯Ұͷؔ৺ࣄ)ʴjust HTTP(no ϩοΫΠϯ)
·ͱΊnow σϓϩΠΛγϯϓϧ͢Δ˚ Zeit Node.JSΤίγεςϜʹߩݙ͍͖ͯ͠·͢