大公司里怎样开发和部署前端代码
鏈接:https://www.zhihu.com/question/20790576/answer/32602154
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
沒人邀請,看到這個問題不錯,路過怒答。(多圖預警)
前百度工程師,曾負責百度 前端集成解決方案 的核心設計與開發工作。我現在稱這個領域為【前端工程】。沒錯,這是我最愛嘮叨的問題域。
這是一個非常有趣的 非主流前端領域,這個領域要探索的是如何用工程手段解決前端開發和部署優化的綜合問題,入行到現在一直在學習和實踐中。
在我的印象中,facebook是這個領域的鼻祖,有興趣、有梯子的同學可以去看看facebook的頁面源代碼,體會一下什么叫工程化。
接下來,我想從原理展開講述,多圖,較長,希望能有耐心看完。
---------------------------- 我是一條分割線 ----------------------------
<img src="https://pic2.zhimg.com/07c2bdef6ccef3ada425d61e3062dd09_b.jpg" data-rawwidth="389" data-rawheight="238" class="content_image" width="389">讓我們返璞歸真,從原始的前端開發講起。上圖是一個“可愛”的index.html頁面和它的樣式文件a.css,用文本編輯器寫代碼,無需編譯,本地預覽,確認OK,丟到服務器,等待用戶訪問。前端就是這么簡單,好好玩啊,門檻好低啊,分分鐘學會有木有!
<img src="https://pic1.zhimg.com/d53b504bbc9f1887eddf06d90545b870_b.jpg" data-rawwidth="400" data-rawheight="98" class="content_image" width="400">然后我們訪問頁面,看到效果,再查看一下網絡請求,200!不錯,太?完美了!那么,研發完成。。。。了么?
等等,這還沒完呢!對于大公司來說,那些變態的訪問量和性能指標,將會讓前端一點也不“好玩”。
看看那個a.css的請求吧,如果每次用戶訪問頁面都要加載,是不是很影響性能,很浪費帶寬啊,我們希望最好這樣:
<img src="https://pic1.zhimg.com/6a611755a5648ca252211cec85a31ac4_b.jpg" data-rawwidth="401" data-rawheight="98" class="content_image" width="401">利用304,讓瀏覽器使用本地緩存。但,這樣也就夠了嗎?不成!304叫協商緩存,這玩意還是要和服務器通信一次,我們的優化級別是變態級,所以必須徹底滅掉這個請求,變成這樣:
<img src="https://pic3.zhimg.com/fd74ab2bf02d79dd7af1336b4c8f180e_b.jpg" data-rawwidth="400" data-rawheight="98" class="content_image" width="400">強制瀏覽器使用本地緩存(cache-control/expires),不要和服務器通信。好了,請求方面的優化已經達到變態級別,那問題來了:你都不讓瀏覽器發資源請求了,這緩存咋更新?
很好,相信有人想到了辦法:通過更新頁面中引用的資源路徑,讓瀏覽器主動放棄緩存,加載新資源。好像這樣:
<img src="https://pic2.zhimg.com/8a8676e933478d1a73777d84a5de55f5_b.jpg" data-rawwidth="304" data-rawheight="110" class="content_image" width="304">下次上線,把鏈接地址改成新的版本,就更新資源了不是。OK,問題解決了么?!當然沒有!大公司的變態又來了,思考這種情況:
<img src="https://pic1.zhimg.com/4681f7131e777dc885bf66000580ca40_b.jpg" data-rawwidth="579" data-rawheight="310" class="origin_image zh-lightbox-thumb" width="579" data-original="https://pic1.zhimg.com/4681f7131e777dc885bf66000580ca40_r.jpg">頁面引用了3個css,而某次上線只改了其中的a.css,如果所有鏈接都更新版本,就會導致b.css,c.css的緩存也失效,那豈不是又有浪費了?!
重新開啟變態模式,我們不難發現,要解決這種問題,必須讓url的修改與文件內容關聯,也就是說,只有文件內容變化,才會導致相應url的變更,從而實現文件級別的精確緩存控制。
什么東西與文件內容相關呢?我們會很自然的聯想到利用 數據摘要要算法 對文件求摘要信息,摘要信息與文件內容一一對應,就有了一種可以精確到單個文件粒度的緩存控制依據了。好了,我們把url改成帶摘要信息的:
<img src="https://pic1.zhimg.com/5276595f41d6276e21e5bc1d25741680_b.jpg" data-rawwidth="588" data-rawheight="310" class="origin_image zh-lightbox-thumb" width="588" data-original="https://pic1.zhimg.com/5276595f41d6276e21e5bc1d25741680_r.jpg">這回再有文件修改,就只更新那個文件對應的url了,想到這里貌似很完美了。你覺得這就夠了么?大公司告訴你:圖樣圖森破!
唉~~~~,讓我喘口氣
現代互聯網企業,為了進一步提升網站性能,會把靜態資源和動態網頁分集群部署,靜態資源會被部署到CDN節點上,網頁中引用的資源也會變成對應的部署路徑:
<img src="https://pic2.zhimg.com/0866cb58bcf349642d57a06b162e0d91_b.jpg" data-rawwidth="574" data-rawheight="259" class="origin_image zh-lightbox-thumb" width="574" data-original="https://pic2.zhimg.com/0866cb58bcf349642d57a06b162e0d91_r.jpg">好了,當我要更新靜態資源的時候,同時也會更新html中的引用吧,就好像這樣:
<img src="https://pic1.zhimg.com/16d6d6c32e52ef1d1a835fb2ed15f864_b.jpg" data-rawwidth="574" data-rawheight="456" class="origin_image zh-lightbox-thumb" width="574" data-original="https://pic1.zhimg.com/16d6d6c32e52ef1d1a835fb2ed15f864_r.jpg">這次發布,同時改了頁面結構和樣式,也更新了靜態資源對應的url地址,現在要發布代碼上線,親愛的前端研發同學,你來告訴我,咱們是先上線頁面,還是先上線靜態資源?
好的,上面一坨分析想說的就是:先部署誰都不成!都會導致部署過程中發生頁面錯亂的問題。所以,訪問量不大的項目,可以讓研發同學苦逼一把,等到半夜偷偷上線,先上靜態資源,再部署頁面,看起來問題少一些。
但是,大公司超變態,沒有這樣的“絕對低峰期”,只有“相對低峰期”。So,為了穩定的服務,還得繼續追求極致啊!
這個奇葩問題,起源于資源的 覆蓋式發布,用 待發布資源 覆蓋 已發布資源,就有這種問題。解決它也好辦,就是實現 非覆蓋式發布。
<img src="https://pic4.zhimg.com/9b3a9df114d14a14130a70abf5733837_b.jpg" data-rawwidth="631" data-rawheight="456" class="origin_image zh-lightbox-thumb" width="631" data-original="https://pic4.zhimg.com/9b3a9df114d14a14130a70abf5733837_r.jpg">看上圖,用文件的摘要信息來對資源文件進行重命名,把摘要信息放到資源文件發布路徑中,這樣,內容有修改的資源就變成了一個新的文件發布到線上,不會覆蓋已有的資源文件。上線過程中,先全量部署靜態資源,再灰度部署頁面,整個問題就比較完美的解決了。
所以,大公司的靜態資源優化方案,基本上要實現這么幾個東西:
全套做下來,就是相對比較完整的靜態資源緩存控制方案了,而且,還要注意的是,靜態資源的緩存控制要求在前端所有靜態資源加載的位置都要做這樣的處理。是的,所有!什么js、css自不必說,還要包括js、css文件中引用的資源路徑,由于涉及到摘要信息,引用資源的摘要信息也會引起引用文件本身的內容改變,從而形成級聯的摘要變化,大概示意圖就是:
<img src="https://pic3.zhimg.com/edf10bb428d39d721e36760a86d2641e_b.jpg" data-rawwidth="709" data-rawheight="371" class="origin_image zh-lightbox-thumb" width="709" data-original="https://pic3.zhimg.com/edf10bb428d39d721e36760a86d2641e_r.jpg">好了,目前我們快速的學習了一下前端工程中關于靜態資源緩存要面臨的優化和部署問題,新的問題又來了:這?讓工程師怎么寫碼啊!!!
要解釋優化與工程的結合處理思路,又會扯出一堆有關模塊化開發、資源加載、請求合并、前端框架等等的工程問題,以上只是開了個頭,解決方案才是精髓,但要說的太多太多,有空再慢慢展開吧。或者大家可以去我的blog看其中的一些拆解:fouber/blog · GitHub
總之,前端性能優化絕逼是一個工程問題!以上不是我YY的,可以觀察 百度 或者 facebook 的頁面以及靜態資源源代碼,查看它們的資源引用路徑處理,以及網絡請中靜態資源的緩存控制部分。再次贊嘆facebook的前端工程建設水平,跪舔了。
建議前端工程師多多關注前端工程領域,也許有人會覺得自己的產品很小,不用這么變態,但很有可能說不定某天你就需要做出這樣的改變了。而且,如果我們能把事情做得更極致,為什么不去做呢?
另外,也不要覺得這些是運維或者后端工程師要解決的問題。如果由其他角色來解決,大家總是把自己不關心的問題丟給別人,那么前端工程師的開發過程將受到極大的限制,這種情況甚至在某些大公司都不少見!
媽媽,我再也不玩前端了。。。。5555
轉載于:https://www.cnblogs.com/ping8388/p/6478218.html
總結
以上是生活随笔為你收集整理的大公司里怎样开发和部署前端代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017-9-26 NOIP模拟赛
- 下一篇: 2017年html5行业报告,云适配发布