从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 相关文章推荐
JavaScript 32位整型无符号操作示例
Dec 08 Javascript
学习Angularjs分页指令
Jul 01 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
Mar 03 Javascript
彻底理解js面向对象之继承
Feb 04 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 Javascript
elementUI select组件默认选中效果实现的方法
Mar 25 Javascript
Vue触发隐藏input file的方法实例详解
Aug 14 Javascript
Vue 开发必须知道的36个技巧(小结)
Oct 09 Javascript
Vue中watch、computed、updated三者的区别及用法
Jul 27 Javascript
JS变量提升及函数提升实例解析
Sep 03 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
Sep 21 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
关于Python的一些学习总结
2018/05/25 Python
flask入门之表单的实现
2018/07/18 Python
pandas重新生成索引的方法
2018/11/06 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
python实现横向拼接图片
2020/03/23 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
体育教师工作总结的自我评价
2013/10/10 职场文书
师范大学音乐表演专业求职信
2013/10/23 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
语文课外活动总结
2014/08/27 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
初中语文教学反思范文
2016/03/03 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP
Python基础之字符串格式化详解
2021/04/21 Python