日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何高效地管理網(wǎng)站靜態(tài)資源

背景

隨著互聯(lián)網(wǎng)開發(fā)和迭代速度越來越快,網(wǎng)站也變得越來越龐大,存在大量靜態(tài)資源,我們原有管理靜態(tài)資源的方式變得越來越不適用,就如同封面圖一樣,靜態(tài)資源之間的關(guān)系錯(cuò)綜復(fù)雜,給工程師帶來了很多麻煩:

成都創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、從江網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為從江等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

  • 人工管理依賴的噩夢,工程師需要頻繁管理和維護(hù)每個(gè)頁面需要的 JS & CSS 文件,包括靜態(tài)資源之間的依賴關(guān)系以及加載順序等。
  • 性能優(yōu)化成本高且不可持續(xù)性,為了提高網(wǎng)站性能,工程師總是在忙于優(yōu)化頁面靜態(tài)資源的加載,包括動(dòng)態(tài)加載靜態(tài)資源、按需加載靜態(tài)資源和修改靜態(tài)資源合并策略等,但是過了一段時(shí)間性能又降下來了,又需要周而復(fù)始的重復(fù)。
  • 靜態(tài)資源差異化的挑戰(zhàn),PC和無線的適配,不同的網(wǎng)絡(luò)和終端需要適配相應(yīng)的靜態(tài)資源;當(dāng)網(wǎng)站需要支持國際化的時(shí)候,需要對不同的國家進(jìn)行差異化處理,返回不同的靜態(tài)資源,這些需求對原有的靜態(tài)資源管理方式提出巨大挑戰(zhàn)。
  • 缺少快速迭代和試驗(yàn)新功能的有效支持,從開發(fā)到上線流程繁瑣,導(dǎo)致項(xiàng)目迭代周期長

每天工程師都會(huì)提交大量的 new feature/bug fixes,每次項(xiàng)目發(fā)布和迭代都面臨著以上的問題,是否可以有一套系統(tǒng)幫助我們管理/調(diào)度靜態(tài)資源來減少人工管理靜態(tài)資源成本和風(fēng)險(xiǎn),來達(dá)到更快、更可靠、低成本的自動(dòng)化項(xiàng)目交付。在實(shí)際項(xiàng)目開發(fā)中,我們進(jìn)行了大量探索和試驗(yàn),實(shí)現(xiàn)了一套 “靜態(tài)資源管理系統(tǒng)”,對靜態(tài)資源進(jìn)行全流程的管理和調(diào)度:

  • 幫助工程師管理靜態(tài)資源間的依賴以及資源的加載
  • 管理靜態(tài)資源版本更新與緩存,自動(dòng)處理CDN
  • 自動(dòng)生成最優(yōu)的靜態(tài)資源合并策略,實(shí)現(xiàn)網(wǎng)站自適應(yīng)優(yōu)化
  • 實(shí)現(xiàn)靜態(tài)資源的分級(jí)發(fā)布,快速迭代,輕松回滾
  • 根據(jù)國際化和終端的差異,送達(dá)不同的資源給不同的用戶

下面本文將會(huì)介紹我們是如何通過靜態(tài)資源系統(tǒng)來高效管理靜態(tài)資源的。

架構(gòu)

靜態(tài)資源管理系統(tǒng)主要包含Compile、Sourcemap、Backend-Framework、Frontend-Loader幾個(gè)核心模塊:

  • Compile,對靜態(tài)資源進(jìn)行編譯處理,包括對靜態(tài)資源進(jìn)行預(yù)處理,url 處理(添加md5戳、添加CDN前綴),優(yōu)化(壓縮、合并),生成 Sourcemap 等
  • Sourcemap,在 compile 階段系統(tǒng)會(huì)掃描靜態(tài)資源,建立一張靜態(tài)資源關(guān)系表,記錄每個(gè)靜態(tài)資源的部署路徑以及依賴關(guān)系等信息
  • Backend-Framework,后端運(yùn)行時(shí)根據(jù)組件使用情況來調(diào)度靜態(tài)資源,為前端返回頁面渲染需要的資源。
  • Frontend-Loader,前端運(yùn)行時(shí)根據(jù)用戶的交互行為動(dòng)態(tài)請求靜態(tài)資源。

