webpack+babel+transform-runtime, IE下提示Promise未定义?
知识要求
babel
的基础知识(推荐阮一峰的babel入门教程)- 充分理解
babel-plugin-transform-runtime
与babel-runtime
的作用(推荐github项目首页) webpack2
基础用法(https://webpack.js.org/)webpack2
中babel-loader
作用,import
异步加载
问题说明
webpack
+babel-loader
+transform-runtime
正常来讲应该能实现在没有原生支持Promise
的浏览器(如IE
)下正常运行,但是实际在IE11
下,还是提示Promise
未定义的错误。网上找了一圈,没有切中要害的,于是干脆自己分析。
分析
首先确认babel
的transform-runtime
是否生效,在自己的js
代码中编写var promise = new Promise(resolve, reject)
的示例代码,发现Promise
是有被替换的。所以问题的关键在于什么东西超出了babel
的控制?
我想到的是node_modules
与webpack
本身生成的代码。
在使用babel
转换ES6
之前, 通过node_modules
引用的第三方包都能正常使用,因此可以排除。
那么webpack
呢,在GOOGLE
中搜索webpack promise not defined
,还真找到了原因,如下图所示:
图片来源: https://webpack.js.org/guides/migrating/#require-ensure-and-amd-require-are-asynchronous
当使用了webpack
的异步加载时,webpack
要求原生支持Promise
,刚好我们的代码有用到。至此,原因就找到了:
webpack
生成的new Promise
相关代码, 超出babel
的transform-runtime
的控制范围,只有导出全局的Promise
才能解决此问题。
解决方案1
- 引入
babel-polyfill
导出全局Promise
,这种方法并不好;不仅Promise
被导出,还抛出大量其他的全局对象,可能存在冲突风险,同时文件体积比较大。
解决方案2
在js
文件开头添加window.Promise = Promise
这一句即可,示例代码:
import 'jquery'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap'
// 将Promise抛出为全局对象
window.Promise = Promise
。。。
原理:当babel
检查到js
的Promise
时,transform-runtime
会将Promise
做转换,然后将其抛出为全局对象即可达到跟babel-polyfill
一样的效果。
参考资料
webpack+babel+transform-runtime, IE下提示Promise未定义?的更多相关文章
- webpack+babel项目在IE下报Promise未定义错误引出的思考
低版本浏览器引起的问题 最近开发一个基于webpack+babel+react的项目,一般本地是在chrome浏览上面开发,chrome浏览器开发因为支持大部分新的js特性,所以一般不怎么需要poly ...
- 解决axios在ie浏览器下提示promise未定义的问题
参考链接: https://blog.csdn.net/bhq1711617151/article/details/80266436 在做项目的时候发现在ie11上出现不兼容的问题,对于和后台交互这块 ...
- IE浏览器报Promise未定义
用vue-cli做的项目,用了promise,结果IE下报promise未定义,甚至在比较老的andriod手机浏览器上会显示空白页面,解决方案如下: 首先安装:babel-polyfill npm ...
- IE10-IE11在NET4.0下出现“__doPostBack未定义”解决方案
IE10在NET4.0下出现"__doPostBack未定义"的办法 参考文章: http://blogs.msdn.com/b/scott_hanselman/archive/2 ...
- vue-cli项目在IE下运行钩子函数抛出异常“ReferenceError: “Promise”未定义"”的解决办法
兼容IE是个坑,低版本IE很多都没法跑起来 问题现象:vue-cli项目在IE下运行,会在钩子函数出现 ReferenceError: “Promise”未定义 解决办法: step1:安装最新的we ...
- ie浏览器 vuejs axios Promise 未定义
随着前端技术的发现,es6语法在被更大范围的使用,而很多的浏览器并不支持ES6,比如IE…… 这里我们介绍几个解决方法. 一.使浏览器兼容ES6基本语法 1.在引入其他脚本前先引入browser.mi ...
- ie下警告console未定义
低版本IE6/7/8/9浏览器没有定义console对象,所以代码会中断执行.自己测试,ie11也没有(打开控制台的情况下可以用) 可以用如下代码完美解决. window.console = wind ...
- IE8提示console未定义
在开发的过程中由于调试的原因,在代码中加入console.info("xxxx"),而未进行删除 在IE8下测试该代码所在的页面报错,如下: 需要注意的是,使用console对象查 ...
- IE显示 “Promise”未定义,vue项目兼容ie的两种方案
第一种方法: 直接在html中加入js链接: <script src = "https://cdn.polyfill.io/v2/polyfill.min.js">&l ...
随机推荐
- 深入理解ES6之—set与map
Set是无重复值的有序列表.Set会自动移除重复的值,因此你可以使用它来过滤数组中重复的值并返回结果. Map是有序的键值对,其中的键允许是任何类型. Set和Map是es6新增的两个数据集合. Se ...
- mysql 运维常见操作
初始安装并赋予密码: [root@Alinx html]# yum install -y mysql mysql-server #安装mysql可与 ...
- 最大流——Dinic算法
前面花了很长时间弄明白了压入-重标记的各种方法,结果号称是O(V3)的算法测demo的时候居然TLE了一个点,看了题解发现所有人都是用Dinic算法写的,但它的复杂度O(V2E)明显高于前者,具体是怎 ...
- tornado+WSGI+Apache
1.原理 2.安装mod_wsgi http://pan.baidu.com/s/1sjsccWH configure的时候会找对应的python脚本,默认是/usr/bin/python 生成mod ...
- Python之多进程篇
Process 创建子进程执行指定的函数 >>> from multiprocessing import Process,current_process >>> & ...
- POJ1082食物链
加权并查集入门习题. 传送门http://poj.org/problem?id=1182 下面来记录一下做法: 并查集的作用是询问两个对象时候在同一集合以及将两个非空不相交集合合并. 本题涉及两点之间 ...
- 在VirtualBox 虚拟机中安装CentOS7 64位实验基础系统
1.将CentOS-7-x86_64-Minimal ISO加载入虚拟机,选择安装CentOS 7 2.启动欢迎画面,保持默认,选择 继续 3.安装参数设置 3-1.设置时区以便同步时间,将时区更改为 ...
- axios跨域
参考:http://www.ruanyifeng.com/blog/2016/04/cors.html 遇到前后分离情况 前端 a.com 后端 server.a.com 环境 vue全家桶前端 ph ...
- 利用docker搭建spark hadoop workbench
目的 用docker实现所有服务 在spark-notebook中编写Scala代码,实时提交到spark集群中运行 在HDFS中存储数据文件,spark-notebook中直接读取 组件 Spark ...
- 今天用node的cheerio模块做了个某乎的爬虫
一时兴起,想做个爬虫,经过各种深思熟虑,最后选择了某乎,毕竟现在某乎的数据质量还是挺高的.说干就干 打开某乎首页,随便搜索了一串关键字,相关的问题和答案就展现在眼前,我就思考怎么把这些搜索结果 ...