前端構建工具整理

前文

端技術範圍不斷髮展,前端開發不只限於直接編寫html,css和javascript,Web應用日益龐大,代碼也更加龐大,所以許多新的思想(例如模塊化和工程化等)和框架(React和Vue等),以及新的語言(Es6 TypeScript)隨之出現,而構建工具則承擔起了中間的橋樑做用。javascript

正文

構建工具最直接的做用是:將源碼轉換成可執行的js,csshtml,具體包括:css

  • 代碼轉換:ts->js,scss->css
  • 文件優化:壓縮js,css,html,壓縮合並圖片等
  • 代碼分割:提取公共代碼。
  • 模塊合併:將模塊化裏的多個模塊和文件合併到一個文件
  • 自動刷新:監聽本地代碼,自動從新構建,刷新瀏覽器。(熱重載)
  • 代碼校驗:代碼被提交到倉庫前須要校驗規範
  • 自動發佈:更新代碼後,自動構建出線上發佈代碼,傳輸給發佈系統

構建實際上是工程化和自動化思想的再前端的體現:將一系列流程用代碼自動去實現,解放生產力。html

常見前端構建工具的分類和對比

1. Npm Script

npm是nodejs附帶的包管理器,npm script是npm內置的一個功能,容許在package.json文件裏面使用script字段定義任務:前端

{
    "scripts":{
        "dev":"node dev.js",
        "pub":"node build.js"
    }
}

在這裏,一個屬性對應一段shell腳本,原理是經過調用shell去運行腳本命令java

優勢

  • 內置,無需安裝其餘依賴

缺點

  • 功能簡單,不方便管理多個任務依賴

2. Grunt

  • Grunt與npm script相似,也是經過shell運行腳本命令。
  • Grunt與大量封裝好的插件,能夠用於常見任務,也能管理任務之間的依賴。
  • grunt的具體執行代碼和依賴關係寫在配置文件的裏,例如:
module.exports = function(grunt){
    //插件的配置信息
    grunt.initConfig({
        uglify:{
            app_task:{
                files:{
                    'build/app.min.js':['lib/index.js','lib/test.js']
                }
            }
        }
    })
    ...
}

優勢

  • 靈活,只執行咱們定義的任務
  • 有大量現成的插件

缺點

  • 集成度不高,須要些大量配置
  • 至關於進階版npm script

3. Gulp

基於的自動化構建工具。除了能夠管理和執行任務,還支持監聽讀寫文件。簡單例子:node

var gulp = require('gulp');     //引用基礎模塊
var uglify = require('gulp-uglify');    //js壓縮模塊

gulp.task('script',function(){  //啓動任務script
  gulp.src('js/*.js')           //找到文件
  .pipe(uglify())               //壓縮文件
  .pipe(gulp.dest('dist/js'))   //另存壓縮文件
});
//監聽
gulp.task('auto',function () {
  gulp.watch('js/*.js',['script']);     //監聽script任務
  gulp.watch('css/*.css',['css']);      //監聽css任務
  gulp.watch('images/*.*',['images']);  //監聽images任務
});

優勢

  • 靈活,可單獨使用也可搭配其餘工具
  • 集成度不高

缺點

  • 增強版Grunt,增長文件監聽,文件讀寫,流式處理任務
  • 至關於進階版npm script

4. fis3

fis3相對於前面的工具,集成了Web開發中經常使用的構建功能:webpack

  • 資源定位:分離開發路徑與部署路徑之間的關係,工程師只須要使用相對路徑來定位本身的開發資源,代碼容易移植
  • 文件指紋:輸出文件時,爲文件url+md5戳,優化緩存
  • 文件編譯:經過parser配置文件解析器作文件轉換
  • 壓縮資源:在文件中經過match配置壓縮器,實現前端工程優化
  • 圖片合併:CssSprite(雪碧圖)配置,合併多個css導入的圖片到一個圖片,減小http請求

優勢

  • 靈活,只執行咱們定義的任務
  • 有大量現成的插件

缺點

  • 集成了Web開發中經常使用的構建功能,配置簡單,開箱即用
  • 官方再也不維護和更新,不支持最新版本的node.js
  • 是一個專一於web開發的完整解決方案

5. Webpack

webpack是一個打包模塊化js的工具,在webpack裏,一切文件都是模塊,經過Loader轉換文件,經過plugin注入鉤子,最後輸出由多個模塊組成的文件。webpack專一於構建模塊化項目。es6

優勢

  • 專一於模塊化,開箱即用一步到位
  • 經過plugin拓展,完整好用又不失靈活
  • 使用場景不侷限於web開發
  • 社區龐大活躍
  • 良好的開發體驗

缺點

  • 只能用於模塊化開發

6.Rollup

Rollup是一個相似於Webpack模塊打包工具,但專一於ES6的模塊化。web

優勢:

  • 能對es6的源碼進行Tree Shaking(簡單介紹剔除無效代碼,稍微詳細點就是能夠去除已經被定義卻沒被使用的代碼並進行Scope Hoisting(做用域提高),以減少輸出文件的大小和提高運行性能。)

