mirror of
https://github.com/aelve/guide.git
synced 2024-12-25 13:51:45 +03:00
69 lines
1.4 KiB
TypeScript
69 lines
1.4 KiB
TypeScript
/* tslint:disable:ordered-imports */
|
||
|
||
import 'reflect-metadata'
|
||
import 'babel-polyfill'
|
||
import Vue from 'vue'
|
||
|
||
import { createApp } from './app'
|
||
|
||
const { app, router, store } = createApp()
|
||
|
||
Vue.mixin({
|
||
beforeRouteUpdate (to, from, next) {
|
||
const { asyncData } = this.$options
|
||
if (typeof asyncData === 'function') {
|
||
asyncData.call(this, {
|
||
store: this.$store,
|
||
route: to
|
||
}).then(next).catch(next)
|
||
} else {
|
||
next()
|
||
}
|
||
}
|
||
})
|
||
|
||
const STATE_KEY = '__INITIAL_STATE__'
|
||
const SSR_ENABLED = window['__SSR_IS_ON__']
|
||
|
||
if (window[STATE_KEY]) {
|
||
store.replaceState(window[STATE_KEY])
|
||
}
|
||
|
||
if (!SSR_ENABLED) {
|
||
registerBeforeResolve()
|
||
}
|
||
|
||
router.onReady(() => {
|
||
if (SSR_ENABLED) {
|
||
registerBeforeResolve()
|
||
}
|
||
app.$mount('#app')
|
||
})
|
||
|
||
function registerBeforeResolve () {
|
||
router.beforeResolve((to, from, next) => {
|
||
const matched = router.getMatchedComponents(to)
|
||
const prevMatched = router.getMatchedComponents(from)
|
||
|
||
let diffed = false
|
||
const activated = matched.filter((c, i) => {
|
||
return diffed || (diffed = (prevMatched[i] !== c))
|
||
})
|
||
|
||
if (!activated.length) {
|
||
return next()
|
||
}
|
||
|
||
Promise.all(activated.map(Component => {
|
||
const asyncDataFunc = Component['asyncData'] ||
|
||
(Component['options'] || {})['asyncData']
|
||
|
||
if (typeof asyncDataFunc === 'function') {
|
||
return asyncDataFunc({ store, route: to })
|
||
}
|
||
})).then(() => {
|
||
next()
|
||
}).catch(next)
|
||
})
|
||
}
|