passToClient
Most pageContext
values are available only on the server-side, but you can use passToClient
to make values available on the client-side.
// /pages/+config.js
// Environment: config
export default {
passToClient: [
'user'
]
}
// /pages/+onHydrationEnd.js
// Environment: client
export { onHydrationEnd }
async function onHydrationEnd(pageContext) {
// pageContext.user is available here thanks to passToClient
console.log(pageContext.user)
// ...
}
Some values, such as pageContext.data
, are already passed to the client-side by default.
Error
If you try to access a pageContext
value that isn't defined on the client-side then Vike throws an error:
[Vike][Wrong Usage] pageContext.someProp isn't defined on the client-side
You can look at the stack trace to find the
pageContext.someProp
occurrence in your code that triggers the error.
To avoid the error:
- add
'someProp'
topassToClient
(see above), or - replace
pageContext.someProp
with'someProp' in pageContext && pageContext.someProp
.// ❌ Vike throws an error if pageContext.someProp isn't defined const val = pageContext.someProp // ✅ Vike doesn't throw an error if pageContext.someProp isn't defined const val = 'someProp' in pageContext && pageContext.someProp // ✅ Alternative const val = 'someProp' in pageContext ? pageContext.someProp : someDefaultValue
Default
When using Client Routing, the following are also available on the client-side by default:
pageContext.Page
pageContext.data
pageContext.config
pageContext.isHydration
pageContext.isBackwardNavigation
pageContext.routeParams
pageContext.urlOriginal
pageContext.urlPathname
pageContext.urlParsed
When using Server Routing, the following are also available on the client-side by default:
pageContext.Page
pageContext.data
pageContext.config
pageContext.routeParams
Serialization
Serialization is done with @brillout/json-serializer
.
User-defined classes are lost during serialization:
class MyClass {
prop = 42
}
// On the server-side:
const obj = new MyClass()
console.log(obj) // MyClass { prop: 42 }
console.log(obj instanceof MyClass) // true
// On the browser-side, after `obj` was (de)serialized:
console.log(obj) // { prop: 42 }
console.log(obj instanceof MyClass) // false
See GitHub > brillout/json-serializer
> #3 Support user-defined classes.