-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
IE8 下访问webpack.UglifyJsPlugin 压缩的代码出错 #6
Comments
赞 |
这是天坑,我在开发模式下没有压缩代码。IE8正常,发布时压缩代码不正常。 |
或者使用 |
[email protected] 未解决此问题 |
再补充个,因为 uglify2 [email protected] 不支持IE8 ,需要使用 [email protected] |
在 webpack1 里面还有这个问题 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
环境
问题分析
使用IE8 加载webpack 打包压缩后的代码时,会出现类似
'undefined' 为空或不是对象
的错误。在进行简单的调试后,造成错误的原因是变量指向被改变了,表象是:压缩后的变量
le
原本是指向jQuery
对象的,但在运行时却找不到jQuery
对象下的属性或方法导致出错。由于压缩后的代码比较难理清,所以,也找不到到底是哪段代码造成了变量覆盖问题。
对UglifyJS 进行了一下研究,大概确定是
mangle
阶段出了问题,貌似是做变量名混淆的。而在相关的选项中,有一个选项比较相关:--screw-ie8
。查找了一下该选项的意义,看到有以下一段提交记录:
其中
--screw-ie
后来改名为--screw-ie8
,大致上是对IE8 下带名字的函数表达式(Named Function Expression, NFE)做了一下hack。IE8 的JS 引擎对NFE 有以下bug:JScript NFE bugs。简单理解就是,IE8 下NFE 会在作用域内声明并初始化一个变量,该变量名为函数表达式的名,值为该函数表达式。而这种行为在标准的Javascript 语法中是不存在的。
当UglifyJS 在
mangle
阶段,若发现--screw-ie8
参数为false
,则尝试绕开这些bug,使函数表达式的名字不会与作用域中其他变量名冲突。而在UglifyJS
~v2.7.0
后,参数--screw-ie8
就默认为true
了,即,如果不显式声明参数为false
,则mangle
的结果很可能造成NFE
变量覆盖了作用域内的同名变量。提交历史:Enable --screw-ie8 by default 。解决方案
理论上,只要我们在调用UglifyJS 时,显式设置
--screw-ie8
为false
即可避开压缩后的代码在IE8 下报错。如果使用UglifyJS API 调用的话,选项参数至少如下:基于webpack.optimize.UglifyJsPlugin 的解决方案
当开发者是结合webpack、webpack.optimize.UglifyJsPlugin 来做打包和压缩的话,情况就稍微复杂了。
在
[email protected]
之前,{ mangle: { screw_ie8: false } }
都没有被正确传给UglifyJS,代码如下:上面代码没有将
screw_ie8
参数传到ast.figure_out_scope();
导致IE8 报错的问题没法绕开,除非屏蔽整个mangle
,但这样源码泄漏的风险就很高了。前几天作者终于将该bug 提交到
[email protected]
了:Pass mangle options to ast.figure_out_scope in uglify。但新版还没发布,所以,暂时先将webpack 依赖版本指向该hash:参考链接:
The text was updated successfully, but these errors were encountered: