Vue2.0 组件懒加载

原文:https://www.cnblogs.com/zhanyishu/p/6587571.html, 根据原文,做了相应的补充。请注意 ‘补充’后的说明非引自原文。

二、为什么需要懒加载

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

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

    1、在webpack配置文件中的output路径配置chunkFilename属性,chunkFilename 路径将会作为组件懒加载的路径。

output: {

    path: resolve(__dirname, 'dist'),

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

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

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

}

补充: Vue3 中在根目录下新增vue.config.js,配置如下:详情配置参照Vue3 webpack配置官网

...

module.exports = {

    path: '/', 

    configureWebpack:  (config) => {

        if(process.env.NODE_ENV == 'production') { 

            // 为生产环境修改配置

            config.mode = 'production';

            Oject.assign(config, {

                output: { 

                    ...config.output,

                    filename: `static/js/[name].[chunkhash].${version}.js`,

                    chunkFilename: `static/js/[name].[chunkhash].${version}.js`

                } 

                ...

            })

        }

    ...

}

    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']

        }      }]

补充: Vue3 中第三方插件配置在 pluginOptions中

四 具体实例中实现懒加载

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  Q:多次进出同一个异步加载页面是否会造成多次加载组件?

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

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

// page a

export default {

    components: {

        historyTab: resolve => {require(['url'], resolve)}

}}

// Page b

export default {

    components: {

        historyTab: resolve => {require(['url'], resolve)}

}}

    A: 否,理由同上

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

// Page a

import historyTab from '..url';

export default {

    components: {historyTab}

}

Page b

export default {

    components: {

        historyTab: resolve => { require(['.. Url'], resolve) }

}}

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

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

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

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

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

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

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

        优点: a  最大化的实现随用随载

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

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

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

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

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

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

        优点: 合理解决首页延迟显示问题;;能够最大化的减少http请求,且做其他路由页面的显示效果最佳

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

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

懒加载最终解决方案
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容