Angular 5应用在Firefox v48.0.1及更低版本无法运行求助
我来帮你解决这个Angular在旧浏览器里的兼容问题!你遇到的TypeError: this is undefined本质是UglifyJS插件版本冲突,加上旧浏览器缺少必要的Polyfill导致的,下面是一步步的解决方案:
第一步:强制统一uglifyjs-webpack-plugin版本
你之前直接安装1.1.5没用,是因为@angular/cli和webpack自身依赖了不同版本的插件,npm会优先满足这些上层依赖的版本要求,导致你的指定版本没生效。我们可以用resolutions字段强制所有嵌套依赖都用1.1.5版本:
- 打开你的
package.json,添加以下配置:
"resolutions": { "uglifyjs-webpack-plugin": "1.1.5" }, "scripts": { "preinstall": "npx npm-force-resolutions" }
resolutions字段用来指定所有子依赖的强制版本preinstall脚本会在npm install前自动运行npm-force-resolutions,确保resolutions生效(npm本身不原生支持resolutions,需要这个工具)
- 清理现有依赖并重新安装:
rm -rf node_modules package-lock.json npm install
- 验证:打开
package-lock.json,搜索所有uglifyjs-webpack-plugin条目,确认版本都是1.1.5
第二步:补全旧浏览器所需的Polyfill
IE10和Firefox 48这类旧浏览器缺少很多ES6+的API,Angular默认的Polyfill可能不够,你需要在src/polyfills.ts里添加以下内容:
// 基础ES6+ Polyfill import 'core-js/es6/symbol'; import 'core-js/es6/object'; import 'core-js/es6/function'; import 'core-js/es6/parse-int'; import 'core-js/es6/parse-float'; import 'core-js/es6/number'; import 'core-js/es6/math'; import 'core-js/es6/string'; import 'core-js/es6/date'; import 'core-js/es6/array'; import 'core-js/es6/regexp'; import 'core-js/es6/map'; import 'core-js/es6/weak-map'; import 'core-js/es6/set'; // ES7+特性支持 import 'core-js/es7/array'; // IE10+专属Polyfill import 'classlist.js'; // 支持classList API import 'web-animations-js'; // 如果你的应用用了Angular动画 // Zone.js(Angular必备) import 'zone.js/dist/zone';
第三步:确认TS编译目标为ES5
打开tsconfig.json,确保compilerOptions里的target设置为es5:
"compilerOptions": { "target": "es5", // 其他配置... }
第四步:重新构建并测试
执行构建命令:
ng build --prod
然后把构建产物部署到测试环境,在IE10和Firefox 48里验证是否正常运行。
这样应该就能解决你遇到的this is undefined错误了,本质是Uglify版本冲突导致的代码压缩问题,加上旧浏览器缺少必要的API支持。
内容的提问来源于stack exchange,提问作者Aakash Kumar
相关产品推荐
相关产品推荐

