| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /* @flow */
- const Transform = require('stream').Transform
- import type TemplateRenderer from './index'
- import type { ParsedTemplate } from './parse-template'
- export default class TemplateStream extends Transform {
- started: boolean;
- renderer: TemplateRenderer;
- template: ParsedTemplate;
- context: Object;
- constructor (
- renderer: TemplateRenderer,
- template: ParsedTemplate,
- context: Object
- ) {
- super()
- this.started = false
- this.renderer = renderer
- this.template = template
- this.context = context || {}
- }
- _transform (data: Buffer | string, encoding: string, done: Function) {
- if (!this.started) {
- this.emit('beforeStart')
- this.start()
- }
- this.push(data)
- done()
- }
- start () {
- this.started = true
- this.push(this.template.head(this.context))
- // inline server-rendered head meta information
- if (this.context.head) {
- this.push(this.context.head)
- }
- // inline preload directives for initial chunks
- const preloadLinks = this.renderer.renderPreloadLinks(this.context)
- if (preloadLinks) {
- this.push(preloadLinks)
- }
- // inline prefetch directives for async chunks not used during render
- const prefetchLinks = this.renderer.renderPrefetchLinks(this.context)
- if (prefetchLinks) {
- this.push(prefetchLinks)
- }
- // inline server-rendered CSS collected by vue-style-loader
- if (this.context.styles) {
- this.push(this.context.styles)
- }
- this.push(this.template.neck(this.context))
- }
- _flush (done: Function) {
- this.emit('beforeEnd')
- // inline initial store state
- const state = this.renderer.renderState(this.context)
- if (state) {
- this.push(state)
- }
- // embed scripts needed
- const scripts = this.renderer.renderScripts(this.context)
- if (scripts) {
- this.push(scripts)
- }
- this.push(this.template.tail(this.context))
- done()
- }
- }
|