1. 程式人生 > >前端自動化(一)

前端自動化(一)

隨著前端技術棧的發展,形成了自動化,工程化等相關概念。

工具化

在前端的技術棧發展過程中,出現了很多的工具,形成了工具化,能夠用工具完成的絕不要手工完成,來幫助開發者提升效率。
1. 前端工作流工具: Gulp,Grunt
2. 前端js模組編譯工具:Babel,Browserify,Webpack
3. 包管理器: npm,bower
4. 前端開發系列工具: livereload,資料mock,程式碼監控,程式碼檢查。

工程化

工程化是一個發展趨勢,以工具化為基礎。

工程的核心是流程自動化,又稱為構建,這些包括了:程式碼質量檢測,程式碼壓縮,程式碼合併,程式碼優化,程式碼編譯,單元測試等等部分。構建就是把這些以工作流程的方式組合起來,然後用一個命令列執行這整個流程。它有點像批處理,但是是程式開發中使用的特殊批處理。

自動化

自動化是以工程化為基礎,是在流程自動化上更進一步的自動化。

持續整合就是全自動化的一個終極體現。他的主要流程是:版本控制庫 ->構建 ->測試 ->報告.

程式碼規範

程式碼規範可以提高程式碼的可閱讀性和避免一些低階錯誤。為了將程式碼規範的檢查放到前端開發工程中,各種前端語言都有對應的hint或者lint工具。在github官方推出的atom裡有眾多的外掛可以做程式碼的質量檢查,會讓開發者在儲存程式碼時即給出相應的提示。向html,css的錯誤,常規情況下並不容易被發現,有了這些工具就可以改善這一點。

預處理

SASS

甚至為了避免這一點,引入了各種預編譯語言,css的預編譯less,現在流行的是sass,功能也更加強大,語法錯誤無法通過編譯,來彌補css這種缺陷。

sass的優勢很明顯:

  1. sass提供了很多簡便的寫法,css預編譯,主要的設計思想可以按照程式設計的思路去編寫自己的樣式,SCSS在SASS3.0的基礎上吸收了Less,形成了現在的SCSS.
  2. 易維護,更方便的定製
  3. 效率的提升,css3的發展,加上主流瀏覽器的相容性不一,hack的處理可以由sass處理.

以及為了提高效率推出了眾多的sass庫,compass等。

ES6

js的預處理語言也有很多,只是為了讓有其他語言經驗的開發者更容易的上手js的編碼。

因為瀏覽器的實現大多還是 ES5 的標準,為了使用最新的 ES6 語法,通常的做法是採用 Babel 將 ES6 編譯為 ES5。

js模組化

這個過程中,出現了AMD,CMD,UMD這些模組定義模式。
- AMD(Asynchronous Module Definition): 非同步模組定義,可以非同步的載入或依賴其他模組,支援的庫如 Require.js, Sea.js 。
- CommonJs : 可以將 Javascript 按照 Node 模組的方式定義。
- UMD: 為了相容 AMD 還是 CommonJsx 風格,出現了 UMD。

AMD例子:

define(['jquery'], function ($) {
    function myFunc(){};
    return myFunc;
});

CMD例子:

var $ = require('jquery');
function myFunc(){};
module.exports = myFunc;

UMD例子:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        //Node, CommonJS-like
        module.exports = factory(require('jquery'));
    } else {
        //Browser globals (root is window)
        root.returnExports = factory(root.jQuery);
    }
}(this, function ($) {
    //methods
    function myFunc(){};
    //exposed public method
    return myFunc;
}));

其中,CommonJs 的風格是需要編譯的,最終會將多個模組編譯為一個 UMD 方式定義的模組。使用webpack[推薦]。

Browserify 是最先出現的 CommonJs 編譯工具,使得我們可以像寫 Node 模組一樣寫前端程式碼,Browserify 可以 build 使用 npm 中的所有模組(只要模組支援在前端中執行)

Webpack 是支援 CommonJs 和 AMD 的模組編譯工具,逐漸替代 Browserify, 基於 AMD 的好處就是程式碼可以非同步話,這是 Browserify 無法做到的

檔案處理

通常一個前端專案會分有一個 src 目錄和 dist 目錄, src 放置原始碼,dist 放置編譯後的程式碼。所以在前端工程的流程中會涉及到檔案的拷貝,刪除,移動等流程。

開發效率

通常的前端開發過程是,修改前端程式碼,呼叫命令編譯程式碼,然後瀏覽器 F5 重新整理。這個過程可以做到自動化,通過程式碼監控工具,指定要監控的目錄和檔案,如果對應檔案有改變,呼叫編譯工具編譯原始碼,然後通過 livereload 自動重新整理瀏覽器。 gulp-browserify也可以實現同樣的功能。

資料的mock

現代化前端專案開發大多是前後端分離的方式,也就是後端基本是提供 API 服務,在真實開發環境中,通常的問題是,後端 API 極其不穩定或者沒開發,為了不阻礙前端的開發,通常的做法是,前後端先約定 API 介面定義,然後前端根據定義 mock 介面。

我們可以利用mock工具mock.js來實現。

效能需求

  1. 程式碼壓縮
  2. 程式碼合併
  3. 圖片壓縮
  4. 雪碧圖或者css sprit。

這些過程都可以在前端工程的 build 過程中實現。

前端工作流

為了解決前端工程中複雜的流程,出現了很多開源前端流程處理工具。這些工作流工具不僅僅是其本身,都是一個流程生態體系,每個工具都涉及到對應的外掛庫,幾乎我們能想到的前端工程問題都有對用的外掛能夠解決。

Grunt和Gulp

目前 Gulp 幾乎已經取締 Grunt ,成為前端的預設流程工具,其核心思想是基於記憶體的流的方式,提供高效的效能,極簡的 API,定義不同的 task,然後將 task 串聯起來。

關於gulp,可以參見我的另一篇文章gulp入門1

版本管理工具

git,linux創始人的作品,語法和shell類似,目前最牛的版本管理工具,建議使用命令列,而不是圖形化介面,這樣是無法領略它的美。

大量的使用,繪製git命令圖,完成日常的開發足矣。

後言

目前國內也出現了前端構建工具[實現工程化],如百度的fis,百度在第3版中說明,編譯工具應該具備的3個核心能力:

  1. 資源定位: 獲取任何開發中所使用資源的線上路徑
    分離開發和部署路徑之間的關係,靜態資源的定位,加上了md5的戳.
    對html的script,link,style的內容,替換url.
    在css中定位url
  2. 內容嵌入:把一個檔案的內容(文字)或者base64格式的圖片嵌入到另一個檔案中去。
  3. 依賴宣告:在一個文字檔案內標記對其他資源的依賴關係。

在我們學習自動化的過程中,可以選擇多個開源的組合工具,如gulp + webpack + Babel等,也可以選擇類似百度的fis這類整合工具。

現在國內的大公司,在招聘前端,一般都會要求會使用這些工具,做到前端自動化的開發,我覺得這是趨勢,工具能夠簡化開發流程,豐富的庫也可以提升開發效率,使我們專注於造更小的輪子,我相信,一旦使用了這些工具,就再也回不去了,應為它真的很好用。具體的工具使用我會陸續的在部落格中更新,針對性的寫一些東西,來完善自己的知識體系。