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,86 +25,95 @@ Vue.use(Meta, {
tagIDKeyName: 'hid' // the property name that vue-meta uses to determine whether to overwrite or append a tag
})
if (process.browser) {
<% if (store) { %>
// Replace store state before calling plugins
if (window.__NUXT__ && window.__NUXT__.state) {
store.replaceState(window.__NUXT__.state)
}
<% } %>
// window.onNuxtReady(() => console.log('Ready')) hook
// Useful for jsdom testing or plugins (https://github.com/tmpvar/jsdom#dealing-with-asynchronous-script-loading)
window._nuxtReadyCbs = []
window.onNuxtReady = function (cb) {
window._nuxtReadyCbs.push(cb)
}
}
// 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,' : '') %>
_nuxt: {
defaultTransition: defaultTransition,
transitions: [ defaultTransition ],
setTransitions (transitions) {
if (!Array.isArray(transitions)) {
transitions = [ transitions ]
}
transitions = transitions.map((transition) => {
if (!transition) {
transition = defaultTransition
} else if (typeof transition === 'string') {
transition = Object.assign({}, defaultTransition, { name: transition })
} else {
transition = Object.assign({}, defaultTransition, transition)
}
return transition
})
this.$options._nuxt.transitions = transitions
return transitions
},
err: null,
dateErr: null,
error (err) {
err = err || null
if (typeof err === 'string') {
err = { statusCode: 500, message: err }
}
this.$options._nuxt.dateErr = Date.now()
this.$options._nuxt.err = err;
return err
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
if (window.__NUXT__ && window.__NUXT__.state) {
store.replaceState(window.__NUXT__.state)
}
},
...App
}
<% } %>
// window.onNuxtReady(() => console.log('Ready')) hook
// Useful for jsdom testing or plugins (https://github.com/tmpvar/jsdom#dealing-with-asynchronous-script-loading)
window._nuxtReadyCbs = []
window.onNuxtReady = function (cb) {
window._nuxtReadyCbs.push(cb)
}
}
// root instance
// here we inject the router and store to all child components,
// making them available everywhere as `this.$router` and `this.$store`.
let app = {
router,
<%= (store ? 'store,' : '') %>
ssrContext,
_nuxt: {
defaultTransition: defaultTransition,
transitions: [ defaultTransition ],
setTransitions (transitions) {
if (!Array.isArray(transitions)) {
transitions = [ transitions ]
}
transitions = transitions.map((transition) => {
if (!transition) {
transition = defaultTransition
} else if (typeof transition === 'string') {
transition = Object.assign({}, defaultTransition, { name: transition })
} else {
transition = Object.assign({}, defaultTransition, transition)
}
return transition
})
this.$options._nuxt.transitions = transitions
return transitions
},
err: null,
dateErr: null,
error (err) {
err = err || null
if (typeof err === 'string') {
err = { statusCode: 500, message: err }
}
this.$options._nuxt.dateErr = Date.now()
this.$options._nuxt.err = err;
return err
}
},
...App
}
// Includes & Inject external plugins
<% plugins.forEach(function (plugin) {
if (plugin.ssr) { %>
<%= (plugin.injectAs ? 'let ' + plugin.injectAs + ' = ' : '') %>require('<%= plugin.src %>')
<% if (plugin.injectAs) { %>
<%= plugin.injectAs + ' = ' + plugin.injectAs + '.default || ' + plugin.injectAs %>
app['<%= plugin.injectAs %>'] = <%= plugin.injectAs %>
<% }
} else { %>
if (process.browser) {
// Includes & Inject external plugins
<% plugins.forEach(function (plugin) {
if (plugin.ssr) { %>
<%= (plugin.injectAs ? 'let ' + plugin.injectAs + ' = ' : '') %>require('<%= plugin.src %>')
<% if (plugin.injectAs) { %>
<%= plugin.injectAs + ' = ' + plugin.injectAs + '.default || ' + plugin.injectAs %>
app['<%= plugin.injectAs %>'] = <%= plugin.injectAs %>
<% } %>
}
<% }
}) %>
<% }
} else { %>
if (process.browser) {
<%= (plugin.injectAs ? 'let ' + plugin.injectAs + ' = ' : '') %>require('<%= plugin.src %>')
<% if (plugin.injectAs) { %>
<%= plugin.injectAs + ' = ' + plugin.injectAs + '.default || ' + plugin.injectAs %>
app['<%= plugin.injectAs %>'] = <%= plugin.injectAs %>
<% } %>
}
<% }
}) %>
export { app, router<%= (store ? ', store' : '') %>, NuxtError }
return { app, router<%= (store ? ', store' : '') %> }
}

View File

@ -53,12 +53,14 @@ const scrollBehavior = (to, from, savedPosition) => {
}
<% } %>
export default new Router({
mode: '<%= router.mode %>',
base: '<%= router.base %>',
linkActiveClass: '<%= router.linkActiveClass %>',
scrollBehavior,
routes: [
<%= _routes %>
]
})
export function createRouter () {
return new Router({
mode: '<%= router.mode %>',
base: '<%= router.base %>',
linkActiveClass: '<%= router.linkActiveClass %>',
scrollBehavior,
routes: [
<%= _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