webpack uglify

前言:

前端開發(fā)過程中,一般我們會使用 webpack 來做資源的打包壓縮等處理,在資源壓縮的過程中,一般我們會用到 uglifyjs-webpack-plugin 這個插件,這次我們就來講一下我在使用這個插件時遇到的一些問題

異常:

  1. SyntaxError: Cannot declare a let variable twice

這個 bug 是在 iPhone 10.3.x 的 Safari 瀏覽器上觸發(fā)的,當(dāng)時是使用了 swiper 這個庫的頁面都崩潰了

解決方法也很簡單,修改配置如下:

new UglifyJsPlugin({
  sourceMap: true,
  uglifyOptions: {
    ecma: 8,
    // safari10: true,
    mangle: { safari10: true }
  }

坑的地方在是根據(jù) uglifyjs的文檔 配置成這樣是無效的:

new UglifyJsPlugin({
  sourceMap: true,
  uglifyOptions: {
    ecma: 8,
    safari10: true
  }
  1. TypeError: undefined is not an object (evaluating

這個 bug 是 iPhone 的 Safari 上偶現(xiàn)發(fā)生的,同一行代碼,同樣的設(shè)備,偶現(xiàn)

解決方法也很簡單:

// Changing this:
this.array.forEach(...)
// To this:
this.array && this.array.forEach(...)

根本原因是:


uglify-es

uglify-es 是什么時候用到的?壓縮的時候,uglifyjs-webpack-plugin 依賴它,所以這個問題要解決,只需要把 uglify-es 從 3.3.2 降級到 3.2.2 就可以了 。

這個 issue 從 2017年12月26日 提出,到了 2018年3月12日 才被關(guān)閉,算很快了

  1. Cannot read property 'call' of undefined

這個 bug 是在低版本的 Android 設(shè)備上必現(xiàn)的問題,頁面直接 crash,只留下這個報錯

這個 issue 非常有趣,它是 2015年4月9日 被提出來的,社區(qū)討論了很多解決方案,很遺憾都無法讓我 work

到了 16 年的時候也沒有解決,社區(qū)已經(jīng)瘋狂了

2016年3月17日

Please fix the issue~

2016年8月4日

仍然推測是 DedupePlugin 的問題

2018年1月20日

issue被關(guān)閉了,但是問題并沒有解決

這個問題至今也沒有一個明確的答案,雖然 issue 被關(guān)閉了,但還是有開發(fā)者不斷的來追問

然而我知道問題出在哪。

  1. 因?yàn)樗辉谏a(chǎn)環(huán)境觸發(fā),因此極有可能是代碼壓縮的問題
  2. 我也忘了我是怎么搜索這個問題的,只記得得出的結(jié)論是 uglify-es 的 bug
  3. 我看了一下 UglifyJS2 的 commit 和 release log,發(fā)現(xiàn)什么也看不懂
  4. 最后只記得是要upgrade uglify-es的版本來解決這個問題

然而這篇文章的第二個 bug,是需要downgrade uglify-es的版本,所以 uglifyjs-webpack-plugin 的這個 bug 是解決不了了,至少現(xiàn)在解決不了。

但我們的代碼必須壓縮才能上線,并且要保證低版本設(shè)備的兼容,怎么辦?

換一個壓縮插件:babel-minify-webpack-plugin
它的默認(rèn)配置也更合理一點(diǎn),使用很簡單:

new MinifyPlugin(
  {}
)

完。

然而事情并沒有那么簡單,babel-minify-webpack-plugin 也有它自己的 bug,它對 sourceMap 的支持不友好:issue

在 issue 中我們也找到了解決方法:


只支持 cheap-*開頭的 sourceMap

然而在 SSR 的時候,cheap-*開頭的 sourceMap 也是不支持的,解決方法也很簡單:

// webpack.client.config.js
new MinifyPlugin(
  {},
  {
    sourceMap: "cheap-module-source-map"
  }
)
// webpack.server.config.js
new MinifyPlugin(
  {},
  {
    sourceMap: false
  }
)

這樣問題就解決了,server 端本來就不需要 sourceMap,client 端生成的 sourceMap 將就一下也能用,雖然對找 bug 不友好,但是起碼用戶可以 work 了

  1. 其實(shí) uglifyjs-webpack-plugin 也有另一個 bug,它在和 AggressiveSplittingPlugin 搭配使用的時候,會報:Uncaught SyntaxError: Unexpected token 這類錯

解決這個 bug 也很簡單,換成 babel-minify-webpack-plugin 就完了

最后:

為了節(jié)約研發(fā)成本,還是推薦使用 cli 工具:vue-cli

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 Webpack 1.1 概念簡介 1.1.1 WebPack是什么 1、一個打包工具 2、一個模塊加載工具 3...
    Kevin_Junbaozi閱讀 7,022評論 0 16
  • 在現(xiàn)在的前端開發(fā)中,前后端分離、模塊化開發(fā)、版本控制、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,659評論 1 32
  • 非常感謝胖哥的博客和掘金小冊的技術(shù)分享,希望大家去下面的鏈接去查看原文,他們寫的非常好,都是多個項目經(jīng)驗(yàn)的總結(jié)??!...
    示十閱讀 2,377評論 0 2
  • 對學(xué)校厭煩至極曾經(jīng)拒絕接受系統(tǒng)美術(shù)教育的我,于夏天電腦文件丟失無聊畫的。 畫的很慢,大約兩小時……
    cIndybAebii閱讀 246評論 0 0
  • 這幾年,相親大隊日漸擴(kuò)大,單身女性越來越多。近日,多則女方擇偶標(biāo)準(zhǔn)擠進(jìn)熱搜,除了要求有房有車,還要長得帥還顧家。...
    大萌666閱讀 350評論 0 1

友情鏈接更多精彩內(nèi)容