vue 一个简单的项目 之四 最终 异步组件实现按需加载

本文讲解如何在Vue项目中使用异步组件来提升性能,通过按需加载减少初始加载时间,详细介绍了修改router配置实现异步加载的方法及注意事项。

vue 中异步组件的使用

合理使用异步组件,能提升vue 项目的性能。

上篇,我们完成了项目的打包编译。项目文件中,多了一个文件夹dist , 这个文件夹的内容就是编译后的内容。

如下。css 目录下两个文件,.map 是一个source map 文件,目的是为了帮助调试被压缩过的css代码,它的意义是帮助我们在开发的时候调试使用。真正打包在线上有用的文件是里面的.css 文件。

上图,js 文件里,.map 文件依然是source map 文件,辅助文件。有用的文件就是 app.*.js, manifest.*.js, vendor.*.js。manifest.*.js 可以理解为webpack 打包生成的配置文件,可以不关心它里面的代码。vendor.*.js 里面放的是,各个页面各个组件公用的一些代码,打包的过程中,webpack 会把这些公用代码打包到vender.*.js中。app.*.js里面放的是,各个页面的业务逻辑代码。

实际上,当我们处理异步组件的时候,主要是处理app.*.js 。

当我们没有做异步组件的时候,app.*.js 在最初加载的时候,会把项目所有的页面的逻辑代码,全都加载。当项目很大的时候,就会非常影响性能了。

我们回到开发环境,启动服务器 npm run start

进入项目,查看network 可以看到,app.js (它是一次性加载的,跳转别的页面不会重新加载)

下面我们,要将它改成按需加载,也就是使用异步组件。

我们进入 src/router 目录下的index.js 文件

之前的index.js 文件如下

import Vue from 'vue'
import Router from 'vue-router'
import Home from '@/pages/home/Home.vue'
import City from '@/pages/city/City.vue'
import Detail from '@/pages/detail/Detail.vue'
Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    }, {
      path: '/city',
      name: 'City',
      component: City
    }, {
      path: '/detail/:id',
      name: 'Detail',
      component: Detail
    }
  ],
  scrollBehavior (to, from, savedPosition) {
    return { x: 0, y: 0 }
  }
})

我们修改之后,就可以实现按需加载了。

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

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: () => import('@/pages/home/Home.vue')
    }, {
      path: '/city',
      name: 'City',
      component: () => import('@/pages/city/City.vue')
    }, {
      path: '/detail/:id',
      name: 'Detail',
      component: () => import('@/pages/detail/Detail.vue')
    }
  ],
  scrollBehavior (to, from, savedPosition) {
    return { x: 0, y: 0 }
  }
})

如下,app.js 就是公用的一些和配置的一些js, 1.js 是首页的业务逻辑代码。

但是,从上面两张图中的时间轴可以看到。使用了异步组件,首页完全加载的时间反而更长。这是因为,ajax 请求也挺耗时的。

当我们 app.*.js 没有很大的时候,不建议使用异步组件。因为使用异步组件,会发送更过的ajax 请求,这也会耗费时间!

### Vue 组件按需加载异步组件的原理对比 #### 一、Vue 组件按需加载的原理 Vue 组件按需加载是一种通过动态导入(dynamic import)技术实现的技术方案。它的主要目的是只在需要的时候加载指定的组件,而非一次性将所有组件都打包到主文件中。这种机制依赖于 Webpack 的代码分割功能。 当开发者使用 `import()` 函数引入组件时,Webpack 会识别此操作并将其转化为一个独立的 chunk 文件[^1]。这样做的好处在于减少了初始加载时间,因为不需要的组件不会被提前加载。 以下是典型的按需加载实现方法: ```javascript // 定义路由表时采用按需加载形式 const Home = () => import('./views/Home.vue'); const About = () => import('./views/About.vue'); const routes = [ { path: '/home', component: Home }, { path: '/about', component: About } ]; ``` 在这里,`Home.vue` 和 `About.vue` 不会在应用启动时一起加载,而是分别在其对应的路径被访问时才加载[^4]。 --- #### 二、Vue 异步组件的原理 Vue 异步组件则是 Vue 自身提供的一种机制,允许开发者以一种声明式的方式来定义何时以及如何加载组件。其底层依然可能借助动态导入来实现,但更注重的是对加载过程的状态管理(如加载状态、错误处理等)。 在 Vue2 中,可以通过返回一个 Promise 的工厂函数来定义异步组件;而在 Vue3 中,则进一步封装为 `defineAsyncComponent` 方法[^2]。 以下是一个 Vue2 中的异步组件示例: ```javascript const AsyncComponent = () => ({ // 动态导入目标组件 component: import('./MyComponent.vue'), // 加载期间显示的占位组件 loading: { template: '<div>Loading...</div>' }, // 错误状态下显示的替代组件 error: { template: '<div>Failed to load</div>' }, // 延迟加载的时间阈值 (毫秒) delay: 200, // 超时时间 (毫秒),超过则显示 error 组件 timeout: 3000 }); ``` 在此案例中,Vue 提供了一套完整的生命周期钩子和状态切换逻辑,使开发人员可以优雅地应对各种异常情况。 --- #### 三、两者的相似之处 1. **均基于动态导入**:无论是按需加载还是异步组件,它们的核心思想都是利用 ES Module 的 `import()` 方法来进行条件性的模块加载。 2. **减少首屏加载量**:两者都能有效降低初次渲染所需的资源大小,从而加快页面打开速度[^3]。 3. **支持懒加载模式**:二者都能够实现在特定条件下才去获取对应的内容,而不是一开始就全部加载完毕。 --- #### 、两者的差异分析 | 特性 | 按需加载 | 异步组件 | |-------------------------|-------------------------------------------|------------------------------------------| | **适用范围** | 更适合全局层面的操作,比如路由配置 | 局部化更强,适用于单个组件级别的需求 | | **复杂度** | 较低 | 略高,涉及更多选项设置 | | **框架耦合程度** | 无强绑定 | 需要遵循 Vue 的 API | | **额外功能支持** | 单纯关注模块划分 | 包含加载指示器、超时保护等功能 | 具体来说: - **按需加载**侧重于整个系统的架构设计,常用于配合路由器或者插件库做精细化控制; - **异步组件**则聚焦于单一组件的行为定制,提供更多关于加载流程上的细节把控能力[^5]。 --- #### 五、总结 虽然 Vue 组件按需加载异步组件表面上看起来很像,但实际上各有侧重点——前者偏向宏观规划下的资源整合策略,后者则倾向于微观视角内的交互体验优化。理解这两者之间的区别有助于我们在实际项目开发过程中做出更为合理的决策。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值