着手优化我最早想到的是,打包,加载,速度,渲染,用户体验;因此个人也从这几个词开始入手。本次优化主要作了三件事,代码(vue),懒加载,骨架屏;还有不少会继续作。。。css
如今虽然开发是按照模块化开发,webpack也是遵循的模块打包的,可是打包是按照模块打包了吗?vue
webpack先简单说一下!webpack本就是分块打包,因此不用过多注意。(JS引入了相同的库和模块,这时候将公共的库抽成一个JS文件,就用CommonsChunkPlugin)webpack
上代码!!!优化前 git
可这样就致使了首屏展现或第一次加载中,不用的组件也打包到了入口js中(app.js);获得的结果就是首屏js愈来愈大,加载时间也就长了;github
优化web
很简单,改为异步就好;app
修改完成后打包,就能够看到效果;dom
骨架屏就很简单了,按照使用页面的结果编写就ok了;异步
有个插件:vue-content-loader 也能够在线编辑骨架屏;async
但当前项目用了ssr,首屏的骨架屏就鸡肋了!so 我就在第二屏及之后加上了骨架屏,而第三屏正好是一张特别大的详情图片,关键设计没有切成若干小图,是一大张,长,长长,长长长的详情图片!严重影响了页面的loading速度
懒加载作了一个组件,而代码是直接拿vue-lazy-component组件的;方便修改和调试;
vue-lazy-component代码
主要用了原生的IntersectionObserver(交叉观察器)构造函数;
var io = new IntersectionObserver(callback, option);
复制代码
IntersectionObserver函数
解释:监听目标元素与视口产生一个交叉区
介绍直接代码
let io = null;
// 回调函数
var callback = function(entries) {
if (
// 正在交叉
entries[0].isIntersecting ||
// 交叉率大于0
entries[0].intersectionRatio
) {
// 在组件销毁前取消观察-销毁方法
io.unobserve(this.$el);
}
};
// 观察视口与组件容器的交叉状况
io = new window.IntersectionObserver(callback, {
// 容器窗口,滚动的父元素
root: this.viewport,
// 能够在父级(root)影响范围 扩展或缩小,相似css的margin~
rootMargin,
// 触发回调的位置,“%”单位, [0, 0.25, 0.5, 0.75, 1]就表示当目标元素 0%、25%、50%、75%、100% 可见时,会触发回调函数。
threshold: [0, Number.MIN_VALUE, 0.01]
});
// 观察对象-挂载方法
this.io.observe(this.$el);
复制代码
待续。。。