在entry-server中需要做的事情就是需要把app.js导入进来,这里可以向上翻一下app.js中保存的是创建vue实例的方法。首先在里面写入一个函数,至于为什么就不多说了(同样也是为了保证每次访问都有一个新的实例),这个函数接收一个参数([object]),由于这里考虑到可能会有异步操作(如懒加载),在这个函数中使用了Promise,在Promise中首先要拿到连个东西,不用猜也是能想到的,很重要的vue实例和router实例,so~但是在app中好像只导出了vue实例,还要根据当前所需要的去更改app.js。
app.js:
const Vue = require("vue");
const createRouter = require("./router")module.exports = (context) => {
const router = createRouter();
const app = new Vue({
router,
data:{
message:"Hello,Vue SSR!"
},
template:`
<div>
<h1>{{message}}</h1>
<ul>
<li>,
<router-link to="/">首页<router-link/>
</li>
<li>
<router-link to="/about">关于我<router-link/>
</li>
</ul>
</div>
<router-view></router-view>
`
});
return {
app,
router
}
}
通过上面的改造之后,就可以在entry-server.js中轻松的拿到vue和router的实例了,现在查看一下当前entry-server.js中有那些可用参数,vue,router,提及到的URL从哪里来?既然这个函数是给服务端使用的,那么当服务端去执行这个函数的时候,就可以通过参数形式传递进来,获取到我们想要的参数,我们假设这个参数叫做url,我们需要让路由去做的就是跳转到对应的路由中(这一步很重要),然后再把对router的实例挂载到vue实例中,然后再把vue实例返回出去,供vueServerRender消费。那么就需要导出这个函数,以供服务端使用。
由于我们不能预测到用户所访问的路由就是在vue-router中所配置的,所以需要在onReady的时候进行处理,我们可以通过router的getMatchedComponents这个方法,获取到我们所导入的组件,这些有个我们就可通过判断组件对匹配结果进行渲染。
entry-server.js
const createApp = require("./app.js");model.exports = (context) => {
return new Promise((reslove,reject) => {
let {url} = context;
let {app,router} = createApp(context);
router.push(url);
// router回调函数
// 当所有异步请求完成之后就会触发
router.onRady(() => {
let matchedComponents = router.getMatchedComponents();
if(!matchedComponents.length){










