make use of runInNewContext: false

This commit is contained in:
Evan You 2017-05-02 14:57:39 +08:00 committed by Pooya Parsa
parent 6ee5d958a7
commit 74652e3974
6 changed files with 115 additions and 92 deletions

View File

@ -2,13 +2,15 @@
import Vue from 'vue'
import middleware from './middleware'
import { app, router<%= (store ? ', store' : '') %>, NuxtError } from './index'
import { createApp, NuxtError } from './index'
import { applyAsyncData, getMatchedComponents, getMatchedComponentsInstances, flatMapComponents, getContext, promiseSeries, promisify, getLocation, compile } from './utils'
const noopData = () => { return {} }
const noopFetch = () => {}
let _lastPaths = []
let _lastComponentsFiles = []
const { app, router<%= (store ? ', store' : '') %> } = createApp()
function mapTransitions(Components, to, from) {
return Components.map((Component) => {
let transition = Component.options.transition

View File

@ -2,8 +2,8 @@
import Vue from 'vue'
import Meta from 'vue-meta'
import router from './router.js'
<% if (store) { %>import store from './store.js'<% } %>
import { createRouter } from './router.js'
<% if (store) { %>import { createStore } from './store.js'<% } %>
import NuxtChild from './components/nuxt-child.js'
import NuxtLink from './components/nuxt-link.js'
import NuxtError from '<%= components.ErrorPage ? components.ErrorPage : "./components/nuxt-error.vue" %>'
@ -25,6 +25,19 @@ Vue.use(Meta, {
tagIDKeyName: 'hid' // the property name that vue-meta uses to determine whether to overwrite or append a tag
})
const defaultTransition = <%=
serialize(transition)
.replace('beforeEnter(', 'function(').replace('enter(', 'function(').replace('afterEnter(', 'function(')
.replace('enterCancelled(', 'function(').replace('beforeLeave(', 'function(').replace('leave(', 'function(')
.replace('afterLeave(', 'function(').replace('leaveCancelled(', 'function(')
%>
export { NuxtError }
export function createApp (ssrContext) {
const store = createStore()
const router = createRouter()
if (process.browser) {
<% if (store) { %>
// Replace store state before calling plugins
@ -43,15 +56,10 @@ if (process.browser) {
// root instance
// here we inject the router and store to all child components,
// making them available everywhere as `this.$router` and `this.$store`.
const defaultTransition = <%=
serialize(transition)
.replace('beforeEnter(', 'function(').replace('enter(', 'function(').replace('afterEnter(', 'function(')
.replace('enterCancelled(', 'function(').replace('beforeLeave(', 'function(').replace('leave(', 'function(')
.replace('afterLeave(', 'function(').replace('leaveCancelled(', 'function(')
%>
let app = {
router,
<%= (store ? 'store,' : '') %>
ssrContext,
_nuxt: {
defaultTransition: defaultTransition,
transitions: [ defaultTransition ],
@ -107,4 +115,5 @@ if (process.browser) {
<% }
}) %>
export { app, router<%= (store ? ', store' : '') %>, NuxtError }
return { app, router<%= (store ? ', store' : '') %> }
}

View File

@ -53,7 +53,8 @@ const scrollBehavior = (to, from, savedPosition) => {
}
<% } %>
export default new Router({
export function createRouter () {
return new Router({
mode: '<%= router.mode %>',
base: '<%= router.base %>',
linkActiveClass: '<%= router.linkActiveClass %>',
@ -62,3 +63,4 @@ export default new Router({
<%= _routes %>
]
})
}

View File

@ -7,11 +7,10 @@ import Vue from 'vue'
import { stringify } from 'querystring'
import { omit } from 'lodash'
import middleware from './middleware'
import { app, router<%= (store ? ', store' : '') %>, NuxtError } from './index'
import { createApp, NuxtError } from './index'
import { applyAsyncData, getMatchedComponents, getContext, promiseSeries, promisify, urlJoin } from './utils'
const isDev = <%= isDev %>
const _app = new Vue(app)
// This exported function will be called by `bundleRenderer`.
// This is where we perform data-prefetching to determine the
@ -19,6 +18,8 @@ const _app = new Vue(app)
// Since data fetching is async, this function is expected to
// return a Promise that resolves to the app instance.
export default context => {
const { app, router<%= (store ? ', store' : '') %> } = createApp(context)
const _app = new Vue(app)
// Add store to the context
<%= (store ? 'context.store = store' : '') %>
// Nuxt object

View File

@ -30,8 +30,11 @@ let storeData = {}
if (filenames.indexOf('./index.js') !== -1) {
let mainModule = getModule('./index.js')
if (mainModule.commit) {
store = mainModule
console.error('[nuxt.js] store/index.js should export raw store options instead of an instance.')
} else {
if (mainModule.state && typeof mainModule.state !== 'function') {
console.error('[nuxt.js] store state should be a function.')
}
storeData = mainModule
}
}
@ -49,8 +52,13 @@ if (store == null) {
name = namePath.pop()
module[name] = getModule(filename)
module[name].namespaced = true
if (typeof module[name].state !== 'function') {
console.error('[nuxt.js] store module state should be a function.')
}
}
store = new Vuex.Store(storeData)
}
export default store
export function createStore () {
return new Vuex.Store(storeData)
}

View File

@ -488,7 +488,8 @@ function createRenderer (bundle, manifest) {
}
this.renderer = createBundleRenderer(bundle, Object.assign({
cache: cacheConfig,
clientManifest: manifest
clientManifest: manifest,
runInNewContext: false
}, this.options.ssr))
this.renderToString = pify(this.renderer.renderToString)
this.renderToStream = this.renderer.renderToStream