webpack、gulp、rollup、tsc-babel 使用對比


webpack、gulp、rollup、tsc/babel 使用對比

LeapFE發布於 2020-10-28

本文檔主要介紹四種工具的特點, 包括優點、缺點、 輸入、輸出、能夠處理的文件類型,針對不同文件類型的處理方式, 以及其適用場景。

Rollup

簡介

Rollup 是一個模塊打包工具, 可以將我們按照 ESM (ES2015 Module) 規范編寫的源碼構建輸出如下格式:

  • IIFE: 自執行函數, 可通過 <script> 標簽加載
  • AMD: 通過 RequireJS 加載
  • CommonJS: Node 默認的模塊規范, 可通過 Webpack 加載
  • UMD: 兼容 IIFE, AMD, CJS 三種模塊規范
  • ESM: ES2015 Module 規范, 可用 WebpackRollup 加載

優點:

支持動態導入。

支持tree shaking。僅加載模塊里用得到的函數以減小文件大小。

Scope Hoisting。 rollup可以將所有小文件生成到一個大文件中,所有代碼都在同一個函數作用域里:, 不會像 Webpack 那樣用很多函數來包裝模塊。

沒有其他冗余代碼, 執行很快。除了必要的 cjsumd 頭外,bundle 代碼基本和源碼差不多,也沒有奇怪的 __webpack_require__Object.defineProperty 之類的東西,

缺點:

不支持熱更新功能;對於commonjs模塊,需要額外的插件將其轉化為es2015供rollup 處理;無法進行公共代碼拆分。

輸入:

options.input  單/多文件入口點

輸出:

rollup支持生成 iife、cjs、amd 、esm、umd格式的文件; 單/多js文件輸出

文件資源處理: 

rollup 通過插件來編譯處理各類靜態資源:

  • rollup-plugin-typescript2
  • rollup-plugin-babel
  • rollup-plugin-uglify
  • rollup-plugin-commonjs
  • rollup-plugin-postcss
  • rollup-plugin-img
  • rollup-plugin-json

基本使用參考

 https://www.cnblogs.com/tugenhua0707/p/8179686.html

適用場景:

由純js開發的第三方庫; 需要生成單一的umd文件的場景

案例:

純js/ts編寫的第三方庫:

React、Vue

UI組件庫 evergreen

使用 babel 將 js/ts 編譯成  esm 和 cjs 格式的模塊文件, 使用 rollup 將庫打包成  umd 格式的 evergreen.min.js 和 evergreen.js ,  打包出來的代碼比較干凈。

gulp

簡介

前端構建工具,gulp是基於Nodejs,自動化地完成 javascript、coffee、sass、less、html/image、css 等文件的測試、檢查、合並、壓縮、格式化、瀏覽器自動刷新、部署文件生成,並監聽文件在改動后重復指定的這些步驟。

借鑒了Unix操作系統的管道(pipe)思想,前一級的輸出,直接變成后一級的輸入,使得在操作上非常簡單。

gulp基於流式操作,通過各種 Transform Stream 來實現文件不斷處理 輸出。

優點:

gulp文檔簡單,學習成本低,使用簡單;對大量源文件可以進行流式處理,借助插件,可以對文件類型進行多種操作處理。

缺點:

不支持tree-shaking、熱更新、代碼分割等。 gulp 對 js 模塊化方案無能為力,只是對靜態資源做流式處理,處理之后並未做有效的優化整合。

輸入:

輸入(gulp.src) js,ts,scss,less 等源文件

輸出:

對輸入源文件依次執行打包(bundle)、編譯(compile)、壓縮、重命名等處理后輸出(gulp.dest)到指定目錄中去

適用場景:

靜態資源密集操作型場景,主要用於css、圖片等靜態資源的處理操作。

文件處理:

gulp通過各種中間件處理靜態資源的編譯:

案例:

antd

gulp + webpack + tsc / babel

gulp的作用主要是打包流程管理, 拷貝文件(less/ts/ts類型聲明文件),處理less, 拷貝並轉譯less 為css。

tsc及babel 則用於轉譯 靜態ts文件, 逐個輸出到指定目錄es/lib目錄下

webpack主要用於模塊化處理,將打包后的模塊編譯到 dist下的  antd.js   antd.min.js 以及及其他css文件等。

Webpack

簡介:

Webpack 是一種前端資源模塊化 管理和打包 工具。它可以將許多松散的模塊按照依賴和規則打包成符合生產環境部署的前端資源。還可以將按需加載的模塊進行代碼分割,等到實際需要的時候再異步加載。

優點:

基本之前gulp 可以進行的操作處理,現在webpack也都可以做。同時支持熱更新,支持tree shaking 、Scope Hoisting、動態加載、代碼拆分、文件指紋、代碼壓縮、靜態資源處理等,支持多種打包方式。(優點有很多,在這不做過多贅述)

缺點:

不支持 打包出esm格式的代碼 (打包后的代碼再次被引用時tree shaking 困難), 打包后亢余代碼多,配置較為復雜。

輸入:

入口文件 js/ts

輸出:

js、css、 img等靜態資源文件

適用場景:

應用程序開發

案例:

react-bootstrap

react-bootstrap 使用babel進行tsx文件的編譯,並且按照原有目錄輸出到 lib esm/cjs目錄下;

同時使用shell 工具 拷貝 TS類型聲明文件 到對應目錄;

對於umd文件,則采用webpack打包生成了  react-bootstrap.min.js 及 react-bootstrap.js 輸出到dist下。

打包umd方式非常簡單,但文件中保留了許多webpack使用的到的冗余代碼。生成效果不如上述 的 evergreen 純凈。

tsc / babel

簡介

tsc/babel 可以將 ts 代碼編譯 js 代碼。支持編譯成 esm、cjs、amd 格式的文件

優點:

編譯速度快,可以保留原有的目錄相對位置,分目錄保存各模塊的代碼,便於按需引用加載;

缺點:

只對語言本身進行編譯轉換,不支持tree shaking 等高級功能。

輸入:

ts/js 文件

輸出:

ts/ts對應的js文件,且一一對應

案例分析:

tsc/babel常與其他工具配合使用

打包使用方式推薦

第三方js類庫:

  1.  rollup + 插件 (推薦)
  2.  babel/tsc + uglifyjs
  3.  webpack

UI類庫開發(按需加載)

生成esm   tsc/babel  + gulp

生成cjs     tsc/babel + gulp

生成umd   rollup (js + css的合並文件)

開發應用程序

webpack + loader + plugin

上述打包方式各有其特點,根據當前需求及開發便利,酌情選擇打包編譯方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM