基于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脚本判断手机浏览器类型跳转WAP手机网站
Oct 16 Javascript
jQuery添加删除DOM元素方法详解
Jan 18 Javascript
AngularJs 动态加载模块和依赖
Sep 15 Javascript
浅谈Javascript事件对象
Feb 05 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
May 29 Javascript
基于JavaScript实现拖动滑块效果
Feb 16 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
Sep 19 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
Apr 17 Javascript
Angular请求防抖处理第一次请求失效问题
May 17 Javascript
微信小程序 弹窗输入组件的实现解析
Aug 12 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
微信小程序地图实现展示线路
Jul 29 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
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
详解Python3 pandas.merge用法
2019/09/05 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
用 python 进行微信好友信息分析
2020/11/28 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
师范生自荐信
2013/10/27 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
高中家长寄语
2014/04/02 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
维护民族团结演讲稿
2014/08/27 职场文书
创先争优活动承诺书
2014/08/30 职场文书
2014年少先队工作总结
2014/12/03 职场文书
美术教师个人总结
2015/02/06 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书