著手優化我最先想到的是,打包,載入,速度,渲染,使用者體驗;所以我的也從這幾個詞開始入手。本次優化主要做了三件事,程式碼(vue),懶載入,骨架屏;還有很多會繼續做。。。
程式碼
打包 webpack
現在雖然開發是按照模組化開發,webpack也是遵循的模組打包的,但是打包是按照模組打包了嗎?
webpack先簡單說一下!webpack本就是分塊打包,所以不用過多注意。(JS引入了相同的庫和模組,這時候將公共的庫抽成一個JS檔案,就用CommonsChunkPlugin)
-
上程式碼!!!優化前
由於平時的不注意,程式碼中大量的元件引用都是用這種方式;可這樣就導致了首屏展示或第一次載入中,不用的元件也打包到了入口js中(app.js);得到的結果就是首屏js越來越大,載入時間也就長了;
-
優化
很簡單,改成非同步就好;
修改完成後打包,就可以看到效果;
- js檔案明顯增加了
- 頁面中head標籤中 同樣增加了js引入;
- 這裡需要注意的是js引入放到head中會不會影響優化?其實不會的,因為引入的script標籤中加了async屬性使其變成了非同步; head標籤
程式碼
- 增加了v-if的使用,特別是針對所有不是頻繁切換元件和dom;而這麼做是因為v-if和v-show的區別;v-if是“true”條件渲染,v-show是什麼條件都渲染
- 元件非同步載入,也就打包部分的講到的;但是判斷元件是否非同步,就需要根據首屏展示的dom結構自行選擇,不是所有元件適合非同步載入;
- 為了評分也在圖片上,加上alt的預設引數;
骨架屏
骨架屏就很簡單了,按照使用頁面的結果編寫就ok了;
有個外掛:vue-content-loader 也可以線上編輯骨架屏;
但當前專案用了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);
複製程式碼
待續。。。