靜態(tài)資源管理系統(tǒng)通過自動(dòng)化工具對靜態(tài)資源進(jìn)行預(yù)處理并產(chǎn)出 Sourcemap,SourceMap 中記錄著靜態(tài)資源的調(diào)度信息,這樣框架在運(yùn)行時(shí)會(huì)根據(jù) SourceMap 中提供的調(diào)度信息自動(dòng)為用戶進(jìn)行靜態(tài)資源調(diào)度,不僅可以做到送達(dá)不同資源給不同用戶,還可以自適應(yīng)優(yōu)化靜態(tài)資源合并和加載。

自動(dòng)管理靜態(tài)資源依賴

靜態(tài)資源管理系統(tǒng)為工程師提供了聲明依賴關(guān)系的語法和規(guī)則,在 compile 階段系統(tǒng)會(huì)掃描靜態(tài)資源,建立一張靜態(tài)資源關(guān)系表,記錄每個(gè)靜態(tài)資源的部署路徑以及依賴關(guān)系等信息。

在html中聲明依賴

在項(xiàng)目的 index.html 里使用注釋聲明依賴關(guān)系:

 
 
  1.  

在 SourceMap 中則可看到:

 
 
  1. {  
  2.     "res" : {  
  3.         "demo.css" : {  
  4.             "uri" : "/static/css/demo_7defa41.css",  
  5.             "type" : "css"  
  6.         },  
  7.         "demo.js" : {  
  8.             "uri" : "/static/js/demo_33c5143.js",  
  9.             "type" : "js",  
  10.             "deps" : [ "demo.css" ]  
  11.         },  
  12.         "index.html" : {  
  13.             "uri" : "/index.html",  
  14.             "type" : "html",  
  15.             "deps" : [ "demo.js", "demo.css" ]  
  16.         }  
  17.     },  
  18.     "pkg" : {}  
  19. }  
  20.  

在js中聲明依賴

支持識(shí)別 js 文件中的 require 函數(shù),或者 注釋中的 @require 字段 標(biāo)記的依賴關(guān)系,這些分析處理對 html 的 script 標(biāo)簽內(nèi)容 同樣有效。

 
 
  1. //demo.js  
  2. /**  
  3.  * @require demo.css  
  4.  * @require list.js  
  5.  */  
  6. var $ = require('jquery');  
  7.  

在SourceMap中則可看到:

 
 
  1. {  
  2.     "res" : {  
  3.         ...  
  4.         "demo.js" : {  
  5.             "uri" : "/static/js/demo_33c5143.js",  
  6.             "type" : "js",  
  7.             "deps" : [ "demo.css", "list.js", "jquery" ]  
  8.         },  
  9.         ...  
  10.     },  
  11.     "pkg" : {}  
  12. }  
  13.  

在css中聲明依賴

支持識(shí)別 css 文件 注釋中的 @require 字段 標(biāo)記的依賴關(guān)系,這些分析處理對 html 的 style 標(biāo)簽內(nèi)容 同樣有效。

 
 
  1. //demo.js  
  2. /**  
  3.  * @require demo.css  
  4.  * @require list.js  
  5.  */  
  6. var $ = require('jquery');  
  7.  

在SourceMap中則可看到:

 
 
  1. {  
  2.     "res" : {  
  3.         ...  
  4.         "demo.js" : {  
  5.             "uri" : "/static/js/demo_33c5143.js",  
  6.             "type" : "js",  
  7.             "deps" : [ "demo.css", "list.js", "jquery" ]  
  8.         },  
  9.         ...  
  10.     },  
  11.     "pkg" : {}  
  12. }  
  13.  

