vue2组件实现懒加载浅析


Posted in Javascript onMarch 29, 2017

vue2组件实现懒加载浅析

一、 什么是懒加载

懒加载也叫延迟加载,即在需要的时候进行加载,随用随载。

二、为什么需要懒加载

在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,延时过长,不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时

三、如何与webpack配合实现组件懒加载

1、在webpack配置文件中的output路径配置chunkFilename属性

output: {

    path: resolve(__dirname, 'dist'),

    filename: options.dev ? '[name].js' : '[name].js?[chunkhash]',

    chunkFilename: 'chunk[id].js?[chunkhash]',

    publicPath: options.dev ? '/assets/' : publicPath

  },

chunkFilename路径将会作为组件懒加载的路径

2、配合webpack支持的异步加载方法

  • resolve => require([URL], resolve), 支持性好
  • () => system.import(URL) , webpack2官网上已经声明将逐渐废除, 不推荐使用
  • () => import(URL), webpack2官网推荐使用, 属于es7范畴, 需要配合babel的syntax-dynamic-import插件使用, 具体使用方法如下
npm install --save-dev babel-core babel-loader babel-plugin-syntax-dynamic-import babel-preset-es2015
use: [{

    loader: 'babel-loader',

    options: {

     presets: [['es2015', {modules: false}]],

     plugins: ['syntax-dynamic-import']

    }

   }]

四、具体实例中实现懒加载

1、路由中配置异步组件

export default new Router({

  routes: [

    {

      mode: 'history',

      path: '/my',

      name: 'my',

      component: resolve => require(['../page/my/my.vue'], resolve),//懒加载

    },

  ]

})

2、实例中配置异步组件

components: {

    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载

    //historyTab: () => import('../../component/historyTab/historyTab.vue')

  },

3、全局注册异步组件

Vue.component('mideaHeader', () => {

  System.import('./component/header/header.vue')

})

五、配置异步组件实现懒加载的问题分析

1、多次进出同一个异步加载页面是否会造成多次加载组件?

答:否,首次需要用到组件时浏览器会发送请求加载组件,加载完将会缓存起来,以供之后再次用到该组件时调用

2、在多个地方使用同一个异步组件时是否造成多次加载组件?如:

//a页面

export default {

  components: {

    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载

  },

}
//b页面

export default {

  components: {

    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载

  },

}

答:否,理由同上

3、如果在两个异步加载的页面中分别同步与异步加载同一个组件时是否会造成资源重用? 如:

//a页面
import historyTab from '../../component/historyTab/historyTab.vue';
export default {
  components: {
    historyTab
  },
}

//b页面
export default {
  components: {
    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载
  },
}

答: 会, 将会造成资源重用, 根据打包后输出的结果来看, a页面中会嵌入historyTab组件的代码, b页面中的historyTab组件还是采用异步加载的方式, 另外打包chunk;

解决方案: 组件开发时, 如果根页面没有导入组件的情况下,而是在其他异步加载页面中同时用到组件, 那么为实现资源的最大利用,在协同开发的时候全部人都使用异步加载组件

4、在异步加载页面中载嵌入异步加载的组件时对页面是否会有渲染延时影响?

答:会, 异步加载的组件将会比页面中其他元素滞后出现, 页面会有瞬间闪跳影响;

解决方案:因为在首次加载组件的时候会有加载时间, 出现页面滞后, 所以需要合理的进行页面结构设计, 避免首次出现跳闪现象;

六、懒加载的最终实现方案

1、路由页面以及路由页面中的组件全都使用懒加载

优点:(1)最大化的实现随用随载

 (2)团队开发不会因为沟通问题造成资源的重复浪费

缺点:(1)当一个页面中嵌套多个组件时将发送多次的http请求,可能会造成网页显示过慢且渲染参差不齐的问题

2、路由页面使用懒加载, 而路由页面中的组件按需进行懒加载, 即如果组件不大且使用不太频繁, 直接在路由页面中导入组件, 如果组件使用较为频繁使用懒加载

优点:(1)能够减少页面中的http请求,页面显示效果好

缺点:(2)需要团队事先交流, 在框架中分别建立懒加载组件与非懒加载组件文件夹

3、路由页面使用懒加载,在不特别影响首页显示延迟的情况下,根页面合理导入复用组件,再结合方案2

优点:(1)合理解决首页延迟显示问题

        (2)能够最大化的减少http请求, 且做其他他路由界面的显示效果最佳

