从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 相关文章推荐
Mootools 1.2教程 输入过滤第二部分(字符串)
Sep 15 Javascript
javascript 防止刷新,后退,关闭
Aug 07 Javascript
js getBoundingClientRect() 来获取页面元素的位置
Nov 25 Javascript
JS性能优化笔记搜索整理
Aug 21 Javascript
JAVASCRIPT函数作用域和提前声明 分享
Aug 22 Javascript
javascript实现youku的视频代码自适应宽度
May 25 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
Jan 19 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
微信小程序向Java后台传输参数的方法实现
Dec 10 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
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python 获取et和excel的版本号
2009/04/09 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
基于django传递数据到后端的例子
2019/08/16 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
python退出循环的方法
2020/06/18 Python
Python Merge函数原理及用法解析
2020/09/16 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
三年级评语大全
2014/04/23 职场文书
公司回复函格式
2015/07/14 职场文书
深入理解go slice结构
2021/09/15 Golang
Python编写冷笑话生成器
2022/04/20 Python