从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 相关文章推荐
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
Dec 04 Javascript
原生javascript实现匀速运动动画效果
Feb 26 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
Jun 07 Javascript
jQuery实现的跨容器无缝拖动效果代码
Jun 21 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
Dec 08 Javascript
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
vue todo-list组件发布到npm上的方法
Apr 04 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
Apr 16 Javascript
vue 中 beforeRouteEnter 死循环的问题
Apr 23 Javascript
封装微信小程序http拦截器过程解析
Aug 13 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
JS控制表格隔行变色
2006/06/26 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
python 多线程串行和并行的实例
2019/02/22 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
Python assert语句的简单使用示例
2019/07/28 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
长辈证婚人证婚词
2014/01/09 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
回复函范文
2015/07/14 职场文书
2016年公司新年寄语
2015/08/17 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis