淺談前端工程化

概述

web應(yīng)用從本質(zhì)上說就是一種運行在瀏覽器上的軟件,而這些軟件的圖形化用戶界面即為web前端。現(xiàn)如今,web應(yīng)用更加的復(fù)雜,例如社交網(wǎng)絡(luò),購物平臺,金融信貸等。這樣的應(yīng)用,動輒就是幾十上百人一起開發(fā)并維護的,其前端界面的規(guī)模也極為龐大。與此同時,web應(yīng)用面對的用戶對于前端界面的要求也越來越多。因此,從軟件工程化的角度去思考前端開發(fā)是大勢所趨。

傳統(tǒng)方式的不足和待解決的問題

以前,前端資源是按照頁面或類似業(yè)務(wù)頁面集合的形式進行組織。例如,manage.js對應(yīng)著管理界面的交互;user.css對應(yīng)著用戶界面的樣式,這種方式在很長一段時間內(nèi)廣泛使用。

存在的不足:

  • 前端頁面資源冗雜。頁面功能越來越多,交互越來越復(fù)雜,前端代碼量增多。直接導(dǎo)致為了使用一個js中某個函數(shù),可能需要加載整個js文件,或者為了使用部分css樣式,需要加載其依賴的整個css,這樣無疑會增加請求,影響頁面性能。
  • 資源維護困難。js和css等資源是依賴于頁面或者相似頁面集合,它們之間的依賴關(guān)系也只能通過人來維護,容易出錯,常出現(xiàn)刪除某個頁面但其相關(guān)的資源還存在的情況。
  • 不利于單元測試。以頁面為最小粒度進行資源整合,不同功能的業(yè)務(wù)模塊相互影響,耦合度很高,不利于進行自動化單元測試。

工程化要解決的問題:

  1. 設(shè)計前端的架構(gòu)
  2. 庫/框架的選型
  3. js/css模塊化開發(fā)
  4. 組件化開發(fā)
  5. 靜態(tài)資源智能化管理

前端工程化方案

前端架構(gòu)

其中上有的React、Redux、ImmutableJs等框架為該架構(gòu)的直接依賴。下游為Business Components業(yè)務(wù)組件和Bussiness Modules業(yè)務(wù)模塊,銜接上下游的,是基礎(chǔ)組件。

技術(shù)選型

場景 方案
開發(fā)語言 ES6+Jsx(React)
模塊化CSS Sass/Less
RemoteData FetchAPI
Routing(路由) react-router
I18n gettext方案
編譯打包 Babel+webpack
Lint Eslint
UT(單元測試) Mocha+chai+Sinon+Enzyme
Demo Server Nodejs

JS/CSS模塊化開發(fā)

模塊化最核心的價值在于解決不同文件之間的分工和調(diào)用問題,及依賴關(guān)系。
JS模塊化方案有ES6 Module、AMD、CommonJS等。
CSS模塊化方案有l(wèi)ess,Sass,stylus等預(yù)處理器。

組件化開發(fā)

  • 頁面上的每一個獨立的可視/可交互的區(qū)域視為一個組件
  • 每個組件對應(yīng)一個工程目錄,組件所需的靜態(tài)資源就近維護。
  • 組件具有獨立性,組件之間自由組合。
  • 頁面是組件的容器,負責(zé)組合形成完整的界面。
名稱 說明 舉例
JS模塊 獨立的算法和數(shù)據(jù)單元 瀏覽器環(huán)境檢測(detect),網(wǎng)絡(luò)請求(ajax),應(yīng)用配置(config),DOM操作(dom),工具函數(shù)(utils),以及組件里的JS單元
CSS模塊 獨立的樣式單元 柵格系統(tǒng)(grid),字體圖標(biāo)(icon-fonts),動畫樣式(animate),以及組件里的CSS單元
UI組件 獨立的可使/可交互單元 頁頭(header),頁尾(footer),導(dǎo)航欄(nav),搜索框(search)
頁面 UI組件的容器 首頁(index),列表頁(list),用戶管理(user)

整個web應(yīng)用由多個頁面組成:


每個頁面由多個組件組成:

綜上所述,大致可以規(guī)劃處源碼目錄:

靜態(tài)資源管理

使用Webpack作為前端資源模塊化管理和打包工具。Webpack把項目當(dāng)作一個整體,通過給定的主文件(如:index.js),Webpack將從這個文件開始找到你的項目的所有依賴文件,使用loaders處理它們,最后打包為一個(或多個)瀏覽器可識別的JavaScript文件。


Webpack插件非常多,功能強大,此處不細說。

性能優(yōu)化

  • CDN部署
  • 緩存控制
  • 文件指紋
  • 緩存復(fù)用
  • 請求合并
  • 按需加載
  • 同步/異步加載
  • HTTP2.0服務(wù)端資源推送
  • 移動端首屏CSS內(nèi)嵌
  • 延遲加載
  • ... ...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容