本篇文章记录对于项目中加载的一些优化相关处理。
1、路由懒加载
Vue
vue实现路由懒加载可以通过:
1、安装vue Router4,使用Vue Router的defineAsyncComponent函数或直接使用动态导入语法来懒加载组
件。
import { createRouter, createWebHistory } from 'vue-router';
// 使用动态导入语法实现懒加载
const Home = () => import(/* webpackChunkName: "home" */ '../views/Home.vue');
const About = () => import(/* webpackChunkName: "about" */ '../views/About.vue');
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
];
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes,
});
export default router;
React
在 React16 中我们通常在路由懒加载中Suspense配合 Lazy 组件一起使用
主要是:使用React.lazy()导入组件、利用Suspense组件包裹懒加载组件以及配置路由
第一步:引入react.lazy
const HomePage = React.lazy(() => import('./HomePage'));
利用React.lazy(),我们定义一个动态导入的组件,这段代码意味着HomePage组件将作为一个懒加载组件导入
第二步:使用suspense协调调用懒加载
React.lazy()允许我们动态导入组件,在组件加载期间,我们需要提供一个加载指示或者降级组件来改善用户体验。
Suspense: Suspense组件主要用于代码分割和延迟加载通过Suspense组件,可以实现在组件树中等待异步加载的组件,从而实现更好的用户体验
当异步加载的组件尚未完成加载时,Suspense会显示fallback指定的占位符内容
- 代码分割
- 延迟加载
- 错误处理
2、组件懒加载
比如弹窗用于懒加载的方式引入
const dialogInfo = () => import(/* webpackChunkName: "dialogInfo" */ '@/components/dialogInfo');
组件懒加载的使用场景
- 该页面的 JS 文件体积大,导致页面打开慢,可以通过组件懒加载进行资源拆分,
- 该组件不是一进入页面就展示,需要一定条件下才触发(比如弹框组件)
- 该组件复用性高,很多页面都有引入,利用组件懒加载抽离出该组件,一方面可以很好利用缓存,同时也可以减少页面的 JS 文件大小(比如表格组件、图形组件等)
3、使用骨架屏
现在很多h5/pc页面,都采用了骨架屏的方式,可以缩短白屏时间,提升用户体验。
4、JS 的加载方式
async、defer 是 script 标签的专属属性,对于网页中的其他资源,可以通过 link 的 preload、prefetch 属性来预加载
现在很多框架可以灵活配置,使用预加载的功能,现代框架已经将 preload、prefetch 添加到打包流程中了。
5、部分图片可以使用懒加载
懒加载:等滚动到可视区域的时候,再去加载图片。 压缩图片:在上线前把图片压缩 使用svg: 静态图可以换成svg的格式,减小体积 使用webp: 现在webp的格式兼容较好,体积也更小
6、使用防抖和节流
都是为了减少http请求,减轻客户端压力
7、适当使用memo-----React
react的渲染机制,只要父组件的state改变,那么不论子组件是否发生改变。子组件都会重新渲染。
这个问题可以由React中的memo解决。memo是一个缓存组件。使用memo包含子组件,那么在memo的依赖不改变的情况下。子组件不会随着父组件的渲染而重新渲染。
比如父组件如果不存在重新渲染的情况,那么子组件就没有必要用memo包含。
8、moment.js换成day.js
day.js的体积比moment.js小。moment.js有70多kb,但是day.js只有2kb。