缘起

由于维护 roadhog 和 umi,收到构建方面的问题反馈比较多,其中一个常见的是打包时 uglify 压缩的问题。类似下面的报错都是这个引起的,

Failed to minify the bundle. Error: 0.0f3f4c41.async.js from UglifyJsxx.async.js from UglifyJs Unexpected token: keyword (const)0.570d21b1.async.js from UglifyJs
Unexpected token: punc ()) [0.570d21b1.async.js:13245,19]xx.async.js from UglifyJs Unexpected token: operator (>)

为啥会有这个问题?

通常 webpack 在构建时,是不会让 node_modules 下的文件走 babel tranpile 的,一是会慢很多,二是 babel@6 时编译编译过的代码会不安全(据说 babel@7 下没问题了),所以业界有个潜在的约定,npm 包发布前需要先用 babel 转出一份 es5 的代码。

但是有些 npm 包不遵守这个约定,没有转成 es5 就发上去,比如 query-string@6。然后压缩工具 uglify 又只支持 es5 的语法,遇到 constlet()=> 类似的语法,就抛错了。

解决

有多个解决方法,但各有利弊。

使用 uglify-es 进行压缩

uglify-es 支持 es6 语法,所以不会报错。但问题是如果你需要在 IE11 及以下,或者其他的低版本浏览器里跑时,就会报错、白屏了。

让 babel 编译 node_modules 下的文件

由于 babel@7 可以保证编译编译过的代码不会出问题,这不失为一个好的解决方案,比如 create-react-app 会在下个版本考虑用这个方案,参考 facebook/create-react-app#3776。问题是会让本来就比较慢的 dev、build 流程雪上加霜。

babel-engine-plugin

跟进 npm 包的 engine 配置做按需编译。缺点是使用者比较少,如果 npm 包开发者不遵循这个规则一样会出问题。

umi/roadhog 提供的 extraBabelIncludes 配置

umi/roadhog 默认也是仅用 babel 编译项目文件,但提供了额外的 extraBabelInclude 配置可以指定 node_modules 下的文件。比如:

{"extraBabelIncludes:" ["node_modules/a","node_modules/b"]
}

问题是无法提前预知,都是出错了一脸那啥,翻 issue 或者提问后才知道。而且找到哪个依赖用了 es6 语法也比较麻烦。

所以,有没有一种能提前预知(用户无感知),并且不降低 webpack 构建速度的方案?

es5-imcompatible-versions

经过讨论,我们建了一个 es5-imcompatible-versions,用于收集 uglify 压缩有问题的 npm 包版本。然后再提供配套工具,自动 resolve 到项目里有问题的 npm 包路径,添加到 babel-loader 的 include 参数里。

然后,

  • 遇到已被收录的 es6 包,会自动走 babel 编译
  • 遇到未被收录的,在 es5-imcompatible-versions 提 PR,被合并发布后,重装 npm 依赖再构建,自动生效

umi

确保 umi 在 1.2.4 或以上,然后在 .webpackrc 里配:

export default {es5ImcompatibleVersions: true,
}

roadhog

确保 roadhog 在 2.4.0-beta.3 或以上,然后在 .webpackrc 里配:

export default {es5ImcompatibleVersions: true,
}

参考这个使用了 query-string@6 和 get-value@3 的例子,https://github.com/umijs/umi-examples/tree/master/es5-imcompatible-versions

原文链接:https://github.com/sorrycc/blog/issues/68?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

uglify 压缩报错问题及 es5-imcompatible-versions相关推荐

  1. @hapi/joi 报错 “message“: “Cannot mix different versions of joi schemas“

    问题: 使用 @hapi/joi 报错 "message": "Cannot mix different versions of joi schemas" np ...

  2. zip压缩报错解决:zip warning: name not matched: xxx/xxx/xxx

    这个报错的原因是要压缩的文件是个符号链接文件,但指向的文件不存在, 解决方法是加上-y参数,意思是store symbolic links as the link instead of the ref ...

  3. 【报错】Cannot mix different versions of joi schemas(Postman)

    错误显示(Postman): "Cannot mix different versions of joi schemas",即"无法混合不同版本的 joi 模式" ...

  4. linux zip压缩报错,Linux之zip压缩

    clientX.pageX.scrollLeft.offsetLeft.clientWidth.screen.width的用法和区别 一.定义和用法 1.event.clientX:事件对象的水平偏移 ...

  5. Jenkins启动报错:Jenkins requires Java versions [8, 11] but you are running with Java 13 from xx/xx/xx

    今天brew install jenkins安装好之后,查看在哪里:mdfind -name jenkins.war 后启动Jenkins.java -jar /usr/local/Cellar/je ...

  6. 运行RN项目报错:Android SDK提示Versions found: N/A

    起RN新项目,跟着官方教程运行npx react-native run-android发现跑不起来.使用的是Android 11版本,SDK支持版本31.0.0.怎么跑都跑不起来. 使用npx rea ...

  7. uglifyjs报错 webpack_UglifyJs打包压缩问题引起的思考

    问题背景 最近做了一个webapp项目,qa用手机测试功能时,在iphone6plus上表现是白屏,其他手机目测是ok的:因为之前在测试其他项目时也发现在这个iphone6上表现与其他手机不太一样.于 ...

  8. webpack打包报错

    webpack使用过程中压缩报错, 使用webpack .\example.js -o app.js命令报错. 报错信息:ERROR in main Module not found: Error: ...

  9. angularjs grunt uglify 报错

    1.用grunt-contrib-concat(混合)和grunt-contrib-uglify(压缩)混合压缩文件时,要将文件排序,module的声明和使用不在同一个文件的时候,module的生命要 ...

最新文章

  1. GitHub 5W 星:一行命令下载全网视频的两个开源项目
  2. 厦门银行服务器没有收到证书,FRM证书申请成功后,一直未收到证书该如何做?...
  3. c#重载和重写及运用
  4. 解决离线安装依赖包的方法
  5. java.sql找不到_java.sql.SQLException:找不到适用于jdbc:microsoft:
  6. python爬虫︱百度百科的requests请求、百度URL格式、网页保存、爬虫模块
  7. java 获取当前年_java中的反射(三) - kelexin
  8. Kafka 如何保证消息全局有序
  9. python源码中的学习笔记_第11章_模块与包
  10. Centos 设置时区和时间以及增加中文输入法
  11. chrome证书错误问题
  12. NRF51822---开发板介绍(连载1)
  13. 一种基于Android、iOS系统的移动端车牌识别方法,实现手机拍照识别车牌
  14. AR联机游戏制作过程记录(11.11)
  15. 我的第一个嵌入式linux驱动3_完善2
  16. 2016年,对我影响最大的三本书
  17. 最新裂变营销推广系统+邀约链接/注册/卡密系统
  18. Windows电脑上也可以畅玩PS游戏!索尼宣布PS Now登陆PC平台
  19. 刘芳计算机学院,刘芳,女,1983年生,天津工业大学计算机与软件学院讲师.PDF
  20. Android中Button点击事件

热门文章

  1. Skia的初探(Skia的GN脚本编译与第一个Skia应用)
  2. 设计模式 : 解释器模式
  3. 闹元宵,迎开学!内官社区元宵节亲子活动甜甜出炉!
  4. Flair实战文本分类
  5. 网络安全渗透测试的八个步骤(二)
  6. DIOR HOMME_百度百科
  7. 异想家Win10系统安装的软件与配置
  8. 大连东软信息学院计算机专业19分数线,大连东软信息学院历年分数线 2021大连东软信息学院录取分数线...
  9. 华为交换机配置链路聚合
  10. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)......