λ°μ μν΄λ‘ λμ μν΄λ‘ ν΄λΌμ΄μΈνΈλ₯Ό μ§μ μ¬μ©ν λ ν΄λ‘ ν΅ν©μ΄ ν¨μ¬ μ½λ€λ κ²μ΄ λ°νμ‘μ΅λλ€.
μ½λλ λ€μκ³Ό κ°μ΅λλ€. https://github.com/nmaro/apollo-next-example
κ·Έλ¦¬κ³ μ¬κΈ° μ€ν μ€μΈ λ²μ μ΄ μμ΅λλ€(μ μ΄λ graphql μλ²λ₯Ό μ¨λΌμΈ μνλ‘ μ μ§νλ ν): https://apollo-next-example-oslkzaynhp.now.sh
κ΄λ ¨ μΈλΆ μ 보λ λ€μκ³Ό κ°μ΅λλ€.
μν΄λ‘.js
import ApolloClient, {createNetworkInterface} from 'apollo-client'
export default new ApolloClient({
networkInterface: createNetworkInterface({
uri: GRAPHQL_URL
})
})
κ·Έλ° λ€μ νμ΄μ§μμ
import React from 'react'
import gql from 'graphql-tag'
import 'isomorphic-fetch'
import apollo from '../apollo'
import Link from 'next/link'
const query = gql`query {
posts {
_id
title
}
}`
export default class extends React.Component {
static async getInitialProps({req}) {
return await apollo.query({
query,
})
}
render() {
...
}
}
λͺ κ°μ§ κ΄μ°° μ¬ν: μ΄ μ κ·Ό λ°©μμ λ°μνλ λͺ¨λ graphql 쿼리λ₯Ό λ‘λνκΈ° μν΄ κ΅¬μ± μμμ κΉμ΄ λ€μ΄κ°μ§ μμ΅λλ€(λ°μ μν΄λ‘λ‘ μλ² μΈ‘μ νμ±νν μ μλ κ²).
λλ μ΄κ²μ΄ next.jsμμ μ½κ° λ¬Έμ κ° μλ€κ³ μκ°ν©λλ€. ν΄λΌμ΄μΈνΈμ μλ² μΈ‘ λͺ¨λμμ λ°μνκΈ°λ₯Ό μνλ€λ©΄ κ΅¬μ± μμ κ³μΈ΅ ꡬ쑰μμ λ°μ΄ν°λ₯Ό κΉμμ΄ λ‘λν μλκ° μλλλ€. λ°μ΄ν°λ₯Ό λ‘λν μ§μ μ λ£¨νΈ κ΅¬μ± μμμ getInitialPropsμ νλλ§ μμ΅λλ€. μ΄κ²μ΄ λ―Έλμ λ°λμ§λ λͺ¨λ₯΄κ² μ§λ§, κ·Έλ μ§ μλ€λ©΄ μ°λ¦¬λ ν΄μΌ ν κ²μ λλ€.
λ κ²½μ° λͺ¨λ μμ μ κ·Ό λ°©μμ getInitialPropsμ λ‘λλλ λ°μ΄ν°μ μ ν©ν΄μΌ ν©λλ€.
κ·Έλ¦¬κ³ μΌλΆ ν΅μ¬ κ°λ°μκ° μ΄κ²μ μ’μνλ€λ©΄ μμ λ‘ ν 리νμ€νΈλ₯Ό μμ±ν μ μμ΅λλ€.
루νΈμμλ§ νΈμΆλλ getInitialPropsμ λν΄μλ https://github.com/zeit/next.js/issues/192λ₯Ό μ°Έμ‘°νμΈμ. κ±°κΈ°μ λΉμ μ μμ΄λμ΄λ₯Ό κ°κ³ μΆμ΅λλ€.
@sedubois react-apollo
μ μ΄λ€ λ¬Έμ κ° μμλμ?
@nmaro κ·νμ https://github.com/nmaro/apollo-next-example μ΄ λΉμ΄ μμ΅λλ€.
@amccloud μ μ΄μ λν΄ @nmaro μκ² λ¬Όμ΄λ³΄λ κ²μ΄ μ’μ΅λλ€(λλ μ¬μ ν μ½λλ‘ λμκ°μΌ ν©λλ€).
@sedubois κ°μ¬ν©λλ€. μ΄μ μ¨λΌμΈ μνκ° λμμ΅λλ€(μ²μμλ push
push origin master
μ μ€ννλ κ²μ μμ§ λ§μμμ€).
μ, μ κ° μλ±ν μ¬λμ μΈκΈνμ΅λλ€. @nmaro react-apolloμ μ΄λ€ λ¬Έμ κ° μμλμ?
λ°μ΄ν°κ° μλ²μ λ‘λλ λ€μ ν΄λΌμ΄μΈνΈκ° λ‘λλ₯Ό μμνμλ§μ νμ΄μ§κ° λ€μ λΉμ΄ μμμ΅λλ€. κ·Έλ° λ€μ @sedubois μ ꡬν(https://github.com/RelateMind/relate)μ λ³΄κ³ λΉ λ₯Έ κ°λ μ¦λͺ μ μν΄ μ΄λ―Έ μλΉν 볡μ‘νλ€κ³ μκ°νμ¬ λ§μΉ¨λ΄ νμ μμ€ APIλ‘ μλνμ΅λλ€.
@stubailo apolloλ₯Ό next.jsμ ν΅ν©νλ κ²μ΄ μ κ·Έλ κ² μ΄λ €μ΄μ§ κΆκΈνκΈ° λλ¬Έμ - ν΄λΌμ΄μΈνΈμ μλ² λͺ¨λμμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μλ μ μΌν μ₯μλ getInitialPropsλΌλ λΉλκΈ° ν¨μ λ΄λΆμ νμ΄μ§ λ£¨νΈ κ΅¬μ± μμμΈ κ² κ°μ΅λλ€. react-apolloλ₯Ό ν΅ν©νλ μΌλ°μ μΈ λ°©λ²μ ν΄λΌμ΄μΈνΈ μΈ‘μμλ§ μ μ©ν κ²μ΄λΌκ³ μκ°ν©λλ€.
ν₯λ―Έλ‘μ΅λλ€. Next.jsμ λ€λ₯Έ λ°μ΄ν° ν΅ν©μ΄ μμ΅λκΉ? λ΄κ° λ³Έ μμ λ₯Ό κΈ°λ°μΌλ‘ Reduxλ₯Ό μ¬μ©νλ κ²λ κ½€ μ΄λ €μ΄ κ² κ°μ΅λλ€.
λλΆλΆμ μ΅μ λ°μ΄ν° μμ€ν μλ μΌμ’ μ μ μ μΊμ(Redux, Apollo, Relay)κ° μμΌλ―λ‘ μ΄λ₯Ό νμ±ννλ €λ©΄ Nextμ μΌμ’ μ μμ€μ΄ νμνλ€κ³ μκ°ν©λλ€.
κΈλ‘λ² μΊμ(Redux, Apollo, Relay)κ° μλ μ΅μ λ°μ΄ν° μμ€ν μμ Next.jsκ° λ μ μλνλλ‘ νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ? μ΄κ²μ΄ λ€μ 릴리μ€μ ν° μ°μ μμκ° λμ΄μΌ νλ€κ³ μκ°ν©λλ€. @stubailo @rauchg
μ μ μΌλ‘. Wikiμ Redux μμ κ° μμ΅λλ€. μ΄μ μ μ¬ν μμ λ₯Ό λ λ§λ€μ΄μΌ ν©λλ€. :)
λ¦΄λ¦¬μ€ κΈ°μ€μΌλ‘ ν΄μΌ νλ κ²μ μλλλ€. btw. μ°λ¦¬λ μΈμ λ μ§ μν€ νν 리μΌμ μμ±ν μ μμ΅λλ€.
Btw @nmaro κ·Έ μμ λ μ λ§ κΉλν΄ λ³΄μ λλ€. κΈ°μ¬ν΄ μ£Όμ μ κ°μ¬ν©λλ€. μ°λ¦¬λ κ·Έκ²μ κΈ°λ°μΌλ‘ μΌκ³ νμ₯ν μ μμ΅λλ€.
μ€, μ΄μν©λλ€. κ΄λ ¨λ λ¬Έμ λ₯Ό κΉ¨λ«μ§ λͺ»νμ΅λλ€. @nmaro μν©μ μ΄λ ΅κ² λ§λλ react-apolloλ 무μμ
λκΉ? redux μμ λ₯Ό κ±°μ μ ννκ² λ°λ₯Ό μ μμ΄μΌ νμ§λ§ createStore
λ₯Ό μ¬μ©νλ new ApolloClient
λ₯Ό μννκ³ Provider
ApolloProvider
λ₯Ό μ¬μ©ν μ μμ΄μΌ ν©λλ€.
λκ΅°κ°μ ν¨κ» μ΅μνμ μλ₯Ό λ§λ€κ³ μΆμ΅λλ€. μ΄κ²μ Reactμ λν "hello world" μμ λλ€. Next.jsμ λν ν¬νΈκ° μμΌλ©΄ μ’μ κ²μ λλ€. https://github.com/apollostack/frontpage-react-app
@stubailo μ΅μνμ μμ λ‘ λΉμ κ³Ό ν¨κ» μΌνκ³ μΆμ΅λλ€. μ λ λͺ κ°μ§ νλ‘μ νΈλ₯Ό μν΄ λ²μ© apollo λ§μ΄ν¬λ‘νλ μμν¬μΈ Saturnμ μ¬μ©ν΄ μμΌλ©° κΆκ·Ήμ μΌλ‘ μ΄λ₯Ό Next.js + Apolloλ‘ μ΄μνκ³ μΆμ΅λλ€. :)
μ’μμ - μ, create-react-app λμ next.jsμμ μ€νλλλ‘ νλ‘ νΈνμ΄μ§ μ±μ μ΅μνμΌλ‘ μμ νλ κ²μ΄ μ μ·¨ν₯μ λλ€. κ·Έλ¬λ©΄ μ ν¬ ννμ΄μ§μλ λ±λ‘ν μ μμ΅λλ€!
@μ€ν¬λ°μΌλ‘
μμ λ¬Έμ λ λ°μ΄ν°κ° μλ²μμ λ‘λ λ° λ λλ§λμμ§λ§ ν΄λΌμ΄μΈνΈμμ λ‘λν λ μ무κ²λ κ΅μ²΄λμ§ μλλ€λ κ²μ λλ€. apollo-clientλ₯Ό μ§μ μ¬μ©νλ©΄ μ΄ λ¬Έμ κ° λ°μνμ§ μμμ΅λλ€.
μλ² λ λλ§μμ λ κΉλ€λ‘μ΄ κ²μ κ³μΈ΅ ꡬ쑰μ λ κΉμ μΏΌλ¦¬κ° μλ κ²½μ°μ λλ€. Reactμλ λΉλκΈ°μμΌλ‘ λ λλ§νλ λ°©λ²μ΄ μμ΅λλ€. μ¦, λ λλ§νκΈ° μ μ κ° κ΅¬μ± μμκ° μ€λΉλ λκΉμ§ κΈ°λ€λ¦½λλ€. μ΄λ ssr νλ μμν¬κ° λ€μ μ€ νλλ₯Ό μνν΄μΌ ν¨μ μλ―Έν©λλ€.
μ΄μ λ¬Έμ λ apolloκ° κ΅¬μ± μμ νΈλ¦¬λ₯Ό λ λλ§νλ λ° νμν λͺ¨λ λ°μ΄ν° νΈμΆμ κ°μ§νκ³ getInitialPropsμ μ 곡ν μ μλ νλμ ν¨μ νΈμΆμμ μ΄ λͺ¨λ μμ μ μννλ λ°©λ²μ΄ μλμ§ μ¬λΆμ λλ€.
@stubailo μ΄κ²μ λν ν΄κ²°μ± μ΄ μμ΅λκΉ? ^^
@nmaro @ads1018 getDataFromTree
보μ
¨λμ? λ΄ μμμ μ¬μ©λ κ²μ²λΌ: https://github.com/RelateMind/relate/blob/master/hocs/apollo.js
BTW μ΄μ https://github.com/zeit/next.js/pull/301 μ΄ λ³ν©λμ΄ μΌμ΄ κ°μνλ μ μλμ§ κΆκΈν©λλ€. μμ§ κ·Έκ²μ λν΄ μ‘°μ¬νμ§ μμμ΅λλ€.
@seduboi νμΈνμ΅λλ€ κ³΅μ ν΄μ£Όμ μ κ°μ¬ν©λλ€! λ€, react-apolloλ₯Ό μ¬μ©νλ μμ λ λ°©κΈ Masterμ λ³ν©λ μλ‘μ΄ νλ‘κ·Έλλ° λ°©μ API(#301)λ₯Ό μ¬μ©νμ¬ λ¨μνν μ μλ€κ³ μκ°ν©λλ€. λ°λΌμ λͺ¨λ νμ΄μ§ κ΅¬μ± μμλ₯Ό κ³ μ ν HOCλ‘ λνν νμκ° μμ΅λλ€. μ΄μ λν΄ μ§μ μ΄ μμΌλ©΄ μλ €μ£ΌμΈμ! apollo ννμ΄μ§μμ next.js μμ λ₯Ό μ»μ μ μμΌλ©΄ μ’κ² μ΅λλ€ :)
NB @ads1018 https://github.com/zeit/next.js/pull/301 μ Programmatic APIκ° μλ CommonsChunkPluginμΌλ‘ κ³΅ν΅ μ½λλ₯Ό μΆμΆνλ κ²μ λλ€. κ·Έλ¬λ μ, νλ‘κ·Έλλ° λ°©μ APIλ λΆλͺ ν λμμ΄ λ κ²μ΄λ©° μΆμλκΈ°λ₯Ό κ³ λνκ³ μμ΅λλ€.
μλ‘μ΄ 2.0.0-beta.2 릴리μ€μ ν¨κ» react-apolloλ₯Ό μ¬μ©νλ νμ΄μ μ»μ μ¬λμ΄ μμ΅λκΉ?
@sedubois @stubailo λ³΄κ³ μΆμΌμλ€λ©΄ next + react-apolloμ λν μλλ₯Ό λ―Έλ€μ΅λλ€. μ¬κΈ°μμ μ°Ύμ μ μμ΅λλ€: https://github.com/ads1018/frontpage-next-app
λ΄κ° μ§κΈ μ§λ©΄νκ³ μλ ν κ°μ§ λ¬Έμ λ κ΅¬μ± μμκ° μλ² μΈ‘μ΄ μλ ν΄λΌμ΄μΈνΈ μΈ‘μμλ§ λ λλ§λλ€λ κ²μ
λλ€. μλ§λ server.js λ΄μμ react-apolloμ getDataFromTree
λ©μλλ₯Ό μ¬μ©ν μ μμκΉμ? μλλ©΄ μ°λ¦¬ κ³ μ μ <document>
λ΄λΆμ μμ΅λκΉ? λͺ¨λ μ μ/ν 리νμ€νΈλ₯Ό νμν©λλ€!
κΆκ·Ήμ μΌλ‘ μ΄ hello world μμ λ₯Ό Next examples ν΄λμ Apollo ν νμ΄μ§μ ν¬ν¨νκ³ μΆμ΅λλ€.
λ°μ΄ν°λ₯Ό μλ²μμ λ λλ§νκΈ° μν μ μΌν μ μ 쑰건μ μ¬μ μν νμ μμ΄ getInitialProps
μ κ°μ²΄λ‘ λ°νλλ€λ κ²μ
λλ€.
μ‘μλ€. @nmaro κ° μ§μ νλ―μ΄ λ°μ μν΄λ‘μμλ μ΄κ²μ΄ μ½κ° μ΄λ ΅λ€κ³ μκ°ν©λλ€.
λ¬Έμ λ apolloκ° κ΅¬μ± μμ νΈλ¦¬λ₯Ό λ λλ§νλ λ° νμν λͺ¨λ λ°μ΄ν° νΈμΆμ κ°μ§νκ³ getInitialPropsμ μ 곡ν μ μλ νλμ ν¨μ νΈμΆμμ μ΄ λͺ¨λ μμ μ μννλ λ°©λ²μ΄ μλμ§ μ¬λΆμ λλ€.
κ°μ°¨
@ads1018 μ‘°κΈ νκ³ λ€λ©΄ μ΅μμ κ΅¬μ± μμ κ° getInitialPropsμ λ ΈμΆλ κ²½μ° Apollo λμ°λ―Έ λ₯Ό μ¬μ©νμ¬ λ¬Έμμ΄λ‘ λ λλ§ν μ μμ΅λλ€.
κ·Έλ¬λ©΄ _documentλ λ€μκ³Ό κ°μ κ²μ λλ€.
export default class MyDocument extends Document {
static async getInitialProps ({ app }) {
const wrapped = React.createElement(ApolloProvider, { client }, app)
const rendered = await renderToStringWithData(wrapped)
return { html: rendered, initialState: client.store.getState() }
}
render () {
return (
<html>
<Head>
<title>My page</title>
</Head>
<body>
<ApolloProvider client={client}>
<Main />
</ApolloProvider>
<NextScript />
</body>
</html>
)
}
}
@rauchg renderPage
μΈμ app
λ₯Ό λ
ΈμΆνλ κ°λ¨ν λ³κ²½μΈ κ² κ°μ§λ§ μ κ° κ°κ³Όνλ κ²μ΄ μμ΅λκΉ?
@bs1180 μ λλ°. λ΄κ° μ°Ύλ λ°λ‘ κ·Έκ±°μΌ. app
λ₯Ό λ
ΈμΆνλ κ°λ¨ν λ³κ²½μ΄ λμμΌλ©΄ ν©λλ€. κ·Έκ²μ μ¦μ Nextλ₯Ό graphql ν΄λΌμ΄μΈνΈ μΉνμ νλ μμν¬λ‘ λ§λ€ κ²μ
λλ€.
@bs1180 renderPage
λ°ν κ°μ²΄ λ΄λΆμ app
λ₯Ό λ
ΈμΆνμ΅λλ€. μ΄κ²μ λΉμ μ΄ μκ°ν κ²κ³Ό μΌμΉν©λκΉ?
@ads1018 μ ν νμ§ μμ - κ·νμ λ²μ μμ render
κ° κ³μ νΈμΆλκ³ μμ΅λλ€ renderToStringWithData
κ° μλμΌλ‘ νΈμΆλ κ²½μ° λΆνμν μ€λ³΅μ΄ λ κ²μ
λλ€.
λλ μ΄κ²μ λν΄ λ λ§μ μμ
μ μννκ³ μ΅μ’
κ²°κ³Όλ λ΄κ° μ²μ μμνλ κ²λ§νΌ μμμ§ μμ΅λλ€. μ£Όλ‘ κΈ°λ³Έ μ±μ΄ <Main />
κ΅¬μ± μμμ μμμΌλ‘ λ λλ§λκΈ° λλ¬Έμ
λλ€(__next divλ‘). λͺ¨λ 컨ν
μ€νΈκ° μμμ μ ν리μΌμ΄μ
μΌλ‘ μ λ¬λλ κ²μ λ°©μ§ν©λλ€. λ°λΌμ Apollo 컨ν
μ€νΈλ₯Ό λ€μ μΆκ°νλ €λ©΄ μ¬μ ν HOCκ° νμν©λλ€.
@bs1180 μκ² μ΅λλ€ . <Main />
λ₯Ό ApolloProvider
μ μμμΌλ‘ λ λλ§νμ¬ μ»¨ν
μ€νΈλ₯Ό μ λ¬ν μ μμ΅λκΉ?
λ¬΄μ¨ λ§μμΈμ§ λͺ¨λ₯΄κ² μ§λ§ λ°©ν₯μ΄ μλͺ»λ κ² κ°μμ. μλ²½ν SSRμ HOCλ§μΌλ‘ λ¬μ±ν μ μμ΅λλ€. μ¬κΈ°μμ μμμ μΌλ‘ μκ°μ΄ κ²°ν©λ λ²μ μ΄ μμ΅λλ€.
export default (options = {}) => Component => class ApolloHOC extends React.Component {
static async getInitialProps (ctx) {
const user = process.browser ? getUserFromLocalStorage() : getUserFromCookie(ctx.req)
const jwt = process.browser ? null : getJwtFromCookie(ctx.req)
if (options.secure && !user) {
return null // skip graphql queries completely if auth will fail
}
const client = initClient(jwt)
const store = initStore(client)
// This inserts the context so our queries will work properly during the getDataFromTree call,
// as well as ensuring that any components which are expecting the url work properly
const app = React.createElement(ApolloProvider, { client, store },
React.createElement(Component, { url: { query: ctx.query }}))
// this is the most important bit :)
await getDataFromTree(app)
const initialState = {[client.reduxRootKey]: {
data: client.store.getState()[client.reduxRootKey].data
}}
return { initialState, user }
}
constructor (props) {
super(props)
this.client = initClient()
this.store = initStore(this.client, this.props.initialState)
}
render () {
return (
<ApolloProvider client={this.client} store={this.store}>
<Component url={this.props.url} />
</ApolloProvider>
)
}
}
initClient
λ° initStore
λ redux μμ μμ λͺ¨λΈλ§λμμ΅λλ€. λͺ¨λ νμ΄μ§λ λ€μκ³Ό κ°μ΅λλ€.
import ApolloHOC from '../hoc'
import { graphql } from 'react-apollo'
export default ApolloHOC({ secure: false })(() => <b>Hello world</b>)
μ μ©νκΈ°λ₯Ό λ°λλλ€. μ‘°μ¬ν λ€λ₯Έ λ°©λ²μ΄ μλμ§, μλλ©΄ μ κ° κ°κ³Όνκ³ μλ λΆλΆμ΄ μλμ§ μκ³ μΆμ΅λλ€.
@bs1180 λ©μ§λ€μ , 곡μ ν΄μ£Όμ μ μ λ§ μ μ©ν©λλ€.
_document.js
λ΄λΆμ graphql λ°μ΄ν°κ° μλ νμ΄μ§λ₯Ό λ λλ§νκΈ° μν΄ ν μ μλ λ€λ₯Έ κ²μ΄ μμ΅λκΉ? μ²μμ μ μν κ²μ²λΌ HOCλ₯Ό λͺ¨λ μ°νν μ μλ€λ©΄ μ’μ κ²μ
λλ€.
λλ κ·Έλ κ² μκ°νμ§ μμ΅λλ€ - λ΄κ° λ³Ό μ μλ λ°μ λ°λ₯΄λ©΄ ν΄λΌμ΄μΈνΈ μΈ‘ λ λ λ μ¬μ©μ μ μ _document.js
μμ 컨ν
μ€νΈ(Apollo ν΄λΌμ΄μΈνΈ, νμ€ Redux μ€ν μ΄, ν
λ§ λ±)μ μ λ¬λλ λͺ¨λ κ²μ μ κ±°ν©λλ€. Apollo SSR λ‘μ§μ μΌλΆλ₯Ό κ·Έκ³³μΌλ‘ μ΄λν μ μμ§λ§, 컨ν
μ€νΈμ νμν κ°μ²΄λ₯Ό λ€μ μΆκ°νλ €λ©΄ μΌμ’
μ HOC/λνΌ κ΅¬μ±μμκ° μ¬μ ν νμν©λλ€.
next.js λ΄λΆμ λν λ λμ μ§μμ κ°μ§ μ¬λμ΄ λ λμ μμ΄λμ΄λ₯Ό κ°μ§ μ μμ΅λλ€.
μμ μμ λ₯Ό μ»μ μ μλ€λ©΄ νμΈνκ³ μΆμ΅λλ€. λλ μμ§λ μ΄κ²μ μλμν€κΈ° μν΄ μΈμ°κ³ μλ€.
React Apolloμ Nextμ μ€μ μμ κ° μμ΅λλ€ π π λ§μ λΆλ€μ΄ μ μ©νκ² μ¬μ©νμ ¨μΌλ©΄ ν©λλ€. μ¬κΈ°μμ νμΈν μ μμ΅λλ€: https://github.com/ads1018/next-apollo-example (λλ Nowλ₯Ό μ¬μ©νμ¬ λ°λͺ¨λ₯Ό λ°°ν¬νμ΅λλ€.)
λλ ApolloProvider
λ‘ νμ΄μ§λ₯Ό κ°μΈλ withData()
λΌλ λ΄ νμ΄μ§ λ΄λΆμ HOCλ₯Ό μ¬μ©νκ² λμμ΅λλ€. λλ μ²μμ λ¨μΌ νμΌ λ΄μμ ν λ²μ΄ μλλΌ νμ΄μ§λΉ κΈ°λ°μΌλ‘ 곡κΈμλ₯Ό μ¬μ©νμ¬ ν΄μ λμμ§λ§ κ°λ
μ±κ³Ό νμ₯μ± λ©΄μμ λ λ«λ€λ μ λ§ λλν μ¬λλ€μ μν΄ νμ νμ΅λλ€. λλ μ€μ λ‘ withData(MyComponent)
κ° κ½€ 보기 μ’κ³ λ
μμκ² νΉμ νμ΄μ§κ° λ°μ΄ν°λ₯Ό κ°μ Έμ€λ μ’μ 컨ν
μ€νΈλ₯Ό μ 곡νλ€κ³ μκ°ν©λλ€(λ§μ₯λμ΄ μλ).
μ λ₯Ό μ¬λ°λ₯Έ λ°©ν₯μΌλ‘ μλ΄ν΄ μ£Όμ @bs1180 κ³Ό @rauchg μκ² κ°μ¬λ립λλ€. with-apollo
μμ λ₯Ό 리ν¬μ§ν 리μ μΆκ°νλ €λ©΄ μ μκ² μλ €μ£Όμλ©΄ pull μμ²μ μμ±ν μ μμ΅λλ€.
@ads1018 λ κ°μ¬ν©λλ€ π μ μμ https://Relate.now.sh μ λΉκ΅νμ¬ μ΄ μμ λ κΉμ΄ μ€μ²©λ κ΅¬μ± μμμμ Apolloλ₯Ό μ¬μ©νλ λ¬Έμ λ₯Ό ν΄κ²°ν©λκΉ(getInitialPropsμ μΊμ€μΌμ΄λ λ°©μ§)? μλ§λ μμ λ μ΄κ²μ΄ μ£Όμ λ¬Έμ μ μ΄λ―λ‘ μ΄λ₯Ό 보μ¬μ£Όμ΄μΌ ν©λλ€. κ·Έλ¦¬κ³ μ΄κ²μ examples ν΄λμ μΆκ°νλ©΄ λ§€μ° κ°μ¬ν κ²μ΄λΌκ³ νμ ν©λλ€.
@sedubois #192μμ μΈκΈν μ€λ₯λ₯Ό μ¬νν μ μμ΅λλ€. λλ μ무 λ¬Έμ μμ΄ μ€μ²© κ΅¬μ± μμ λ΄λΆμμ Apolloλ₯Ό μ¬μ©νκ³ μμ΅λλ€. λ΄ μλ₯Ό νκ³ μ¬νν μ μλ€λ©΄ μλ €μ£Όμκ² μ΅λκΉ?
@ads1018λ , κ°μ¬ν©λλ€. https://github.com/ads1018/next-apollo-example/issues/2 πμ μμ μ¬νμΌλ‘ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€. λ΄ μμ λ μ λ°μ΄νΈνμ΅λλ€. https://github.com/RelateNow/relate
μκ³ νμ΄μ, @ads1018 @sedubois! λλ μ΄κ²κ³Ό #192λ₯Ό λ°λΌ λ€λ κ³ Apolloμ λ°λλΌ Reactλ₯Ό μ¬μ©νμ¬ ν리νμΉ/λΉλκΈ° 보기λ μ‘°μ¬ νμ΅λλ€.
κ° νμ΄μ§κ° νμλκΈ° μ μ getDataFromTree
λ₯Ό μ€νν λ μ±λ₯ λ¬Έμ λ₯Ό λ°κ²¬νκ±°λ μμν©λκΉ? κΈ°μ μ μΌλ‘ μ΄ λ©μλλ μ 체 νΈλ¦¬λ₯Ό μ¬κ·μ μΌλ‘ λ λλ§ν λ€μ getInitialProps
κ° λ°νλλ©΄ Reactκ° νΈλ¦¬λ₯Ό λ€μ λ λλ§νλ―λ‘(μΊμμμ κ°μ Έμ¨ λ°μ΄ν°κ° μμμλ λΆκ΅¬νκ³ )
μ λ§ λ©μ§ μ루μ π λ λ² λ λλ§νλ κ²μ΄ λͺ¨λ νμ λ°μ΄ν°κ° μΊμλλλ‘ νλ μ μΌν μ΅μ μ΄λΌκ³ μκ°ν©λλ€. μ±λ₯μ λν΄ μ΄λ»κ² μκ°νμλμ§ κΆκΈν©λλ€.
μλ
νμΈμ @estrattonbailey - μ±λ₯ λ¬Έμ λ₯Ό λμΉμ±μ§ λͺ»νμΌλ©° μμνμ§λ μμ΅λλ€. μ€μ λ‘, κ·Έκ²μ λ§€μ° μ΄λ°ν©λλ€! getDataFromTree
μ€νμ κ΄ν΄μλ, μ°λ¦¬κ° μλ²μ μλμ§ νμΈνλ μ‘°κ±΄λΆ μμ ν΄λΉ λ©μλ νΈμΆμ λννμ¬ μ¬μ©μκ° μ±μ μ²μ λ‘λν λλ§ νΈμΆλκ³ μ΄νμ λͺ¨λ κ²½λ‘ λ³κ²½μμ 무μλ©λλ€. . μ±λ₯μ νμΈνλ €λ©΄ λ°λͺ¨ λ₯Ό κ°μ§κ³ λ μ μμ΅λλ€. νΌλλ°±μ΄ μμΌλ©΄ μλ €μ£ΌμΈμ!
@ads1018 κ·νμ μμ λν λͺ κ°μ§ μμ΄λμ΄:
typeof window !== 'undefined'
λ‘ λ¨μννκ³ !!ctx.reqλ₯Ό μμ ν©λλ€.@ad1018 λ°κ° μ΅λλ€! μ’μ μμ λ°λͺ¨.
λ΄κ° λ¬»κ³ μΆμ κ²μ μ΄ κ·λͺ¨κ° μΌλ§λ λ κΉμ? μμ§ Nextλ₯Ό μ¬μ©νμ§ μμμ§λ§ μ΄ν΄νλ ν Nextλ νμ΄μ§ κ΅¬μ± μμ(μ: pages/page.js
)μμ μ¬μ©ν μ μλ κ²½μ° κ° κ²½λ‘ μ νμμ getInitialProps
λ₯Ό νΈμΆν©λλ€. μλ°± κ°μ λ
Έλμ λ§μ λ°μ΄ν°κ° λ€μ΄μ€λ μ 체 κ·λͺ¨μ μ±/μΉμ¬μ΄νΈμμ κ° κ²½λ‘μμ λ λ² λ λλ§νλ©΄ μ½κ°μ λκΈ° μκ°μ΄ λ°μν μ μλ€κ³ μκ°ν©λλ€.
λ΄κ° μμ νκ³ μλ νλ‘μ νΈλ λκ·λͺ¨ νΈμ§ μ¬μ΄νΈμ΄λ―λ‘ κ·νλ₯Ό ν¬ν¨νμ¬ λ€μν μ κ·Ό λ°©μμ λ²€μΉλ§νΉν μ μκΈ°λ₯Ό λ°λλλ€. μνλ€λ©΄ νΈμν° μμ λ λ§μ λ Όμλ₯Ό νκ³ μΆμ΅λλ€. μμ ν΄μ£Όμ μ κ°μ¬ν©λλ€!
@estrattonbailey κ°μ°¨ . λλ κ·Έκ²μ΄ μμ£Ό μ νμ₯λ κ²μ΄λΌκ³ μμνλ€. μ΄κΈ° νμ΄μ§ λ‘λμ κ²½μ° getInitialProps
λ μλ²μμλ§ μ€νλ©λλ€. getInitialProps
κ° ν΄λΌμ΄μΈνΈμμ λ€μ μ€νλμ§λ§ getDataFromTree
κ° μ°λ¦¬κ° μλ²μ μλμ§ μ¬λΆλ₯Ό νμΈνλ μ‘°κ±΄λΆ μμ λνλκΈ° λλ¬Έμ λ°μ΄ν°κ° λ λ² μμ²λμ§ μλλ€λ κ²μ λ§μ΅λλ€.
μ°Έκ³ μ¬ν - νμ΄μ§μμ μμ²λλ λ§μ κ΅¬μ± μμμ λ°μ΄ν°λ‘ μΈν΄ μ΄κΈ° νμ΄μ§ λ‘λ μκ°μ΄ κ±±μ λλ κ²½μ° νμ apolloμκ² SSR λμ μλμ μΌλ‘ νΉμ 쿼리λ₯Ό 건λλ°κ³ ssr: false
λ₯Ό μ λ¬νμ¬ ν΄λΌμ΄μΈνΈμ μ€νλ‘λνλλ‘ μ§μν μ μμ΅λλ€.
λ μμΈν λ Όμλ₯Ό μνμλ©΄ νΈμν° λ‘ μ°λ½ λλ¦¬κ² μ΅λλ€ :)
getInitialPropsκ° ν΄λΌμ΄μΈνΈμμ λ€μ μ€νλμ§λ§ getDataFromTreeκ° μ°λ¦¬κ° μλ²μ μλμ§ μ¬λΆλ₯Ό νμΈνλ μ‘°κ±΄λΆ μμ λνλκΈ° λλ¬Έμ λ°μ΄ν°κ° λ λ² μμ²λμ§ μλλ€λ κ²μ λ§μ΅λλ€.
getInitialProps
λ μ΄κΈ° λ‘λ μ΄νκ° μλλΌ <Link>
λ‘ μ νν λλ§ ν΄λΌμ΄μΈνΈ μΈ‘μμ μ€νλλ€λ μ μ λͺ
μ¬ν΄μΌ ν©λλ€.
@ads1018 @estrattonbailey AFAIK 첫 νμ΄μ§ λ‘λ μ μλ² μΈ‘ λ λλ§μ΄ 2κ° μμ΅λλ€. getDataFromTreeκ° μ€νλκ³ λ΄λΆμ μΌλ‘ μ 체 νΈλ¦¬λ₯Ό λ λλ§ν λ€μ HTML μλ΅μ ꡬμ±νκΈ° μν΄ λ λλ§μ΄ λ€μ νΈμΆλ©λλ€. κ·Έκ²μ νΌν λ°©λ²μ΄ μλμ§ μκ°νμ§ λ§μμμ€. κ·Έλ¬λ SSRμ΄ νΌνλ λ€νΈμν¬ μ볡 λλΆμ μ¬μ ν μ±λ₯μ΄ μ’μ κ² κ°μ΅λλ€.
GraphQL μλ²κ° Next.js μλ²μ λμΌν μμ€ν μμ νΈμ€ν λ λ μ±λ₯μ΄ μ΅λμΈ κ² κ°μΌλ―λ‘ μ±λ₯μ κ΄μ¬μ΄ μλ€λ©΄ νμ μλν΄ λ³Ό μ μμ΅λλ€. λ°±μλ, Next.jsλ Now/Zeit Worldμ ν¨κ» λ°°ν¬λ¨).
@sedubois @estrattonbailey λ΄κ° νλ Έλ€λ©΄ μ μ ν΄ μ£Όμ§λ§ μ°λ¦¬λ μ¬μ ν ν λ²λ§ λ λλ§νκ³ μμ΅λλ€. getDataFromTree
λ νΈλ¦¬λ₯Ό λ λλ§νμ§ μκ³ λ°μ΄ν°κ° Apollo ν΄λΌμ΄μΈνΈ μ μ₯μμ μ€λΉλλ©΄ ν΄κ²°λλ μ½μμ λ°νν©λλ€. μ½μμ΄ ν΄κ²°λλ μμ μμ Apollo ν΄λΌμ΄μΈνΈ μ μ₯μκ° μμ ν μ΄κΈ°νλκ³ HTTP μμ²μ μλ΅μΌλ‘ λ¬Έμμ΄νλ κ²°κ³Όλ₯Ό μ λ¬νλ €λ κ²½μ° μ νμ μΌλ‘ νΈλ¦¬λ₯Ό λ λλ§ν μ μμ§λ§ μ μμ μμλ κ·Έλ κ² νμ§ μμ΅λλ€.
getDataFromTreeλ νΈλ¦¬λ₯Ό λ λλ§νμ§ μμ΅λλ€.
@ads1018 AFAIK λ° Apollo μ½λ λ₯Ό 보면 νΈλ¦¬λ₯Ό μ¬κ·μ μΌλ‘ λ λλ§ _νμ§ μμ΅λλ€_ (Apollo λ°μ΄ν° κ°μ Έμ€κΈ°λ₯Ό νΈλ¦¬κ±°νκΈ° μν΄). λ°λΌμ 첫 νμ΄μ§ λ‘λ μ μλ² μΈ‘ 2κ° λ λλ§λ©λλ€.
νμ§λ§ μ΄μ¨λ , λΉμ μ λ°λͺ¨ λλΆμ μ΄μ Apolloμ Next μ¬μ΄μ μ¬μ©ν μ μλ ν΅ν©μ΄ μκ²Όκ³ Apollo SSR μ±λ₯μ λν λλ¨Έμ§ μ§λ¬Έμ λ μ΄μ Next.jsμ κ΄λ ¨μ΄ μλ€κ³ μκ°ν©λλ€. κ±°κΈ°μ λν΄ μ§λ¬Ένλ κ²μ΄ μ’μ΅λλ€.
@sedubois λ λκ° λ¬΄μμ
λκΉ? λλ κ±ΈμΌλ©΄μ λ무λ₯Ό νλλ κ²μ λΆλ₯΄κ³ μΆμ΅λλ€. setState
κ° μ΅μ λκ³ DOMμ λν μ‘°μ μ΄ μμ΄ μλΉν μ΅μ νλ κ² κ°μ΅λλ€.
@ads1018 μ’μ μ! μ¬κΈ° Wikiμλ μΆκ°λ κ² κ°μΌλ μ΄ λ¬Έμ λ₯Ό λ«μ μ μμκΉμ?
cc @rauchg
Apollo λΈλ‘κ·Έμμ Apollo + Next.jsμ λν λΈλ‘κ·Έ κ²μλ¬Όμ κ°μ ΈμμΌ ν©λλ€!
@stubailo @ads1018 μ μλ νλ₯ν©λλ€ π λμΌν Apollo μμΉμ μ¬μ©νμ¬ λ ν° κ²μ μν΄ λ΄ μ±μ νμΈν μ μμ΅λλ€: https://github.com/relatenow/relate
@helperλ κ°μ¬ν©λλ€. λλ κ·Έκ²μ΄ μ΄λ»κ² λμλμ§μ λν΄ ν₯λΆνλ€. Next.js + Apolloλ‘ μ± κ°λ°μ μ±λ°°λ₯Ό λ°κ²¬ν κ² κ°μ΅λλ€. λλ 볡μμ μ ννκΈ° μν λ Έλ ₯μ μΌνμΌλ‘ λΈλ‘κ·Έ ν¬μ€νΈλ‘ νμ μ‘°μΉλ₯Ό μ·¨νλ €κ³ νμ§λ§, λ¨μ§ κ·Έκ²μ λν΄ λ€λ£¨μ§ λͺ»νμ΅λλ€. @stubailo Apollo 맀체 κ°νλ¬Όμ λν μμ μ νλ ₯νκ² λμ΄ κΈ°μ©λλ€. :)
μμ μ κ·Έμ λ©μ§ μ±μ λμμ€ @sedubois μκ² ν° λ°μλ₯Ό 보λ λλ€. π
@ads1018 μ΄ λΈλ‘κ·Έμ μ¬λ¬λΆμ μ΄λνκ³ μΆμ΅λλ€. κ·Έκ²μ λν΄ μ΄μΌκΈ°ν μ€λΉκ° λλ©΄ Apollo Slackμμ μ (thea)μκ² νμ 보λ΄μ£ΌμΈμ. :)
@helper λΉμ μ΄ μμ ν μ³μμ΅λλ€. λ¬Έμ κ° μ’ λ£λ μ μλμ§ νμΈνλ €λ©΄ μ λ¬Έμ λ₯Ό ν΅κ³Όν΄μΌ ν©λλ€. π
@stubailo @theadactyl λ©μ§ μμ΄λμ΄ β€οΈ
μλ² μΈ‘μμ λ°μ΄ν°λ₯Ό λ λ² μμ²νλ κ²κ³Ό κ΄λ ¨νμ¬ λ³Ό λ¬Έμ /PRμ λν΄ μλ μ¬λμ΄ μμ΅λκΉ? κ·Έλ₯ κΆκΈνλ€
κ°μ₯ μ μ©ν λκΈ
Apollo λΈλ‘κ·Έμμ Apollo + Next.jsμ λν λΈλ‘κ·Έ κ²μλ¬Όμ κ°μ ΈμμΌ ν©λλ€!