A Room with a
About Me
Matt Stow
@stowball
Lead UX Engineer at
National Rugby League
2006


2010


2013
2014
2015
SSR
2016

Rebuilding the NRL
Constraints
- Enterprise CMS
- .NET back-end
- Primarily a content platform
- A number of complex and dynamic UIs
- Really short timeframes
React Habitat
You should use React Habitat any time there is a framework or CMS rendering your HTML and you
want one or multiple React components on the page
This framework is perfect for that



Pros
- React is good at building interactive UI
- Components can easily be inserted in the DOM
- Stringified JSON can be passed as props; reducing the need to fetch initial data
Cons
- Double-divving
- Components can't cross-communicate without
a pub/sub mechanism or Redux 😔
- Need to add interactivity to existing HTML?
Recreate every HTML component in JS 😩
- JS bundle keeps getting bigger & parse times longer 😫
- Before JS is initialised, there is no content 😱


Hello, Glandular Fever

Hello, Quench Vue
Simple, client-side hydration of pre-rendered Vue.js apps
Pros
- Vue is really good at building interactive UI
- Multiple apps can easily be inserted in the DOM
- Stringified JSON can be passed as initial data
-
Apps can easily cross-communicate via an event bus
-
Fewer templates need to be maintained in JS, resulting in a smaller & faster bundle
- Allows for server-side rendering without Node.js
Cons
- What started as a 411b library has
ballooned to 1.1kb minified & gzipped 😎
- There‘s no ideal way of documenting our applications‘ data structures
- We duplicate some of our template markup in
Handlebars & Razor templates
- We have to manage our other templates in JS string literals, but we‘re hoping to change that
(Atom actually makes it not too painful though)
Vue 101


Using Quench
- Output your default data within a [q-data] attribute
- Bind data properties to DOM nodes with [v-text]
- Hide elements from the compiler with <!-- <q> -->
- Convert the [q-data] with createAppData()
- Create the template with createAppTemplate()
How does it work?








The News page uses 4 unique Vue apps
Multiple apps? Huh?!
- We‘re not an SPA, so we don‘t need to manage the entire application‘s state from one single source
- Unlike React, Vue has a clear distinction between what‘s an app and what‘s a component
- Each app is restricted in its scope. It only has the exact template and data that it needs
- Each page of the website can be completely different
- Our resilience to failure is much greater with everything independent










- All aspects of performance has improved:
file size, TTFMP, TTFI, reflow etc
- Developer experience is really good:
simpler to learn, code & reason about
- We can test live data really easily in dev
- User experience is even better!
Our verdict


with a
Thank you!
@stowball
A Room with a Vue
By Matt Stow
A Room with a Vue
How the NRL uses Vue.js and Quench Vue to progressively enhance and hydrate server-side rendered HTML
- 3,623