如何構建前端代碼

jopen 9年前發布 | 22K 次閱讀 前端 前端技術
 

基本認識

開發環境和線上環境的區別

在很久以前,前端的部署其實比較簡單,開發環境下,靜態資源往服務器上面一扔就ok了,如果考慮下優化或者代碼保護,也只是加一個代碼壓縮和混淆。沒錯,剛入行的時候我就是這么干的。。。

但是隨著前端復雜度的發展,上面的做法已經無法滿足需求了,特別是AMD,CMD概念的引入,打包合并就變成一項基本工作了。

舉一個requirejs的例子,在一個復雜點的前端系統中,你能想象不打包直接上線嗎,那樣換來的可能就是打開首頁就需要download幾十個甚至上百個模塊資源,這種行為是對網絡資源的一種無謂消耗。所以對應requirejs有個r.js,就是專門消滅這種無謂請求消耗的,它做的事情也比較簡單,按照一定規則,把各種模塊合并成一個,這樣在上線是一次請求就能download需要的所有js。

開發環境代碼和線上代碼區別

首先大家可以在構建時取消類似壓縮,混淆這幾部,可以觀察下,構建完成后的代碼,會和開發時你所寫的有差別,開發環境的代碼都經過了編譯處理,根據一定的規則重新編譯過。

舉一個例子,我們在使用css3時,如果去自己寫樣式去適配chorme,safari,opera等等會累死。但是我們按照一個規則寫一個,在構建時,代碼自動做補全,是不是就很方便,能提高不少效率。

再舉個例子,現在比較前沿的已經在開發環境下使用ES6了,但是想要在瀏覽器端直接運行還需要一段日子,但是沒事,我們有Babel之類的工具,可以在編譯時實現ES6到ES5的代碼轉換。這種用法我還沒有用過,但是通過構建,我們可以用于嘗試一些新的東西。提前做一些技術積累。

前端工程化核心環節

從前面兩點大家應該能看出構建這一步的重要性了吧,可以說需要做到前端工程化,提高開發效率等,構建編譯這一個步驟絕對是核心步驟之一。他的角色不遜色于搭建service,項目腳手架等等

具體舉例

百度前端不僅有個fis(前端集成解決方案),還有一個edp,也是一個前端集成解決方法,主要是百度商業體系的前端在使用。由于我們一直在使用edp,所以下面用edp舉例去了解下前端構建

下面介紹一下我們自己系統中的一些使用

  1. 首先是js模塊的合并,我們會按照首屏加載和可以懶加載的功能劃分,將模塊合并成整體,這樣就避免了散文件的出現。首先散文件是有害處的,第一是,散文件可能沒有版本號的區分,這樣因為緩存導致bug;第二是散文件會嚴重拖慢性能,因為很多散文件不僅消耗請求資源,而且是在串行消耗。

  2. 將js用到的模板的合并,目的也是減少無謂的請求。

  3. 將less轉換成css進行合并

  4. 將js文件壓縮處理

  5. 將合并后的文件進行加上文件MD5版本號處理,MD5的目的就是基于文件內容解析出版本號,這樣如果某個模塊沒有變更過,可以一直使用緩存,提高性能。

  6. 將合并后并且包含MD5的文件的path更新到首頁html的require的config中

  7. 修改文件引用對應的path,因為類似于js引用的模板和css都需要更新到打包合并的path上

  8. 清理輸出時的無用文件

  9. 添加版權信息等等

上面是一個基本流程,如果有特殊的需求,可以繼續添加處理模塊。例如想引入reactjs,如果是構建時打包的話,我們肯定不希望上線的代碼里面有一個browser.min.js文件,這樣不僅增加了靜態資源,而且增加了一個jsx翻譯處理。那么我們可以在構建時增加一個jsx2js的步驟,這樣就達到了,開發使用jsx,但是發布上線時,自動處理成了js代碼。

關于性能優化

這種構建處理,我理解出發點都是從性能角度考慮的。

對于一線的業務開發過程,我們期望的是高效的開發業務,并不能把性能等等要求強加到業務開發中,不然我們業務開發是低效的,而且,隨著性能優化策略的變更,我們無法隨意的在業務中修改代碼及時配合,就算是有人力修改,也可能導致bug。

所以將構建和業務解耦也是很關鍵的,只要業務開發符合某個規范,我們可以根據性能優化的點隨時更新優化策略,構建代碼的差別也是僅僅體現在性能上,而不會延生到業務中。

注意事項

大家可以看看前面幾篇文章《如何避免工程效率陷阱》,《如何在大公司中成長》我們在擁抱前端工程化時,不要停留在使用階段,也需要花點時間研究下原理,不然就很容易被工程了,因為你要相信未來前端的工程化只會讓你的業務開發更加簡單,關心的東西更少。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!