缺点:(1)还是需要团队交流,建立合理区分各种加载方式的组件文件夹

七、采用第三种方案进行目录结构设计

vue2组件实现懒加载浅析

八、具体代码实现设计

1、路由设计:

import Router from 'vue-router';
import Vue from 'vue';
Vue.use(Router);

export default new Router({
  routes: [
    {
      mode: 'history',
      path: '/home',
      name: 'home',
      component: resolve => require([URL], resolve),//懒加载
      children: [
        {
          mode: 'history',
          path: '/home/:name',
          name: 'any',
          component: resolve => require(['../page/any/any.vue'], resolve),//懒加载
        },
      ]
    },
    {
      mode: 'history',
      path: '/store',
      name: 'store',
      component: resolve => require(['../page/store/store.vue'], resolve),//懒加载,
      children: [
        {
          mode: 'history',
          path: '/store/:name',
          name: 'any',
          component: resolve => require(['../page/any/any.vue'], resolve),//懒加载
        },
      ]
    },
    {
      mode: 'history',
      path: '/my',
      name: 'my',
      component: resolve => require(['../page/my/my.vue'], resolve),//懒加载,
      children: [
        {
          mode: 'history',
          path: '/my/:name',
          name: 'any',
          component: resolve => require(['../page/any/any.vue'], resolve),//懒加载
        },
      ]
    },
  ]
})

(1)首层的路由根组件分别对应的tab页面

(2)根目录后跟着各个子路由页面,子路由采用动态路由配合路由的编程式导航再加上vuex,最优化提高开发效率

直接贴上代码:

/**

 * Created by ZHANZF on 2017-3-20.

 */

//vuex配置

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({

  state: {

    //路由组件存储器

    routers: {}

  },

  getters: {

    routers: state => {

      return state.data;

    }

  },

  mutations: {

    //动态增加路由

    addRouter: (state, data) => {

      state.routers = Object.assign({}, state.routers, {

        [data.name]: data.component

      });

    }

  },

  actions: {

    acMethods({commit}) {

 

    }

  },

})

 

//根目录中注册路由组件

window.midea = {

  registerRouter(name, component) {

    Store.commit('addRouter', {

      name: name,

      component: component

    })

  }

};//页面使用路由导航 

openAnyPage() {
  midea.registerRouter('module', resolve => {require(['../module/module.vue'], resolve)});//懒加载
  this.$router.push({path: '/home/module', query: {title: this.title}});
}
//页面中使用动态组件 

<template>  

 <component :is="currentRouter" :moduleName="title">

</component> 

</template>

<script src="./any.js">

export default {

  data () {

    return {

      routeName: '',

      currentRouter: '',

      title: '',

    }

  },

  created() {

    this.routeName = this.$route.params.name;

    this.title = this.$route.query.title;

    this.currentRouter = this.$store.state.routers[this.routeName];

  },

  methods: { 

  }

}

</script>

vue2组件实现懒加载浅析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
Jul 13 Javascript
javascript函数以及基础写法100多条实用整理
Jan 13 Javascript
JavaScript包装对象使用介绍
Aug 29 Javascript
js字符串截取函数substr substring slice使用对比
Nov 27 Javascript
javascript 获取网页标题代码实例
Jan 22 Javascript
jquery根据锚点offset值实现动画切换
Sep 11 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
jQuery滑动到底部加载下一页数据的实例代码
May 22 jQuery
layui table去掉右侧滑动条的实现方法
Sep 05 Javascript
vue 取出v-for循环中的index值实例
Nov 09 Javascript
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
整理关于Bootstrap排版的慕课笔记
Mar 29 #Javascript
如何使用Bootstrap创建表单
Mar 29 #Javascript
Bootstrap 响应式实用工具实例详解
Mar 29 #Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 #jQuery
利用js查找数组中指定元素并返回该元素的所有索引示例
Mar 29 #Javascript
jQuery实现简单漂亮的Nav导航菜单效果
Mar 29 #jQuery
jQuery实现的手风琴侧边菜单效果
Mar 29 #jQuery
You might like
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
javascript 模拟点击广告
2010/01/02 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
Python文件操作基本流程代码实例
2017/12/11 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
读书之星事迹材料
2014/05/12 职场文书
企业文明单位申报材料
2014/05/16 职场文书
科技节口号
2014/06/19 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书