基于vue和react的spa进行按需加载的实现方法


Posted in Javascript onSeptember 29, 2018

基于vue和react的spa进行按需加载

由于最近打算将所有的管理系统采用同一套登陆方法,然后在登陆后进行系统的切换选择,不需要每个系统都去重新登陆一次,所以前端这边思考将所有的系统用一套spa的应用进行构建,但是各个系统的合并之后,打包后的代码应该是相当大的,单页需要一次性加载所有系统的资源,显得不合实际,所以打算将不同系统的资源进行分离,再选择后在加载该系统的相应资源。自己发现这个业务和每个系统的路由比较类似,因此将系统的配置基于vue-router或者react-router的基础进行按需加载处理。因此自己了解了一下按需加载的应用和配置方案。

基于该业务大家有其他解决方案欢迎交流( _O_ )

按需加载

随着单页应用的发展,整个系统的所有功能都集合在一个页面,该页面一次性加载所有的资源,随着系统的不断扩展,因此所加载的资源会不断的增大,虽然经过压缩处理,大大的减小了资源的内容量,但是不能从本质上减小资源内容的增多。

其实我们的模块对应不同的资源,就类似之前所做的多页系统,不同的页面加载对应的资源文件,所以可以参考之前的的多页系统的做法,在单页系统中根据不同的模块加载其对应的资源文件。就是用户当前需要用什么功能就只加载这个功能对应的代码,也就是所谓的按需加载。

如何按需加载

在单页应用做按需加载,一般采用以下原则

  • 把整个系统划分成一个个小功能,再按照功能的相关程度划分为几类。
  • 把每一类合并为一个Chunk,按需加载对应的Chunk
  • 对于首屏看到的内容直接放到入口Chunk中,以降低网页首次加载资源的个数
  • 对于其他的模块可以做按需加载。

被分割出去的代码的加载需要一定的机制去触发,也就是当用户即将操作到对应的功能时再去加载。被分割出去的代码的加载时机需要开发者根据自己系统的需求去衡量确定。
因为被分割出去的代码加载也需要一定的时间,所以可以提前做预加载处理。

import()

在开始下面的案例之前先了解一下import(),这里的import()不同于引入模块的import xxx from 'xxx',这里的import是指一个动态加载模块的函数,传入的参数就是相应的模块,但是import()会返回一个Promise对象,因此可以在import()完成后根据其状态进行处理。

//eg
import('/component/details').then(mod=>{
  console.log(mod)
},error=>{
  console.log(error)
})

vue按需加载的应用

1.模块分割

根据自己系统的情况,个人根据vue-router的模块来进行分割,

//roter配置的分割代码
import Vue from 'vue'
import Router from 'vue-router'
const listnav=()=> import('@/components/listnav')
const adminav=()=> import('@/components/adminav')
Vue.use(Router)
const router = new Router({
  routes:[{
    path:'/listnav',
    name:'listnav',
    component:listnav
  },
  {
    path:'/adminav',
    name:'adminav',
    component:adminav
  }
  ]
})
export default router

2.webpack输出文件配置

//webpack.base.conf.js
moudle.exports = {
  entry:{
    app:'./src/main.js'
  },
  output:{
    path:"../dist",
    filename:'js/[name].js',
    chunkFilename:'js/[name].js'
  }
}

react按需加载应用

1,模块分割

同样模块分割可采用react-router进行划分

//router配置分割代码
import React, {PureComponent, Component ,createElement} from 'react';
import {HashRouter as Router, Route,Link,withRouter} from 'react-router-dom';
import Home from "../component/home"
function getAsyncComponent(load) {
 return class AsyncComponent extends PureComponent {
  constructor(props) {
   super(props);
  }
  componentDidMount() {
   // 在高阶组件 DidMount 时才去执行网络加载步骤
   load().then(({default: component}) => {
   // 代码加载成功,获取到了代码导出的值,调用 setState 通知高阶组件重新渲染子组件
    this.setState({
     component,
    })
   });
  }
  render() {
   const {component} = this.state || {};
   // component 是 React.Component 类型,需要通过 React.createElement 生产一个组件实例
   return component ? createElement(component) : null;
  }
 }
}
const Routes = () =>(
  <HashRouter>
    <Route path="/home/:test" exact component={Home}/>
    <Route path='/details/:id' component={getAsyncComponent(
     // 异步加载函数,异步地加载 details组件
     () => import('../component/details')
    )}/>
  </HashRouter>
)
export default Routers;

2.webpack输出文件配置

//webpack.base.config.js
module.exports = {
  entry:{
    main: "../src/index.js", //入口文件
  },
  output:{
    path:"../dist",//出口文件
    filename:"js/[name].js",
    chunkFilename:"js/[name].js",
    publicPath: ''
  }
}

3.按需加载组件中的props传递

在按需加载划分后,按需加载的组件不能接收到传递来的props,因此不能通过this.props.match.params来获取router配置时所带入的参数。

解决方法利用react-router中的withRouter

可以在按需加载的组件中进行配置处理

//component/details.js
import React, { Component } from 'react';
import {withRouter} from 'react-router-dom';
class Details extends Component {
  constructor(props) {
    super(props);
  }
  render() {
    console.log(this.props)
    return (
      <div></div>
    )
  }
}
export default withRouter(Details);

参考链接

vue-router路由懒加载 [ https://router.vuejs.org/zh/guide/advanced/lazy-loading.html]

React按需加载[ http://webpack.wuhaolin.cn/4%E4%BC%98%E5%8C%96/4-12%E6%8C%89%E9%9C%80%E5%8A%A0%E8%BD%BD.html]

总结

以上所述是小编给大家介绍的基于vue和react的spa进行按需加载的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
Jan 29 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
jQuery设置指定网页元素宽度和高度的方法
Mar 25 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 Javascript
详解Javascript百度地图接口开发文档中的类和方法
Feb 07 Javascript
小程序实现单选多选功能
Nov 04 Javascript
vue组件tabbar使用方法详解
Nov 06 Javascript
详解jQuery-each()方法
Mar 13 jQuery
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
vue3.0搭配.net core实现文件上传组件
Oct 29 Javascript
原生微信小程序开发中 redux 的使用详解
Feb 18 Javascript
使用Vuex解决Vue中的身份验证问题
Sep 28 #Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 #Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
Sep 28 #Javascript
js实现点击展开隐藏效果(实例代码)
Sep 28 #Javascript
javascript中toFixed()四舍五入使用方法详解
Sep 28 #Javascript
对vue中v-if的常见使用方法详解
Sep 28 #Javascript
总结javascript三元运算符知识点
Sep 28 #Javascript
You might like
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
Python中的lstrip()方法使用简介
2015/05/19 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
python利用微信公众号实现报警功能
2018/06/10 Python
python中的tcp示例详解
2018/12/09 Python
python读取几个G的csv文件方法
2019/01/07 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
高校十八大报告感想
2014/01/27 职场文书
上班玩手机检讨书
2014/02/17 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
镇创先争优活动总结
2014/08/28 职场文书
分家协议书范本
2016/03/22 职场文书