一、传统的spa vue应用
- 安装vue-router
npm install vue-router
- 编写router-rules传入VueRouter构造函数创建router实例, 并全局注册vue-router
import Vue from 'vue'
import Router from 'vue-router'
import Foo from '../pages/foo.vue'
import Bar from '../pages/bar.vue'
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
Vue.use(Router)
const router = new VueRouter({
routes
})
- 在app.vue中使用router-link和router-view组件
<div id="app">
<h1>Hello App!</h1>
<p>
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<router-view></router-view>
</div>
- 将router实例传入createVueApp逻辑中的Vue构造函数,创建vue应用实例
const app = new Vue({
router
}).$mount('#app')
二、ssr vue应用
在ssr应用中引入vue-rouer,需要两个额外的两个事情。
- 避免全局污染,需要使用工厂模式创建vue-router。因为ssr应用中,所有用户的请求都是由一个server服务器处理的,不能共用一个vue-router实例,这样会造成混乱。
- 需要
所以ssr中引入vue-router就变成了这样
- 安装vue-router
npm install vue-router
- 编写一个根据router-rules创建router实例的工厂函数
import Vue from 'vue'
import Router from 'vue-router'
import Index from '../pages/index.vue'
import Detail from '../pages/detail.vue'
Vue.use(Router)
export default function createRouter() {
return new Router({
mode: 'history',
routes: [
{path: '/', component: Index},
{path: '/detail', component: Detail},
]
})
}
- 在app.vue中使用router-link和router-view组件
<div id="app">
<h1>Hello App!</h1>
<p>
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<router-view></router-view>
</div>
- 在createVueApp工厂函数,创建vue实例时加入router
import Vue from "vue";
import App from "./App.vue";
import createRouter from "../router/createRouter.js";
export default function createApp() {
const router = createRouter();
const app = new Vue({
router,
render: h => h(App),
});
return { app, router };
- 在entry-server.js中根据请求url返回创建vue实例,当router ready的时候返回。
import createApp from "./app";
export default context => {
return new Promise((resolve, reject) => {
const { app, router } = createApp();
router.push(context.url)
router.onReady(() => {
resolve(app);
}, reject)
});
};
|