前端團(tuán)隊 Gulp & Webpack 工作流 遷移記

折騰

從 2015 到現(xiàn)在,短短的三年內(nèi),幾乎每年折騰一下工作流的 “ 更新?lián)Q代 ”。從最早開始使用 Grunt 到 Gulp 再到 Webpack,再到 Rollup,再到 Webpack@2.x ......

在這個前端工具變化如此之快的浪潮里,在前端團(tuán)隊中,并發(fā)合作開發(fā)多個項目,前后端分離等等情況下,配置 或者 升級 或者 遷移 這樣的工作流 基本生產(chǎn)工具,往往造成耗費的就不是僅僅一個人的時間成本,而是十人,數(shù)十人的量級。

所以 一個靠譜、穩(wěn)定、有效的工作流方案就顯得特別重要。

Gulp

14 年 15 年初,因為構(gòu)建性能等問題,已經(jīng)從 Grunt 遷移到 Gulp 了 ( duowan/generator-lego )。從開源的 Github 倉庫上不難看出,主要 工作流 是基于命令行的形式,配合 yeoman 腳手架工具,以 Gulp 任務(wù)為核心的。

對于 Gulp 定義,官方的說法是

gulp is a toolkit for automating painful or time-consuming tasks in your development workflow, so you can stop messing around and build something.

表明著,Gulp 是一個專門幫你處理一些痛苦耗時的自動化任務(wù)工具。

在這個表述中,Gulp 傾向的是于對 “任務(wù)” 這個概念的處理,而這個 “任務(wù)”,其實如果我們都嘗試配置過 Gulp 的話,也就大概明白是怎樣的一回事。

在這段時間期間,團(tuán)隊面向的業(yè)務(wù),主要分類占比最大的是 專題類,運營類。

在這類專題基本入口都是從 HTML 開始,寫 HTML Dom 結(jié)構(gòu),寫樣式,再后可能就寫一些 JS 動效或者 AJAX 。幾乎 JS 占比分量是超級少的,個別頁甚至沒有腳本,單純給到 HTML & CSS 給到后端同事直出數(shù)據(jù)。

那時候 Gulp 所配置的任務(wù)

  • 監(jiān)聽匹配文件的變化自動刷新瀏覽器
  • 自動編譯 SASS
  • 自動補全 CSS3 前綴
  • 多雪碧圖合并、2x、3x 拼圖
  • 等等

基于編譯 HTML / SASS / 圖片的任務(wù),已經(jīng)是完全滿足我們的需求了。

Webpack

在 15 年末開始,漸漸接入的業(yè)務(wù)方向改變,需要接觸到 Vue,也就漸漸發(fā)現(xiàn) Gulp 對于 JS 模塊處理的局限性。也在這時候,開始衡量是否需要遷移到 Webpack。

對于 Webpack 定義,官方的說法是

webpack, the production / unbiased / flexible / extensible / open source module bundler.

表明著,Webpack 是一個 xxx 的打包器。

而在這個表述中,Webpack 更多的偏向于資源的整理打包。而這個打包的開始,就是 定義在配置上的 entry。

對于 Vue 或 React 這類型的項目,Webpack 無疑是最最最適合不過了,以 JS 模塊為編寫入口,生成依賴鏈,整理打包出 HTML / JS / CSS / 圖片。

開始本來也就以為 單單工作流核心 將 Gulp 遷移到 Webpack,這樣就可以輕松解決。

直至到后來在 雪碧圖的合并,2x / 3x 多倍圖的輸出上,在 Webpack 上苦苦找尋不了比較完美的解決方案等等。

另外團(tuán)隊還存有一些 專題業(yè)務(wù)類 的需求,也需要兼容舊有項目,團(tuán)隊成員開發(fā)時候,切換前端生產(chǎn)工具的適應(yīng)性等,帶來了一系列的問題。

這時迫切希望有 更加簡便、有效的工作流方案。

Gulp + Webpack

既然 Gulp 對任務(wù)處理的強大,而 Webpack 對 JS 模塊處理的專業(yè),也就衡量著這兩者的混合。

由 Gulp 基于處理 HTML / SASS / 圖片等部分,Webpack 主要對 JS 模塊進(jìn)行編譯。
帶著這樣的想法,也有網(wǎng)上挺多的思路,例如 gulp + webpack 構(gòu)建多頁面前端項目

