从0到1构建vueSSR项目之路由的构建


Posted in Javascript onMarch 07, 2019

vue开发依赖的相关配置

Vue SSR 指南

今天先做客户端方面的配置,明天再做服务端的部分。

那么马上开始吧~

修改部分代码

脚手架生成的代码肯定是不适合我们所用的 所以要修改一部分代码

//App.vue
<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'app'
}
</script>

<style>
  html,body,#app,#app>*{
    width: 100%;
    height: 100%;
  }
  body{
    font-family: 'Avenir', Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    font-size: 16px;
    margin: 0;
    overflow-x: hidden;
  }

  img{
    width: 200px;
  }
</style>

修改main.js

为什么要这么做?为什么要避免状态单例

main.js 是我们应用程序的「通用 entry」。

在纯客户端应用程序中,我们将在此文件中创建根 Vue 实例,并直接挂载到 DOM。

但是,对于服务器端渲染(SSR),责任转移到纯客户端 entry 文件。

main.js 简单地使用 export 导出一个 createApp 函数:

import Vue from 'vue';
Vue.config.productionTip = false;
import App from './App.vue';
//router store 实例
//这么做是避免状态单例
export function createApp() {

  const app = new Vue({
    //挂载router,store
    render: h => h(App)
  })
  //暴露app实例
  return { app };
}

添加Vue.config.js配置

webpack的入口文件有两个,一个是客户端使用,一个是服务端使用。

为何这么做?

今天只做客户端部分。

src/vue.config.js
  module.exports = {
    css: {
      extract: false//关闭提取css,不关闭 node渲染会报错
    },
    configureWebpack: () => ({
      entry: './src/entry/client'
    })
  }

根目录创建 entry 文件夹,以及webpack入口代码

mdkir entry
  cd entry
  创建 入口文件
    client.js 作为客户端入口文件。
    server,js 作为服务端端入口文件。 //先创建不做任何配置
  entry/client.js

    import { createApp } from '../main.js';

    const { app } = createApp();

    app.$mount('#app');

路由和代码分割

官方说明的已经很清楚了,我就不做过多介绍了,下面直接展示代码

添加新路由,这里将存放pages的相关路由

src/pages/router/index.js

/**
 *
 * @method componentPath 路由模块入口
 * @param {string} name 要引入的文件地址
 * @return {Object}
 */
function componentPath (name = 'home'){
  return {
    component:() => import(`../${name}/index.vue`)
  }
}

export default [
  {
    path: '/home',
    ...componentPath(),
    children: [
      {
        path: "vue",
        name: "vue",
        ...componentPath('home/vue')
      },
      {
        path: "vuex",
        name: "vuex",
        ...componentPath('home/vuex')
      },
      {
        path: "vueCli3",
        name: "vueCli3",
        ...componentPath('home/vueCli3')
      },
      {
        path: "vueSSR",
        name: "vueSSR",
        ...componentPath('home/vueSSR')
      }
    ]

  }
]

src/router.config.js作为路由的总配置 易于管理

//路由总配置
  import Vue from 'vue';
  import VueRouter from 'vue-router';

  Vue.use(VueRouter);
  //为什么采用这种做法。
  //如果以后有了别的大模块可以单独开个文件夹与pages平级
  //再这里导入即可。这样易于管理

  // pages
  import pages from './pages/router';

  export function createRouter() {
    return new VueRouter({
      mode: 'history',
      routes: [
        {
          path: "*",
          redirect: '/home/vue'
        },
        ...pages
      ]
    })
  }

更新main.js

import Vue from 'vue';
Vue.config.productionTip = false;
import App from './App.vue';
+ import { createRouter } from './router.config.js'
//router store 实例
//这么做是避免状态单例
export function createApp() {
+  const router = createRouter()
  const app = new Vue({
+    router,
    render: h => h(App)
  })
  //暴露app,router实例
  return { app, router };
}

更新 client.js

由于使用的路由懒加载,所以必须要等路由提前解析完异步组件,才能正确地调用组件中可能存在的路由钩子。

// client.js
import { createApp } from '../main.js';

const { app, router } = createApp();

router.onReady( () => {
  app.$mount('#app');
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js导出table到excel同时兼容FF和IE示例
Sep 03 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
Jun 17 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
Oct 16 Javascript
JS运动相关知识点小结(附弹性运动示例)
Jan 08 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
Thinkjs3新手入门之如何使用静态资源目录
Dec 06 Javascript
基于jquery.page.js实现分页效果
Jan 01 jQuery
bootstrap 弹出框modal添加垂直方向滚轴效果
Jul 09 Javascript
javaScript把其它类型转换为Number类型
Oct 13 Javascript
详解js location.href和window.open的几种用法和区别
Dec 02 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 29 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
Mar 07 #Javascript
js如何获取图片url的Blob值并预览示例代码
Mar 07 #Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 #Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
Mar 06 #Javascript
vue项目前端埋点的实现
Mar 06 #Javascript
vue2.0结合Element-ui实战案例
Mar 06 #Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
Mar 06 #Javascript
You might like
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
2012/10/03 PHP
php实现复制移动文件的方法
2015/07/29 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
js数组操作常用方法
2014/05/08 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
Python实现读取文件最后n行的方法
2017/02/23 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
城建学院毕业生自荐信
2014/01/31 职场文书
小学音乐教学反思
2014/02/05 职场文书
2014庆六一活动方案
2014/03/02 职场文书
电力安全事故反思
2014/04/27 职场文书
技校毕业生自荐信
2014/06/03 职场文书
设计专业自荐信
2014/06/19 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
大学学生个人总结
2015/02/15 职场文书
学习保证书怎么写
2015/02/26 职场文书
决心书格式范文
2015/09/23 职场文书
月考总结与反思
2015/10/22 职场文书
python 详解turtle画爱心代码
2022/02/15 Python