#p#

按需加載靜態(tài)資源

在靜態(tài)資源管理系統(tǒng)接管了項(xiàng)目中的靜態(tài)資源后,可以知道靜態(tài)資源的運(yùn)行情況以及依賴關(guān)系,然后可以做到自動(dòng)為頁面按需加載靜態(tài)資源,下面通過一個(gè)例子來詳細(xì)講解:

sidebar.tpl 中的內(nèi)容如下,

 
 
  1.  
  2.  
  3.  
  4.      
  5.      
  6.      
  7.  
  8.  
  9. {script}  
  10.     var sidebar = require("common:ui/dialog/dialog.js");  
  11.     sidebar.run();  
  12. {/script}  
  13.  
  14. {script}  
  15.     $('a.btn-navbar').click(function() {  
  16.         require.async('common:ui/dialog/dialog.async.js', function( dialog ) {  
  17.             dialog.run();  
  18.         });  
  19.     });  
  20. {/script}  
  21.  

對項(xiàng)目編譯后,自動(dòng)化工具會(huì)分析依賴關(guān)系,并生成 sourcemap,如下

 
 
  1. "common:widget/sidebar/sidebar.tpl": {  
  2.     "uri": "common/widget/sidebsr/sidebar.tpl",  
  3.     "type": "tpl",  
  4.     "extras": {  
  5.         "async": [  
  6.             "common:ui/dialog/dialog.async.js"  
  7.         ]  
  8.     },  
  9.     "deps": [  
  10.         "common:ui/dialog/dialog.js",  
  11.         "common:ui/dialog/dialog.css"  
  12.     ]  
  13. }  
  14.  

在 sidebar 模塊被調(diào)用后,靜態(tài)資源管理系統(tǒng)通過查詢 sourcemap 可以得知,當(dāng)前 sidebar 模塊同步依賴 sidebar.js、sidebar.css,異步依賴 sdebar.async.js,在要輸出的 html 前面,生成靜態(tài)資源外鏈,我們得到最終的 html

 
 
  1.  
  2.  
  3.  
  4.      
  5.      
  6.      
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  

如上可見,后端模塊化框架將同步模塊的 script url 統(tǒng)一生成到頁面底部,將 css url 統(tǒng)一生成在 head 中,對于異步模塊(require.async)注冊 resourceMap 代碼,框架會(huì)通過 {script} 標(biāo)簽收集到頁面所有 script,統(tǒng)一管理并按順序輸出 script 到相應(yīng)位置。

當(dāng)我們想對模塊進(jìn)行打包,只需要使用一個(gè) pack 配置項(xiàng),對網(wǎng)站的靜態(tài)資源進(jìn)行打包,這樣在 SourceMap 中,所有被打包的資源會(huì)有一個(gè) pkg 屬性指向該表中的資源,而這個(gè)資源,正是我們配置的打包策略。這樣靜態(tài)資源系統(tǒng)可以根據(jù)對應(yīng)信息找到某個(gè)資源最終被合并后的 package 的 url,最后把這個(gè) url 返回給頁面。

自動(dòng)合并靜態(tài)資源

靜態(tài)資源管理系統(tǒng)可以根據(jù)產(chǎn)品線上靜態(tài)資源使用的數(shù)據(jù),自動(dòng)完成靜態(tài)資源合并工作,對工程師完全透明,解決手工維護(hù)的未及時(shí)排除廢棄資源、不可持續(xù)、成本大等問題。

詳情請見 靜態(tài)資源自動(dòng)合并;

靜態(tài)資源版本更新與緩存

靜態(tài)資源管理系統(tǒng)采用基于文件內(nèi)容的 hash 值來控制靜態(tài)資源的版本更新,如下所示:

 
 
  1.  
  2.  

