vue——懒加载(异步延迟和彻底懒加载)

引入问题

单页面应用的致命问题: 首屏加载极慢

原因:
脚手架默认把所有组件集中打包为一个巨大的app.js文件,
首屏一次性全部下载。


本章教程皆以Vue脚手架初始示例为例:

npm run serve:
这里的app.js就包含了所有的组件(Home.vue和About.vue),此时文件大小124KB《在这里插入图片描述
npm run build:(打包项目)
可以看到app.js中也会包含所有组件
在这里插入图片描述


所以我们应该采用优化策略——懒加载
(用户想看什么就只下载什么,用户暂时不想看的,就没必要下载!)

一、默认: 异步延迟加载

定义:
先下载并显示首页内容。其它页面组件在不影响主屏下载速度的情况下进行 异步下载

优点: 既加快首屏加载的速度,又能享受单页面应用带来的好处。
缺点: 偷跑流量

步骤:

  1. 千万不要在router/index.js开头过早的引入除首页之外的其它页面组件。
    凡是用Import引入的东西,vue都会打包在app.js中,在首屏下载。

  2. 改造路由字典项:

		{
			  path:"/相对路径", 
			  //使用匿名函数自调
			  component: ()=>import(
				   // 打包时的分段名:自定义js文件名.xxx.js
				   /* webpackChunkName: "自定义js文件名" */
				   "../views/页面组件.vue"
			  )
		}

结果图解

使用异步延迟加载后:

npm run build(打包项目):
可以看到使用异步延迟后,打包后的js分为了两个,一个是About.xxx.js,一个是Home.xxx.js
在这里插入图片描述
异步延迟加载的文件后 rel = "prefetch"异步先获得,但不需要立刻加载显示
在这里插入图片描述


npm run serve:
在首页时也异步下载两个js文件,一个是Home.vue组件,114KB;一个是About.vue组件,12.6KB
此时突出缺点:用户未点开About组件但已经下载,浪费流量
在这里插入图片描述

二、彻底懒加载(手动配置)

定义:
如果用户不请求下一个页面组件,则不会提前下载其他页面组件

优点: 节约流量.
缺点: 首次切换页面时需要临时下载页面组件,可能会慢

步骤

1. 实现异步延迟加载的两步

i. 不要提前引入
ii. component变成匿名箭头函数

		{
			  path:"/相对路径", 
			  //使用匿名函数自调
			  component: ()=>import(
				   // 打包时的分段名:自定义js文件名.xxx.js
				   /* webpackChunkName: "自定义js文件名" */
				   "../views/页面组件.vue"
			  )
		}

2. 配置脚手架,去掉prefetch

i 在脚手架根目录,创建vue.config.js
ii. 在vue.config.js中添加以下固定代码
iii. 强调: 必须重启npm run serve

		module.exports={
			  chainWebpack:config=>{
				    config.plugins.delete("prefetch")
				    //删除index.html开头的带有prefetch属性的link
				    //不要异步下载暂时不需要的页面组件文件
			  }
		}

结果图解

npm run build(打包项目):
dist/js 中的js文件跟异步延迟加载一样,仍为两个
在这里插入图片描述
但是index.html中少了rel = "prefetch"属性的link
在这里插入图片描述
npm run serve:
打开首页时,只有app.js文件下载(Home组件)
在这里插入图片描述
切换成About组件时,才开始下载about.js
在这里插入图片描述

### Vue 组件懒加载的实现方法 在 Vue 中,可以通过多种方式来实现组件懒加载功能。以下是几种常见的实现方法及其具体细节。 #### 方法一:通过 `import()` 动态导入语法 动态导入是一种现代 JavaScript 的特性,允许按需加载模块。这种方式可以用于定义异步组件并实现懒加载效果[^2]。 ```javascript <template> <div class="hello"> <!-- 使用 v-if 控制组件渲染 --> <Suspense> <AsyncComponent /> </Suspense> </div> </template> <script> export default { components: { AsyncComponent: defineAsyncComponent(() => import('./components/One.vue')) // 懒加载 One.vue }, }; </script> ``` 上述代码展示了如何利用 `defineAsyncComponent` ES6 的 `import()` 函数创建一个异步组件。当该组件被首次访问时,才会触发实际的加载过程。 --- #### 方法二:使用 `require.ensure` (适用于 Webpack) 对于旧版本项目或者特定场景下不支持 `import()` 的环境,也可以采用 `require.ensure` 来完成类似的懒加载操作[^3]: ```javascript <template> <div class="hello"> <LazyLoadedComponent></LazyLoadedComponent> </div> </template> <script> const LazyLoadedComponent = () => new Promise((resolve, reject) => { require.ensure([], function(require) { resolve(require('./LazyLoadedComponent').default); }); }); export default { components: { LazyLoadedComponent, }, }; </script> ``` 此方法虽然较为传统,但在某些情况下仍然非常实用。 --- #### 方法三:基于条件判断 (`v-if`) 或者 `is` 属性配合计算属性 如果希望更灵活地控制何时加载某个子组件,则可借助模板指令如 `v-if` 结合状态变量;或者是运用 Vue 提供的动态组件机制——即设置 `<component>` 标签并通过其绑定名为 `is` 的特殊 prop 值: ##### 利用 `v-if` ```html <!-- ParentComponent.vue --> <div id="app"> <button @click="loadChild">Load Child Component</button> <child-component v-if="showChild"></child-component> <!-- 只有 showChild === true 才会实例化 child-component--> </div> <script> let ChildComponent = null; function loadChild() { this.showChild = false; if (!ChildComponent) { ChildComponent = () => import('./ChildComponent'); // 首次点击按钮才执行懒加载逻辑 } } export default { data() { return { showChild: false }; }, methods: { loadChild }, components: { ChildComponent }, }; </script> ``` ##### 应用 `is` 属性与 computed 计算器 ```js // ExampleParent.vue computed: { currentView() { const viewName = this.route.params.component || 'Default'; switch(viewName){ case 'lazy': return ()=>import(`@/${viewName}Component`); default : return DefaultComponent ; } } }, render(h){return h(this.currentView)} ``` 以上两种方案均能有效减少初始页面体积,并提升应用性能表现^. --- ### 总结 综上所述,在 Vue 开发过程中可以根据实际情况选用不同的技术手段达成组件级别的延迟加载目标。无论是现代化推荐使用的 `import()` 方式还是兼容性更强的传统解决方案都有各自适用范围以及优缺点所在[^1][^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你脸上有BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值