但是都忽略了較根本上的問題 :

  • 每次 JS 改變都重新通過 Webpack 完整打包輸出,效率沒有保證
  • Webpack 下 JS 熱刷新應(yīng)該怎么聯(lián)動 Gulp 的熱刷新

基于解決根本痛點的,平衡功能,使用了另外一套方案 :

  1. Webpack 基于 webpack-dev-server 啟動熱刷新 服務(wù) A
  2. browser-sync 使用 proxy 代理 服務(wù) A 啟動 服務(wù) B
  3. Gulp watch HTML / SASS / 圖片 變動
  4. Gulp watch 變動后觸發(fā) browser-sync reload
  • 通過 webpack-dev-server 熱刷新等方式,優(yōu)化 開發(fā)中 JS 構(gòu)建效率
  • 通過 proxy 代理 讓 webpack-dev-server 熱刷新同步刷新 瀏覽器

Gulp 負(fù)責(zé)部分的 HTML / SASS / 圖片等任務(wù)基本沒有太大的變動,因而可以兼容到過往的舊項目需求,另外團(tuán)隊成員額外需要了解的是 JS 模塊 Webpack 部分的構(gòu)建,學(xué)習(xí)成本相對降低,在 2015 年末正式作為工作流解決方案加入在團(tuán)隊腳手架工具。

走多一步

2016 年初開始,因組內(nèi)成員的增加,或者工作流功能版本的更新, 都伴隨著維護(hù)工作流的各種問題 ( 即便寫了不能再詳細(xì)的文檔 ),大致回歸到 Node 版本的兼容性,node_modules 的版本功能兼容,Windows / macOS 帶來的兼容性等等問題。
這時在思考著,能否有包裝多一層去讓這些兼容性問題都 避免開呢 ?

其實對于這樣的整體封裝,無疑有兩條路可以走

  • 類似于 NW 那樣構(gòu)建出 平臺應(yīng)用
  • 類似于 PKG 那樣構(gòu)建出 執(zhí)行程序

在尋找解決方案的時候,發(fā)現(xiàn)了 weixin/WeFlow ,但深入發(fā)現(xiàn) WeFlow 僅基于 Gulp 任務(wù),功能遠(yuǎn)遠(yuǎn)滿足不了需求。

于是便開始了輪子的重構(gòu),首先遇到問題是 node-sass 的編譯依賴問題,感謝 WeFlow 開發(fā)者分享踩過的坑( node-sass 依賴環(huán)境問題 · Issue ),如果團(tuán)隊是使用 less 或者 stylus 都無需重置那些依賴。

另外遇到了最麻煩的問題就是把 webpack 生態(tài) 遷移到應(yīng)用上去,babel 依賴 / vue-loader 依賴 / ..... 其中遇到過各種依賴被重置到全局的問題,都在 babel 或者 vue-loader 的源碼上進(jìn)行 切面置換依賴。

經(jīng)過幾個內(nèi)測版本的開發(fā)下,造出了 legoflow/legoflow

組內(nèi)推行使用后也得到了 贊同的反饋,經(jīng)過了幾個大項目的洗禮后,從功能性變得更加豐富,兼容性上更加穩(wěn)定。

而在今年 6 月也對外兼容版本 LegoFlow

走得更遠(yuǎn)

現(xiàn)在工作流中內(nèi)置的 Webpack 還是基于 1.x 版本,其實在年初的時候是有想法把 整個 Webpack 生態(tài)升級為 2.x,因為在 webpack 2.x RC 期間,對 Rollup tree-shaking 已經(jīng)很垂涎了。

但是 Webpack 正式到 2.x,卻發(fā)現(xiàn)無法兼容到 IE8 ( webpack2 doesn't support IE8 · Issue #3070 · webpack/webpack ),部分業(yè)務(wù)也脫離不了 IE8 的行列。

但計劃在更遠(yuǎn)一點的時間下,看看如何能否到實現(xiàn) Webpack 1.x & 2.x 的無縫切換。

最后

前端團(tuán)隊幾次的生產(chǎn)力工作流工具的遷移,只是前端這個大浪潮中最小最小的 縮影。

每次改變像是意味著 進(jìn)化,在如今 這個前端浮躁的年代,希望 做著相同事情的我們 有著一如既往的 初心 上下求索。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,482評論 2 379

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