113 lines
2.5 KiB
JavaScript
113 lines
2.5 KiB
JavaScript
// app.js
|
|
|
|
import VueApollo from 'vue-apollo'
|
|
|
|
Vue.use(VueApollo)
|
|
|
|
export default function createApp ({ createApolloClients }) {
|
|
const router = new VueRouter({})
|
|
const store = new Vuex.Store({})
|
|
const { apolloClientA, apolloClientB } = createApolloClients()
|
|
const apollo = new VueApollo({
|
|
clients: {
|
|
a: apolloClientA,
|
|
b: apolloClientB,
|
|
},
|
|
defaultClient: apolloClientA,
|
|
})
|
|
|
|
const ensureReady = apollo.collect()
|
|
|
|
const app = new Vue({
|
|
el: '#app',
|
|
router,
|
|
store,
|
|
apollo,
|
|
...App,
|
|
})
|
|
|
|
return { app, router, store, apollo, ensureReady }
|
|
}
|
|
|
|
// server.js
|
|
|
|
import { ApolloClient, createNetworkInterface } from 'apollo-client'
|
|
import { createLocalInterface } from 'apollo-local-query'
|
|
import graphql from 'graphql'
|
|
import { schema } from './graphql/schema'
|
|
|
|
function createApolloClients() {
|
|
const apolloClientA = new ApolloClient({
|
|
ssrMode: true,
|
|
networkInterface: createLocalInterface(graphql, schema)
|
|
})
|
|
|
|
const apolloClientB = new ApolloClient({
|
|
ssrMode: true,
|
|
networkInterface: createNetworkInterface({
|
|
uri: 'http://my-awesome-api/graphql',
|
|
transportBatching: true,
|
|
}),
|
|
})
|
|
|
|
return {
|
|
apolloClientA,
|
|
apolloClientB,
|
|
}
|
|
}
|
|
|
|
export default function render (context) {
|
|
const { app, router, store, apollo, ensureReady } = createApp({ createApolloClients })
|
|
router.push(context.url)
|
|
router.onReady(async () => {
|
|
// Wait for apollo queries to be loaded
|
|
await ensureReady()
|
|
|
|
// Inject initial apollo states
|
|
let js = `window.__APOLLO_STATE__ = {`
|
|
for (const key in apollo.clients) {
|
|
const client = apollo.clients[key]
|
|
const state = {[client.reduxRootKey]: client.getInitialState() }
|
|
js += `['${key}']:${JSON.stringify(state)},`
|
|
}
|
|
js += `};`
|
|
|
|
// TODO Render here
|
|
|
|
// TODO Add the js to the response
|
|
})
|
|
}
|
|
|
|
// client.js
|
|
|
|
import { ApolloClient, createNetworkInterface } from 'apollo-client'
|
|
|
|
function createApolloClients() {
|
|
const state = window.__APOLLO_STATE__
|
|
|
|
const apolloClientA = new ApolloClient({
|
|
networkInterface: createNetworkInterface({
|
|
uri: '/graphql',
|
|
transportBatching: true,
|
|
}),
|
|
initialState: state.a,
|
|
ssrForceFetchDelay: 100,
|
|
})
|
|
|
|
const apolloClientB = new ApolloClient({
|
|
networkInterface: createNetworkInterface({
|
|
uri: 'http://my-awesome-api/graphql',
|
|
transportBatching: true,
|
|
}),
|
|
initialState: state.b,
|
|
ssrForceFetchDelay: 100,
|
|
})
|
|
|
|
export {
|
|
apolloClientA,
|
|
apolloClientB,
|
|
}
|
|
}
|
|
|
|
createApp({ createApolloClients })
|