路由懒加载
- 优化策略:
- 将路由对应的组件分割成小的代码块,只有在访问到该路由时才加载对应的组件,避免初始加载时加载过多不必要的代码,从而提升首屏加载性能。同时,合理设置路由懒加载的时机,不影响SEO爬虫对页面关键信息的抓取。
- 技术实现方案(Vue Router):
- 在Vue Router配置中,使用
import()
语法实现路由懒加载。例如:
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/home',
name: 'Home',
component: () => import(/* webpackChunkName: "home" */ './views/Home.vue')
},
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
}
]
});
import()
语法会告诉webpack将对应的组件代码分割成单独的chunk文件,在路由切换到该路径时才会加载。webpackChunkName
注释用于指定chunk文件的名称,方便代码管理和调试。
组件懒加载
- 优化策略:
- 对于非首屏关键组件,延迟加载这些组件,减少首屏渲染的工作量。同时,确保在组件加载过程中,页面的结构不会发生跳动,影响用户体验。并且要保证SEO相关的组件(如页面标题、元数据等)能够在初始渲染时正确加载,不影响搜索引擎抓取。
- 技术实现方案:
- 使用
vue - lazy - load
插件:
- 安装插件:
npm install vue - lazy - load --save
。
- 在Vue项目中引入并使用:
import Vue from 'vue';
import VueLazyload from 'vue - lazy - load';
Vue.use(VueLazyload, {
// 配置项
preLoad: 1.3,
error: require('@/assets/error.png'),
loading: require('@/assets/loading.gif'),
attempt: 1
});
<template>
<div>
<img v - lazy="imageUrl" />
</div>
</template>
<script>
export default {
data() {
return {
imageUrl: 'https://example.com/image.jpg'
};
}
};
</script>
- 异步组件(Vue内置):对于一般组件,可使用Vue的异步组件机制。例如:
const AsyncComponent = () => import('./components/AsyncComponent.vue');
export default {
components: {
AsyncComponent
}
};
<template>
<div>
<AsyncComponent />
</div>
</template>
数据预取
- 优化策略:
- 在服务器端渲染(SSR)过程中,提前获取页面所需的数据,避免在客户端等待数据加载,从而加快首屏渲染速度。同时,要确保预取的数据与SEO相关信息紧密结合,例如页面标题、描述等,让搜索引擎能够抓取到完整且准确的内容。
- 技术实现方案:
- 在Vuex中结合SSR进行数据预取:
- 在
nuxt.config.js
(以Nuxt.js为例,Nuxt.js是一个基于Vue.js的通用应用框架,对SSR支持良好)中配置服务器端数据获取逻辑。例如:
export default {
asyncData({ store, route }) {
return store.dispatch('fetchData', route.params.id);
}
};
- 在Vuex store中定义`fetchData` action:
export const actions = {
async fetchData({ commit }, id) {
const response = await axios.get(`https://api.example.com/data/${id}`);
commit('SET_DATA', response.data);
}
};
<template>
<div>
<div v - if="data">{{ data.title }}</div>
</div>
</template>
<script>
export default {
data() {
return {
data: null
};
},
async created() {
const response = await fetch('https://api.example.com/data');
this.data = await response.json();
}
};
</script>
- 这样在组件创建时就会预取数据,确保首屏渲染时数据已准备好,提升用户体验和SEO效果。同时,在SSR环境下,服务器端也可以执行相同的
fetch
逻辑来提前获取数据并注入到页面中。