如何打造一個全滿分網(wǎng)站?
作為一個全?;ヂ?lián)網(wǎng)工程師,我們的目標決不僅僅滿足于功能的實現(xiàn),而且要包括性能、安全、易用性等等各方面的考量。那么是否有一些可以公開評測的標準,使我們能夠準確地知道目前我們網(wǎng)站的質(zhì)量水平在全行業(yè)中處于什么樣的水平呢?隨著技術(shù)水平的不斷進步,網(wǎng)站評測方面的各種工具也在不斷演進。
工具
工欲善其事,必先利其器。
想要知道自己網(wǎng)站的質(zhì)量水平,憑想像和猜測是不行的,必須要有可以客觀衡量的工具。
YSlow
最早做這方面嘗試的是2012年誕生于Yahoo的YSlow,但是現(xiàn)在已經(jīng)逐漸淡出歷史舞臺。它的名稱實際上是英文Why Slow(為什么這么慢?)的縮寫,從它的名字你應(yīng)該能知道它是幫助站長解決網(wǎng)頁加載速度的工具。YSlow是一款瀏覽器插件,可以支持包括Chrome, Firefox, Safari等等主流瀏覽器。在瀏覽器上安裝相應(yīng)插件后,就可以對任意網(wǎng)站進行評測,最后給出一個總體評分。評測內(nèi)容包括網(wǎng)頁是否包含了過多的HTTP請求,JS和CSS是否經(jīng)過壓縮,是否采用CDN等等,主要是提供給站長一個優(yōu)化的方向和參考建議。
PageSpeed
在YSlow之后,Google推出了自己的網(wǎng)頁優(yōu)化建議工具PageSpeed Insights,這是一個網(wǎng)頁工具,你不需要像YSlow一樣下載插件和安裝,你只需要打開它的網(wǎng)頁,輸入任何你想測評的網(wǎng)址,就可以得到優(yōu)化建議了。
GTmetrix
我最常使用的工具不是以上兩款,而是一個名叫GTmetrix的網(wǎng)站,這個網(wǎng)站結(jié)合了以上兩個工具,給出了更加完整的建議。
Lighthouse
更強大而嚴格的工具還是Google推出的Lighthouse。這也是一款瀏覽器插件,不過目前只能用于Google自家的Chrome瀏覽器。它從4個方面對任何網(wǎng)站進行評測,包括性能、易用性、最佳實踐。我們下面將重點介紹如何能在這4個方面都完全滿足Google的要求。
優(yōu)化
GTMetrix
優(yōu)化的第一步,我們還是先從GTMetrix開始。一般網(wǎng)站常見的問題和建議如下:
CDN
通常情況下,你需要為你的網(wǎng)站開通CDN服務(wù),以確保在地理位置上離用戶最近的服務(wù)器可以優(yōu)先為用戶提供服務(wù)。提供CDN服務(wù)的廠商很多,而且價格并不昂貴,很多云服務(wù)商比如阿里云、百度云都有提供這方面的服務(wù)。
Enable gzip compression
這一項主要是檢查你的nginx服務(wù)器是否設(shè)置了gzip壓縮傳輸?shù)姆绞?。打開你的Chrome開發(fā)者工具,檢查Network標簽里每一個請求的Response header,看一下是否有content-encoding: gzip,如果沒有,說明你的網(wǎng)站沒有設(shè)置gzip傳輸。
解決方案:參照我的這篇文章《我的nginx鍋爐片》設(shè)置。
Add Expires headers
這一項也是很多網(wǎng)站缺失的配置,由于沒有給jpg圖片以及css和js設(shè)置合適的過期時間,導(dǎo)致每次訪問網(wǎng)站都需要重新從網(wǎng)站讀取內(nèi)容,這是很多網(wǎng)站訪問速度慢的原因。設(shè)置方式:同樣,參照上一節(jié)所提到的文章。
解決方案:參照我的這篇文章《我的nginx鍋爐片》設(shè)置。
圖片大小
很多情況下,或者是出于無知,或者是出于偷懶,工程師們傾向于把一張大圖用css方式縮小,例如這樣:width: 100px; height: 50px;。導(dǎo)致的結(jié)果是這張圖片在網(wǎng)頁上看起來似乎圖片縮小了,但實際上文件尺寸并沒有變小。這也是很多網(wǎng)站變慢的主因。
解決方法:參照我的這篇文章《用imgproxy自動縮放圖片》設(shè)置。
雪碧圖
如果你的頁面中有很多小圖標的時候,最糟糕的作法莫過于把它們?nèi)壳谐尚∷榈膉pg或者png,這樣會使你的頁面在加載時向服務(wù)器端發(fā)送很多次http請求,而每一次請求都有獨立的建立連接、傳輸數(shù)據(jù)、斷開連接的過程,非常浪費資源。
解決方案:如果可能的話,把這些圖標做成獨立的圖標字體文件。如果不行,則把它們壓縮成雪碧圖。
壓縮js和css
通常情況下,你剛剛寫完的js是下圖中左邊這種樣子的,而通常大公司網(wǎng)站的代碼是圖中右邊這樣的。
左邊的代碼人類閱讀沒有什么問題,但是你不應(yīng)該把它們就這樣在網(wǎng)絡(luò)中傳輸。第一,浪費流量;第二,你能讀得懂,你的友商也能讀得懂,不利于安全。
解決方案:你應(yīng)該把你的js/css/html進行丑化(uglify)和壓縮(minify)。
終極大法
以上所有這些修改建議聽上去都不錯,但是我要一個一個做下來太繁瑣怎么辦?也許你應(yīng)該考慮用一個現(xiàn)代的框架幫你自動完成這些事情,比如Angular/React/Vue,或者你自己使用Grunt/Gulp/Webpack完成所有這些事情。你知道這就是為什么前端工程師要學(xué)習(xí)框架的原因了吧?因為我的博客網(wǎng)站是全用Jekyll直接建在Github Pages上的,使用了CloudFlare做CDN,而它們已經(jīng)自動幫我完成了所有這些煩瑣的事情,所以起點比較高,很輕松就能在GTMetrix上得到99分的高分。
Lighthouse
在完成了GTMetrix的要求,能夠獲得99分以上的高分之后,我們還想要達到更高的標準,挑戰(zhàn)Google的Lighthouse滿分!
Lighthouse從以下4個方面對網(wǎng)頁做出評價,我們逐個來談。
漸進式Web應(yīng)用(Progressive Web Apps)
頭一項標準『漸進式Web應(yīng)用』,這個標準是Google自家發(fā)明的。其目的是為了讓網(wǎng)站能在網(wǎng)絡(luò)不暢通的情況下也能顯示基本內(nèi)容,或者上一次緩存的內(nèi)容,而不是給出一個難看的『網(wǎng)絡(luò)不通』的提示,并且能夠讓用戶像安裝普通應(yīng)用一樣直接把網(wǎng)頁安裝在手機上。PWA的終極理想是可以用網(wǎng)頁應(yīng)用來取代應(yīng)用,所以目前并不被Apple支持。Google官網(wǎng)給出了關(guān)于如何實現(xiàn)PWA的詳細指南,按照指南學(xué)習(xí)一步一步就可以構(gòu)建出你的第一個PWA網(wǎng)頁。建設(shè)完成后可以用Lighthouse來測試一下你的網(wǎng)頁到底有多符合PWA標準。
漸進式Web應(yīng)用標準共有11項。
下面重點介紹一下為了使一個網(wǎng)頁能滿足基本的PWA要求所必須要完成的工作:
manifest.json
首先,你的網(wǎng)站必須要有一個manifest.json文件,這個文件里描述了最基本的一些信息。比如我的網(wǎng)站的manifest.json文件是這樣的:
- {
- "name": "日新亭",
- "short_name": "日新亭",
- "description": "茍日新,日日新,又日新",
- "start_url": "/index.html",
- "orientation": "any",
- "icons": [{
- "src": "/assets/img/icons/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- }, {
- "src": "/assets/img/icons/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- }],
- "theme_color": "#000000",
- "background_color": "#000000",
- "display": "standalone"
- }
關(guān)于favicon圖片尺寸的選擇
由于各種設(shè)備各種操作系統(tǒng)各種瀏覽器的差異,連一個最簡單的favicon圖片的選擇都成了難題,每家廠商有描述各不相同,即使同一家廠商,也在各個不同的版本有不同的要求,比如Google Chrome在37版本以前要求196x196,37版本以后又要求192x192,而Apple官網(wǎng)又要求你提供至少4種尺寸:180x180, 167x167, 152x152, 120x120,Google TV要求96x96, 任務(wù)欄要求32x32,普通瀏覽器要求16x16,還不包括Windows桌面各種大中小型圖標的要求。面對如此紛繁復(fù)雜的要求,到底應(yīng)該怎么辦呢?一種方法是找個工具網(wǎng)站幫你解決這個難題,我推薦的網(wǎng)站是這里,因為作者對各種設(shè)備的favicon做過專門的研究;另一種做法是為簡單起見,按我的模板來,只需要做6種圖標就可覆蓋大部分設(shè)備,Apple只需要一種180x180,因為小設(shè)備會自動縮小,另外2種512x512和192x192是為Google準備的,還有3種適應(yīng)普通瀏覽器。
制作好圖標文件之后,在你的html頭部指定manifest.json文件的路徑,指定頁面的theme-color主題色,并且注意設(shè)定的主題顏色必須和頁面中的顏色相一致,然后指定圖標:
- <!-- Favicon -->
- <link rel="icon" type="image/png" href="/assets/img/icons/favicon-16x16.png" sizes="16x16">
- <link rel="icon" type="image/png" href="/assets/img/icons/favicon-32x32.png" sizes="32x32">
- <link rel="icon" type="image/png" href="/assets/img/icons/favicon-96x96.png" sizes="96x96">
- <!-- Apple Touch Icons -->
- <link rel="apple-touch-icon" href="/assets/img/icons/apple-touch-icon.png" />
- <link rel="manifest" href="/manifest.json">
- <meta name="apple-mobile-web-app-capable" content="yes">
- <meta name="apple-mobile-web-app-status-bar-style" content="black">
- <meta name="apple-mobile-web-app-title" content="{{ site.title }}">
- <!-- Android Lolipop Theme Color -->
- <meta name="theme-color" content="{{ page.color }}">
serviceworker.js
在你的主頁面當中增加以下代碼用來判斷瀏覽器是否支持ServiceWorker,如果支持的話,加載ServiceWorker文件:
- if ('serviceWorker' in navigator) {
- navigator.serviceWorker.register('/service-worker.js');
- };
然后在根目錄下增加一個serviceworker.js的文件:
- var cacheName = 'fengerzh';
- var filesToCache = [
- '/',
- '/index.html',
- '/assets/js/main.js',
- '/assets/css/main.css',
- '/assets/img/placeholder.png',
- '/assets/img/icons/preloader.svg',
- '/assets/img/icons/read.svg',
- ];
- self.addEventListener('install', function(e) {
- e.waitUntil(
- caches.open(cacheName).then(function(cache) {
- return cache.addAll(filesToCache);
- })
- );
- });
- self.addEventListener('activate', function(e) {
- e.waitUntil(
- caches.keys().then(function(keyList) {
- return Promise.all(keyList.map(function(key) {
- if (key !== cacheName) {
- return caches.delete(key);
- }
- }));
- })
- );
- return self.clients.claim();
- });
- self.addEventListener('fetch', function(e) {
- e.respondWith(
- caches.match(e.request).then(function(response) {
- return response || fetch(e.request);
- })
- );
- });
把指定的文件保存在緩存中,這樣下次如果網(wǎng)絡(luò)不通的話,瀏覽器會從緩存中取文件,而不會出現(xiàn)網(wǎng)絡(luò)不通的畫面。建好了ServiceWorker文件的頁面,會在Chrome工具欄里看到這樣的效果:
同時,完成了PWA效果的網(wǎng)站,可以讓用戶在手機中直接安裝,比如:
然后,就會在用戶的主屏幕上生成一個帶有你設(shè)定的圖標的應(yīng)用:
點擊圖標打開應(yīng)用,會來到一個沒有任何URL地址欄和工具欄的頁面,使用戶完全感覺不到是在瀏覽網(wǎng)頁:
性能(Performance)
Lighthouse對性能的要求基本和GTMetrix差不多,如果你能在GTMetrix獲得高分的話,通過Lighthouse的這一項測試應(yīng)該不難。唯一多要求的一項是所有圖片都要求是webp格式,但是Safari瀏覽器目前并不支持這種格式,所以如果你把網(wǎng)站上的所有jpg文件改成webp文件的話會導(dǎo)致你的網(wǎng)站里的圖片在iPhone上不能顯示。(我目前的網(wǎng)站全面采用了webp格式,不過會在不久的將來全面切換回jpg,主要原因是iPhone目前還不兼容。)
性能標準共有10項。
可用性(Accessibility)
可用性標準主要是指在制作網(wǎng)頁時必須考慮殘疾人的需求。
可用性標準共有8項。
Elements Use Attributes Correctly
這一項標準的要求之一是:所有圖片必須有alt屬性,這樣如果圖片不能顯示時,也能出現(xiàn)合適的文字。當然還有很多其它要求,你可以根據(jù)Lighthouse給出的建議逐項調(diào)整。
Elements Describe Contents Well
這一項標準的要求之一是:所有input輸入框必須有l(wèi)abel或者aria-label。如下面這樣:
- <input type="text" class="search-field" placeholder="搜索" aria-label="搜索">
Color Contrast Is Satisfactory
這一項標準的要求是所有字體的前景色和背景色的對比度需要足夠強,以便于視力不好的人士能夠分辨頁面上的字跡。如果你不知道某兩種顏色的對比度是否足夠,可以用這個網(wǎng)頁檢測,綠色的Pass表示合格。
有時候這一標準會有誤判,為了能讓它通過,你可能需要設(shè)置額外的background-color屬性,例如(stylus):
- p
- margin 0 0 rem(30px)
- background-color #141414
- color darken(lightGray, 20%)
- font-size rem(17px)
- line-height rem(26px)
最佳實踐(Best Practice)
最佳實踐標準是指一個理想網(wǎng)站所應(yīng)該達到的最高標準。包括:避免使用Application Cache,避免使用WebSQL,使用Http 2.0,使用https,避免使用document.write,避免使用console.log等等。這些標準看上去很瑣碎,但是每一項標準的提出都有其合理性,應(yīng)當竭盡全力遵守。
最佳實踐標準共有15項。
使用http 2.0
關(guān)于如何開通http 2.0,可以參考我之前寫過的一篇文章《免費給你的網(wǎng)站加上藍色小閃電》。
成果
如果你完成了以上的所有優(yōu)化步驟,相信你的網(wǎng)站應(yīng)該可以得到一個比較高的評分了?,F(xiàn)在我們隨便找個網(wǎng)站評測一下看看吧,別人家的網(wǎng)站效果大抵都是這樣的:
而我們的網(wǎng)站,經(jīng)過調(diào)校之后的效果是這樣的:
是不是很有成就感呢?
以上所有代碼,供大家學(xué)習(xí)參考,不吝嗇的請大家給個星星吧!