UNPKG

generator-wxnode-boilerplate

Version:

Yeoman generator for wxnode boilerplate

68 lines (63 loc) 3.01 kB
import {createApp} from './main'; const isDev = process.env.NODE_ENV !== 'production'; // This exported function will be called by `bundleRenderer`. // This is where we perform data-prefetching to determine the // state of our application before actually rendering it. // Since data fetching is async, this function is expected to // return a Promise that resolves to the app instance. export default context => { return new Promise((resolve, reject) => { const s = isDev && Date.now(); const {url, cookie = '', ip, ua}: any = context; const {app, router, store} = createApp({cookie, ip, ua}); const {fullPath} = router.resolve(url).route; if (fullPath !== url) { return reject({url: fullPath}); } // 截取base路径,否则get不到Components // url = url.replace('/community', ''); // set router's location router.push(url); // wait until router has resolved possible async hooks router.onReady(() => { const matchedComponents: any = router.getMatchedComponents(); // no matched routes if (!matchedComponents.length) { return reject({code: 404}); } // Call fetchData hooks on components matched by the route. // A preFetch hook dispatches a store action and returns a Promise, // which is resolved when the action is complete and store state has been // updated Promise.all(matchedComponents.map(({options, asyncData}) => { // export default {} 写法 if (asyncData) { return asyncData({ store, route: router.currentRoute, routeFrom: null, }); } else if (options && options.asyncData) { return options.asyncData({ store, route: router.currentRoute, routeFrom: null, }); } else return Promise.resolve(); }, // vue.extend({}) 写法 )).then(() => { isDev && console.log(`data pre-fetch: ${Date.now() - s}ms`); // After all preFetch hooks are resolved, our store is now // filled with the state needed to render the app. // Expose the state on the render context, and let the request handler // inline the state in the HTML response. This allows the client-side // store to pick-up the server-side state without having to duplicate // the initial data fetching on the client. context.state = store.state; context.meta = (app as any).$meta(); resolve(app); }).catch(reject); }, reject); }); };