其中”_82244e91 ”這串字符是根據(jù) a.js 的文件內(nèi)容進(jìn)行 hash 運(yùn)算得到的,只有文件內(nèi)容發(fā)生變化了才會(huì)有更改。這樣做的好處有:

  • 線上的 a.js 不是同名文件覆蓋,而是文件名 +hash 的冗余,所以可以先上線靜態(tài)資源,再上線 html 頁面,不存在間隙問題;
  • 遇到問題回滾版本的時(shí)候,無需回滾 a.js,只須回滾頁面即可;
  • 由于靜態(tài)資源版本號(hào)是文件內(nèi)容的 hash,因此所有靜態(tài)資源可以開啟永久強(qiáng)緩存,只有更新了內(nèi)容的文件才會(huì)緩存失效,緩存利用率大增;
  • 修改靜態(tài)資源后會(huì)在線上產(chǎn)生新的文件,一個(gè)文件對應(yīng)一個(gè)版本,因此不會(huì)受到構(gòu)造 CDN 緩存形式的攻擊

靜態(tài)資源管理系統(tǒng)會(huì)在 compile 階段識(shí)別文件中的定位標(biāo)記(url),計(jì)算對應(yīng)文件的 hash,并自動(dòng)替換為 '文件名 + hash',無需工程師手動(dòng)修改。

靜態(tài)資源分級(jí)控制

靜態(tài)資源管理系統(tǒng)可以對靜態(tài)資源做進(jìn)一步控制(Controlling Access to Features)以達(dá)到分級(jí)發(fā)布的效果,主要包括以下兩塊核心功能,

  • feature flags, 用來控制 feature 對應(yīng)的靜態(tài)資源是否加載
  • feature flippers, 可以靈活控制 feature,不僅僅是 on 或 off, 可以做到類似'3%用戶可以訪問此功能'、'對內(nèi)部所有員工開放' 類似的效果

通過以上的控制我們可以輕松做到發(fā)布一個(gè)新功能,讓這個(gè)功能只對部分用戶可訪問,當(dāng)功能完善后對所有用戶開放,如果功能出現(xiàn)問題直接一鍵回滾即可。

在項(xiàng)目中的類似代碼如下:

 
 
  1. {if $config.some eq 'Fred'}  
  2.     do something new and amazing here.  
  3. {elseif $config.some eq 'Wilma'}  
  4.     do the current boring stuff.  
  5. {else}  
  6.     whatever you are.  
  7.  

靜態(tài)資源管理系統(tǒng)會(huì)根據(jù)配置在運(yùn)行時(shí)對 $config.some 進(jìn)行干預(yù).實(shí)現(xiàn)對靜態(tài)資源的訪問權(quán)控制,通過運(yùn)行時(shí)的配置(feature flag)來控制靜態(tài)資源,還可以支持“主干開發(fā)”的方式,來達(dá)到更快的迭代速度。

我們還可以實(shí)現(xiàn)國際化的需求,原理同分級(jí)發(fā)布,在運(yùn)行時(shí)的做一些更細(xì)致的差異化處理

 
 
  1. {if $lang == 'zh-CN'}  
  2.     zh-CN  
  3. {/if}  
  4.  

總結(jié)

靜態(tài)資源管理系統(tǒng)的核心是對靜態(tài)資源進(jìn)行調(diào)度,可以很靈活的適應(yīng)各種性能優(yōu)化和差異化處理的場景,來達(dá)到更快、更可靠、低成本的自動(dòng)化項(xiàng)目交付。但是同時(shí)這個(gè)系統(tǒng)十分復(fù)雜,承載著各種職責(zé),這個(gè)系統(tǒng)本身會(huì)成為整個(gè)網(wǎng)站的關(guān)鍵節(jié)點(diǎn)和瓶頸。

作者:walter (http://weibo.com/u/1916384703) - F.I.S


本文名稱:如何高效地管理網(wǎng)站靜態(tài)資源
網(wǎng)頁URL:http://m.5511xx.com/article/dhgjpcg.html