缺點:

  • 打包時不支持code Spliting(對打包生成的bundle.js文件進行分割成chunk塊),因此沒有模塊加載、執行和緩存的代碼。好處是打包js庫時,文件更小,可是功能不夠完善
  • 插件庫比較少,社區不夠活躍

7.parcel

parcel是一款剛誕生不久的新型打包器,而且短短几周內就得到大量贊同。shell

優勢:

  • 快速打包:parcel使用工做進程啓用多核編譯,而且有文件系統緩存,從新啓動後也能夠快速構建
  • 打包全部資源:支持JS,CSS,HTML,文件資源等等 - 不須要安裝任何插件。
  • 自動轉換:在須要時,代碼使用 Babel,PostCSS 和 PostHTML 自動轉換
  • 零配置代碼拆分:使用動態 import() 語法拆分您的輸出包,因此只加載初始加載時所需的內容。
  • 模塊熱替換:在開發過程當中進行更改時,Parcel 會自動更新瀏覽器中的模塊,不須要進行任何配置。
  • 友好的錯誤記錄

缺點:

  • 不支持 SourceMap :在開發模式下,Parcel 也不會輸出 SourceMap,目前只能去調試可讀性極低的代碼;
  • 不支持剔除無效代碼 ( TreeShaking ):不少時候咱們只用到了庫中的一個函數,結果 Parcel 把整個庫都打包了進來;
  • 零配置的實現實質是默認值,Parcel 只要在目錄中發現這些配置文件就會認爲該項目中的代碼須要被處理,致使某些已經被處理的庫可能會被屢次處理
  • 某些配置被關閉,在特定場景不適用
  • 只專一於構建用於運行在瀏覽器中的網頁,不像webpack同樣能夠打包發佈npm的庫,構建nodejs同構應用等

發展歷史

  • npm script 和grunt, web開發要作的事情變多,流程複雜,引入自動化思想
  • Gulp時代,出現一些新語言提升開發效率,流式處理思想的出現,簡化了文件轉換的流程
  • webpack時代,單頁應用流行,網頁功能更加複雜和龐大,web開發向模塊化改進,

做用

1. 實現模塊化和版本管理

當項目比較龐大時,須要引入不一樣的庫,帶來了如下問題:

不一樣庫命名空間衝突(例如jq和zepto都使用了window.$)
庫之間有依賴,須要控制加載順序
須要管理庫的版本
這種狀況下,模塊化的思想出現了:將複雜系統分割成多個模塊以方便開發。 主要的模塊劃規範:

commonJS

一種js模塊化規範,commonJS的核心是經過requrire方法,同步加載所依賴的其餘模塊,經過module.exports導出須要的接口,具體使用方式在此不深刻

優勢
  • 代碼在nodeJS的環境下能運行
  • Npm發佈的第三方模塊不少都採用了commonJS規範:
缺點
  • 沒法直接運行在瀏覽器環境,必須藉助工具轉換

AMD

另外一種js模塊化規範,與 commonJS的關鍵區別是異步加載所依賴的模塊。AMD主要針對瀏覽器環境的模塊化,表明實現是requirejs

優勢
  • 可直接運行於瀏覽器
  • 能夠異步加載
  • 能夠並行加載多個依賴
  • 代碼可運行在瀏覽器和nodejs環境
缺點
  • 須要先引入實現了AMD的庫才能使用

ES6模塊化

ES6在語言層面實現模塊化,經過使用importexport導入和導出模塊。ES6的模塊化將要逐漸取代Commonjs和AND規範,是模塊化的終極解決方案。

優勢
  • 是模塊化的終極解決方案
缺點
  • 目前沒法直接運行在大部分的js運行環境,須要藉助構建工具等轉換成es5

2. 實現工程化和自動化

前端工程化的意義,是爲了提升編碼->測試->維護 的運行效率,主要從開和部署兩方面來入手:開發方面須要作好代碼規範和開發模塊化;部署階段的主要流程包括:

  1. 代碼檢查
  2. 代碼合併和壓縮
  3. 代碼編譯
  4. 單元測試

工程化就是藉助構建工具實現流程自動化,而前端自動化能夠理解爲在工程化上作更進一步的自動化。

3. 性能優化

從前文對構建工具的介紹能夠看出,這裏的性能優化主要如下方面:

  1. 代碼文件壓縮,壓縮Html、Css、Javascript等文件,減少體積
  2. 圖片壓縮和合並,例如廣爲人知的Sprite(雪碧圖)技術

4. 提供熱重載

熱重載也就是自動刷新,主要是監聽本地源代碼變化,自動從新構建和刷新瀏覽器,隨着新的技術框架的出現,例如Vue,React等,這門技術也基本成爲了開發標配。

小結

若是內容有錯誤的地方歡迎指出(以爲看着不理解不舒服想吐槽也徹底沒問題);若是對你有幫助,歡迎點贊和收藏,轉載請徵得贊成後著明出處,若是有問題也歡迎私信交流,主頁有郵箱地址

參考資料,吳浩麟《深刻淺出 Webpack》

相關文章
相關標籤/搜索