歷時144000000毫秒出山的前端優化篇,若你問我有什麼感悟?
那我告訴你,看到毫秒啊,火箭啊,這些與優化相關的詞,都有莫名的親切感。
本文主要從工做效率、速度性能、穩定性、響應式、兼容性、搜索SEO、信息無障礙等方面進行講解。
前端優化是一個讓人技術提高的point,但願你也能從這裏學到一些東西。javascript
你是否常常處於這樣的場景:從早上忙到晚上八九點,一會與產品經理溝通,一會在部門羣聊一下新奇的東西,一會被設計美眉糾纏住拖不了身,有時還開不了部門的會議由於頁面急着上線,而後繼續加班~~~css
怎麼提升咱們的工做效率?下面從四個方面講解:html
凡是時間管理,都會聯想到計劃這個詞。咱們先看看別人家的月計劃表和周計劃表,之因此周計劃表爲空,是但願你能把它下載並打印出來,行動從計劃開始:
月計劃表:
周計劃表:
前端
固然計劃不要作得過於瑣碎,且不要佔用本身太多時間。作好計劃之餘,在執行過程當中須要注意幾點:html5
第同樣工具,好比程序員杯子:
java
利用工具備什麼好處呢?css3
選擇好一個前端編輯器是比較重要的。目前sublime、webstorm和vim是比較常見的,建議不使用Dreamweaver。
sublime目前仍是不錯的選擇,能夠安裝插件,好比BracketHighlighter 高亮顯示、JsFormat、Emmet html/CSS快速編輯以及DocBlockr插件,快速輸入jsDoc註釋等,還能夠自定義代碼段snippets。
不管你使用哪一種編輯器,你須要的是熟悉這個編輯器並熟練它的快捷鍵。程序員
做爲前端人員,首選的瀏覽器固然是chrome。推薦閱讀Chrome開發者工具不徹底指南一系列文章,它從一些基礎的功能開始到它的一些高級性能分析器(Timeline、Profiles),熟悉chrome對咱們的開發工做有很大的做用。web
切圖工具:photoshop cc切圖之智能切圖、 cutterman
量色、測距工具:FastStone Capture、馬克鰻 - 設計稿標註
圖片壓縮:tinypng、智圖
生成雪碧圖:spritebox、CSS Sprite Generator、cssgaga
調試工具:Fiddler 、weinre 、微信調試工具;chrome
凡是重複的,必須使用工具自動完成。
工具衆多,咱們就有一種想法,能不能有一種工具能幫咱們自動生成雪碧圖、 css壓縮、圖片壓縮等等,而後就出現了前端工程化。前端工程化通常可分爲五個步驟:
(1) 初始,生成基礎目錄結構和樣式庫。
(2) 開發,實時預覽、預編譯。
(3) 構建,預編譯、合併、壓縮。
(4) 發佈,將構建後靜態文件發佈上線。
(5) 打包,資源路徑轉換,源碼打包 。
這裏推薦一個工具fis,解決前端開發中自動化工具、性能優化、模塊化框架、開發規範、代碼部署、開發流程等問題。還有凹凸實驗室研發的athena,O2Team構建項目流程工具,能夠生成相應目錄和代碼,同時對項目進行編譯, 一次安裝,處處運行。
我所理解的程序員兼併聰明以及「懶惰」精神,推崇懶惰式開發,即把問題理解清楚,確保將要寫的代碼能真正的解決問題,這將會避免以後寫出大量無用的代碼,正所謂「懶」出效率。
咱們的閱歷和經驗能夠大大提升開發效率,思考代碼的時間增長從而選出最優方案,所以寫代碼速度更快以及代碼長度更短,對問題的透徹理解使調試代碼的速度也更快。
根據閱歷和經驗,或藉助其餘人的,咱們進行整理從而造成本身或團隊的規範,這可大大提升咱們的寫碼速度。
使用新技術如何提升咱們的工做效率。一向咱們都使用咱們熟悉的技術去開發一個技術處理方案,畢竟學習新技術的時間成本仍是存在的。可是仍是不能忽略一些新技術的存在,通常新技術包含了一些很棒的新特性,能夠更加方便的實現不少複雜的操做,提升開發人員的效率,好比ES6。用你的慧眼去積累新技術,會派上用場的。
爲何須要前端性能優化?性能優化能夠從哪幾個方面入手?
遇到一個頁面,5秒還沒加載完成,那個菊花轉啊轉,或者頁面徹底白屏,那簡直把人逼瘋了。從用戶體驗的角度看,前端性能優化是很是有必要的。網頁最長加載時間通常不能超過3秒。
首先咱們須要肯定網頁的性能指標,可量化的目標以及可持續跟蹤的優化數據是性能優化工做得以持續進行的保障,同時也是源動力!好比:
咱們通常經過三種方式來檢驗咱們的網頁性能:
可喜可賀,W3C推出了一套性能API標準,目的是簡化開發者對網站性能進行精確分析與控制的過程,最終實現性能的提升。好比經過Navigation Timing記錄的關鍵時間點來統計頁面完成所用的時間,部分使用方法:
1
2
3
4
5
6
|
var timing = window.performance.timing
timing.domLoading
//瀏覽器開始解析 HTML 文檔第一批收到的字節
timing.domInteractive
// 瀏覽器完成解析而且全部 HTML 和 DOM 構建完畢
timing.domContentLoadedEventStart
//DOM 解析完成後,網頁內資源加載開始的時間
timing.domContentLoadedEventEnd
// DOM 解析完成後,網頁內資源加載完成的時間(如 JS 腳本加載執行完畢)
timing.domComplete
//網頁上全部資源(圖片等)下載完成,且準備就緒的時間
|
持續追蹤性能數據,要選擇合適的頁面性能測量工具或API,一旦選定後,再也不更換,以保證歷史數據的可參照性。咱們還要造成一種意識,達成性能聯盟小組,對於重要的業務或者頁面,必定要從性能的角度考慮問題,有理有據地拒絕有損於前端性能的業務需求或改動。
人人都知道雅虎軍規,那我就來個截圖吧!
如下,咱們從服務端、網絡、客戶端三個方面來一一突破速度性能的提高。
經過在現有的Internet中增長一層新的網絡架構,將網站的內容發佈到最接近用戶的 cache服務器內,經過DNS負載均衡的技術,判斷用戶來源就近訪問cache服務器取得所需的內容。深圳用戶訪問遙遠的美國服務器,固然不理想了。把靜態內容分佈到CDN能夠減小用戶響應時間20%或更多。
若是能夠減小服務端的負擔,在應用離線時可以使用資源或加載資源更快,豈不樂哉?
緩存利用可包括:添加 Expires 頭,配置 ETag,使 Ajax 可緩存等。其實,恰當的緩存設置能夠大大的減小 HTTP請求,也能夠節省帶寬 。
AppCache:
AppCache主要利用manifest 文本文件,告知瀏覽器被緩存的內容以及不緩存的內容。
manifest 文件可分爲三個部分:
(1) CACHE MANIFEST - 在此標題下列出的文件將在首次下載後進行緩存,等價於CACHE
(2) NETWORK - 在此標題下列出的文件須要與服務器的鏈接,且不會被緩存
(3) FALLBACK - 在此標題下列出的文件規定當頁面沒法訪問時的回退頁面
使用AppCache方案的步驟:
(1) 整理出須要緩存的靜態文件列表,如juqery.js和gb.css。
(2) 配置服務器支持。
(3) 肯定內容更新機制和瀏覽器兼容方案。
可經過如下方式減小請求數:
減小請求數對於速度優化來講最重要最有效的,特別是網絡差的用戶。一個完整的請求須要通過域名解析以及DNS尋址、與服務器創建鏈接、發送數據、等待服務器響應、接收數據的過程;每一個請求都須要攜帶數據,所以每一個請求都須要佔用帶寬;瀏覽器進行併發請求的請求數是有上限的。請求多了的狀況,明顯增長了網頁的響應時間。一個頁面由多個模塊拼接而成,幾個模塊中請求了一樣的資源時,就會致使資源的重複請求。
域名的要求是短小且獨立。
短小能夠減小頭部開銷,由於域名越短請求頭起始行的 URI 就越短。之因此要求獨立,由於獨立域名不會共享主域的 Cookie,能夠有效減少請求頭大小,這個策略通常稱之爲 Cookie-Free Domain;另一個緣由是瀏覽器對相同域名的併發鏈接數限制,通常容許同域名併發 6~8 個鏈接,域名不是越多越好,每一個域名的第一個鏈接都要經歷 DNS 查詢(DNS Lookup),致使會耗費必定的時間,控制域名使用在2-4個之間。另外注意:同一靜態資源在不一樣頁面被散列到不一樣子域下,會致使沒法利用 HTTP 緩存。
HTTP 2 相比 HTTP 1.1 的更新大部分集中於:
穩定性的第一要求是可用。最起碼的要求是頁面得出來,要否則無法用了。
其次講究的是頁面的可維護性,假如頁面掛了,多久能夠恢復過來,另外考慮頁面掛的期間是否能夠採起靜態頁面處理等方式。
頁面的穩定性其實和前端安全掛鉤,即便頁面能夠出來了,可是不能保證不會被黑掉,下文從前端安全的方面講解。
XSS (Cross Site Script) ,跨站腳本攻擊,往Web頁面裏插入惡意html代碼。特色是攻擊者的代碼必須能獲取用戶瀏覽器端的執行權限,要杜絕此類攻擊出現能夠在入口和出口進行嚴格的過濾。
三種類型:
(1) 反射型XSS:一次性;將包含注入腳本的惡意連接發送給受害者。
(2) 持久型XSS:用戶輸入的數據「存儲」在服務器端,好比一條包含XSS代碼的留言。
(3) DOM XSS:使用一些eval等有輸出的語句意味着多了一份被XSS的風險。
應對策略:
CSRF(Cross Site Request Forgery),跨站點僞造請求,經過僞造鏈接請求在用戶不知情的狀況下,讓用戶以本身的身份來完成攻擊者須要達到的一些目的。
cookie劫持,經過獲取頁面的權限,在頁面中寫一個簡單的到惡意站點的請求,並獲取用戶的cookie登陸某些站點。
對於crsf 和cookie 劫持的策略:
國內的衆多網站都沒有實現全站HTTPS。這是目前爲止最重要的一步,全部的數據在發送以前就會被加密,攻擊者沒法查看或篡改數據包的內容。HTTPS能夠理解爲HTTP+SSL/TLS,經過數據加密、校驗數據完整性和身份認證三種機制來保障安全。HTTPS的缺點是網站在加上TLS證書時,可能致使RTT往返時延增長,而且 HTTPS通訊過程的非對稱和對稱加解密計算會產生更多的服務器性能和時間上的消耗,可是這是能夠優化的,這裏就不細說了。
首先了解一下同源策略:
不建議使用JSONP,由於JSONP一般在腳本中寫一個回調函數,而後把回調函數的名字寫在請求的URL中,所以若是請求數據的服務器被黑了,那麼黑客就能在返回的數據中植入惡意代碼,從而竊取用戶的隱私信息。
跨域資源共享CORS容許資源提供方在響應頭中加入一個特殊的標記,使你能經過XHR來獲取、解析並驗證數據。這樣就能避免惡意代碼在你的應用中執行。在響應頭中加入的標記以下:
1
|
Access-Control-Allow-Origin: allowed origins
|
若是對Access–Control-Allow-Origin設置爲*實際上是比較危險的,若是沒有攜帶會話認證意味着信息被公開在全網,建議設置具體的域名,並且跨域的時候記得帶上session id;嚴格審查請求信息,好比請求參數,還有http頭信息,由於 http頭能夠僞造。
CSP指定網站上全部腳本和圖片等資源的源站點,也能阻止全部內聯(inline)的腳本和樣式。即便有人在頁面評論或者留言中嵌入了腳本標籤,這些腳本代碼也不會被執行。可經過兩種方式設置,若是 HTTP 頭與 Meta 定義同時存在,則優先採用 HTTP 頭中的定義:
經過HTML的Meta標籤,好比只容許腳本從本源加載:
1
|
<meta
http-equiv="Content-Security-Policy" content="script-src 'self'">
|
其餘策略:
缺點:
默認狀況下,全部的內聯JavaScript腳本都不會被執行,由於瀏覽器沒法區分本身的內聯腳本和黑客注入的腳本。
CSP還會默認阻止全部eval()風格的代碼的執行,包括setInterval/setTimeout中的字符串和相似於new Function(‘return false’)之類的代碼。
利用iframe進行跨源:HTML5爲iframe提供了安全屬性 sandbox,iframe的能力將會被限制。
Secure能確保cookie的內容只能經過SSL鏈接進行傳輸。Secure和HttpOnly屬性告訴瀏覽器cookie的內容只能分別經過HTTP(S)協議進行訪問,從而避免了被輕易竊取,好比禁止從JavaScript中的document.cookie訪問,所以cookie在瀏覽器document中不可見了。若是單獨使用的話,沒法全面抵禦跨站點腳本攻擊,一般和其餘技術組合使用。使用方法以下:
1
|
Set-Cookie:
<name>=<value>[; <name>=<value>] [; expires=<date>][; domain=<domain_name>][; path=<some_path>][; secure][; HttpOnly]
|
X-Content-Type-Options 告訴瀏覽器相信此服務器下發的資源的類型,防止類型嗅探攻擊。
HPKP(Public Key Pinning) Public Key Pinning 是一個response 頭,用來檢測一個證書的公鑰是否發生了改變,防止中間人攻擊。
HSTS (HTTP Strict-Transport-Security) 強制使用TSL做爲數據通道。
html5有不少新的特性能力,然而能力越大,被攻破後的危險就越大。
HTML5 對xss的影響主要體如今:
<video>,<audio>,<canvas>
等;好比localstorage只能經過js設置和獲取,致使的結果是不能像cookie同樣設置httponly等屬性,因此localstorage中不能存放敏感信息,最好可以在服務端進行加密,能夠配合CORS來獲取網站的localstorage的信息。
響應式佈局簡而言之,就是一個網站可以兼容多個終端,能夠爲不一樣終端的用戶提供更加溫馨的界面和更好的用戶體驗。
好比凹凸實驗室博客頁面在PC端、iPad、手機端的排版:
PC端:
iPad:
手機端:
估計不少人對這句話都有體會:IE虐我千百遍,我待IE如初戀。固然,除了 IE 上有兼容性問題,其餘瀏覽器好比 Android 上的低版本瀏覽器也有較多問題。
是否繼續保持對低端瀏覽器的兼容性,咱們能夠用數據跟產品經理或者老闆說話,減小咱們的工做量,最好在項目以前就定下來支持最低支持的版本是什麼,而後設計一個對應兼容方案。如下是百度統計的2015年的瀏覽器市場份額數據:
兼容性的原則:漸進加強與平穩退化。就是說,在低級瀏覽器可以保證其可用性和可訪問性;漸進加強,在保證代碼、頁面在低級瀏覽器中的可用性及可訪問性的基礎上,逐步增長功能及用戶體驗。
若是出現兼容性問題了,怎麼處理:
淘寶首頁在兼容性上作了一個小創新:Html鉤子
在html上加上操做系統、瀏覽器內核、瀏覽器類型、CSS3動畫支持、IE各版本類,好處在於:
淘寶首頁html鉤子:
兼容性問題是老生常談的問題了,團隊之間共同努力造成一個bug兼容性積累文檔,是最好不過的了。
網站須要有一個良好的導航,控制根目錄和各子目錄的關鍵,經過sitemap能夠幫助網站主瞭解網站結構,也方便搜索引擎收錄整個站點。
信息無障礙通常能夠從如下幾點入手:
具體可參考無障礙閱讀
經過前端動畫技術給頁面進行優化,好比:
requireJs框架特性:
場景以下:
頁面一:去一個網站買東西,未登陸狀態下,進入首頁;
頁面二:而後新窗口打開任意頁面,登陸併成功返回。
再次訪問頁面一,發現頁面仍是未登陸狀態,實際上用戶已經登陸了,這種體驗是不好的。咱們是否是有什麼辦法能夠實現多標籤狀態同步呢?有的,利用Page Visibility:
能提升前端工做效率的那些事
基於Gulp的前端自動化
繁星網的前端性能優化之路
前端性能優化—-yahoo前端性能團隊總結的35條黃金定律
前端性能數據之採集和分析
Web性能API——幫你分析Web前端性能
前端工程師如何系統地整理和累積兼容性相關的知識?
玩轉HTML5移動頁面(優化篇)
HTTP/2 與 WEB 性能優化(一)
HTTP/2 與 WEB 性能優化(二)
HTTP/2 與 WEB 性能優化(三)
HTTP/2 頭部壓縮技術介紹
從零開始學web安全(1)
關於Web安全,99%的網站都忽略了這些
網頁前端常見的攻擊方式和預防攻擊的方法
Web客戶端安全性最佳實踐
HTML5 安全問題解析
10步大幅提高網站可訪問性
Page Visibility(頁面可見性)API介紹、微拓展