从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 相关文章推荐
用Greasemonkey 脚本收藏网站会员信息到本地
Oct 26 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
Sep 05 Javascript
js获得当前系统日期时间的方法
May 06 Javascript
jQuery中prepend()方法使用详解
Aug 11 Javascript
js判断文本框输入的内容是否为数字
Dec 23 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
使用Vuex解决Vue中的身份验证问题
Sep 28 Javascript
layer.js之回调销毁对话框的例子
Sep 11 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
vue制作抓娃娃机的示例代码
Apr 17 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
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
js date 格式化
2017/02/15 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
Python import用法以及与from...import的区别
2015/05/28 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
python2.7到3.x迁移指南
2018/02/01 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Python socket 套接字实现通信详解
2019/08/27 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
社团活动策划书范文
2014/01/09 职场文书
迟到早退检讨书
2014/02/10 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
施工安全员岗位职责
2015/04/11 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
辩护词范文大全
2015/05/21 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript