babel
的基礎知識(推薦阮一峰的babel入門教學)
充分理解babel-plugin-transform-runtime
與babel-runtime
的作用(推薦github專案首頁)
webpack2
基礎用法
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
,還真找到了原因,如下圖所示:
#當使用了webpack
的非同步載入時,webpack
要求原生支援Promise
,剛好我們的程式碼有用。至此,原因就找到了:
webpack
產生的new Promise
相關程式碼, 超出babel
的transform-runtime
的控制範圍,只有匯出全域的Promise
才能解決此問題。
引入babel-polyfill
匯出全域Promise
,這種方法並不好;不只Promise
被匯出,也拋出大量其他的全域對象,可能有衝突風險,同時檔案體積比較大。
在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未定義的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!