Firefox 17 for Mac下NS_ERROR_XPC_BAD_OP_ON_WN_PROTO异常求助
我之前维护老项目时碰到过完全一样的问题,折腾了好一阵才搞定,分享几个亲测有效的解决思路:
补全必要的Polyfill
Firefox17是非常老旧的版本,对ES6+特性支持极差,而Angular4默认依赖很多这类特性。打开项目的polyfill.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/set';另外别忘了加上Firefox专属的Zone.js补丁:
import 'zone.js/dist/zone-patch-firefox';调整编译目标为ES5
Angular4当时使用的是.angular-cli.json配置文件,默认可能会编译成ES6代码,而Firefox17对ES6的支持几乎为零。找到配置文件里的build选项,把target设置为es5:"build": { "options": { "target": "es5", // 其他配置... } }修改后重新执行
ng build,生成的代码就能兼容老Firefox了。排查第三方依赖的原型污染问题
这个错误的核心原因是代码尝试修改了原生对象的原型,而老Firefox对这类操作有严格限制。vendor.bundle.js里的代码都是第三方依赖打包来的,你可以尝试逐个移除项目中的第三方库,每次移除后重新打包测试,找到触发错误的那个库。之后要么替换成更兼容的替代库,要么找该库支持老Firefox的历史版本。我当时碰到的是某个老版本的图表库在修改Array.prototype,换成兼容ES5的版本就好了。临时禁用Firefox的原型防护(不推荐生产环境)
如果上面的方法都不行,作为临时测试方案,可以在Firefox的about:config页面中,找到javascript.options.wrap_native_objects选项,把它设置为false。但这个操作会降低浏览器的安全性,只建议在本地测试时用,绝对不要在生产环境让用户这么做。
内容的提问来源于stack exchange,提问作者Arun Kumar

