2016-10-27 32 views
0

我想在我的反應應用程序中使用承諾獲取數據。我安裝並實現了這個polyfill es6-promise,但在IE8窗口8上工作,但是IE10窗口7說'promise is undefined'。我認爲polyfill是爲了覆蓋所有的IE9 +,但它不適合我。有沒有人遇到過這個問題?我在使用webpack實現es6-promise polyfill時錯過了什麼?如何獲得承諾,在IE10中作出反應

// calling it my jsx file 

    import React, { PropTypes } from 'react'; 
    import es6promise from 'es6-promise'; // not sure if I need this in the jsx file also?? 
    promise.polyfill(); 
    import 'isomorphic-fetch'; 
    class App extends React.Component { 
     ... 
    } 
    App.propTypes = propTypes; 

    export default App; 

webpack.config.js 
var promise = require('es6-promise').polyfill(); 
switch (TARGET) { 
    case 'build': 
     module.exports = mergeConfig({ 
      plugins: [ 
       // Reference: http://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin 
       // Minify all javascript. Loaders are switched into minimizing mode 
       new webpack.optimize.UglifyJsPlugin({ 
        compress: { 
         warnings: false 
        } 
       }), 
       new webpack.DefinePlugin({ 
        'process.env': { 
         // This has effect on the react lib size 
         'NODE_ENV': JSON.stringify('production') 
        } 
       }), 
       new webpack.ProvidePlugin({ 
        PROMISE: promise 
       }) 
      ] 
     }); 

     break; 
+0

如果您將'es6-promise'導入爲'es6promise',您不應該使用'es6promise.polyfill'嗎? –

+0

好吧,是否意味着如果我在webpack中需要它,我不應該將它導入到我的jsx中? 已經從jsx頁面中刪除導入我正在提取數據但出錯。我真的很想知道一個標準爲什麼使用webpack使用polyfill,所以它修復了IE10 – NiseNise

回答

1

你可以嘗試babel-polyfill。 將其安裝爲依賴項後。 導入它在你的app.js

import 'babel-polyfill'; 
0

我建議使用native-promise-polyfillnpm module,特別是如果你不需要的其他功能babel-polyfill includes

這意味着您可以使用新的內置插件一樣Promise或WeakMap,靜態方法如Array.from或Object.assign,實例方法如Array.prototype.includes和生成器函數

+0

與使用es6-polyfill相比,使用這個polyfill有什麼區別? – NiseNise

+0

es6-polyfill應該也可以正常工作,不同之處在於native-promise-polyfill的目標是儘可能接近Promise規範,與es6-polyfill相比,約爲7kb〜27kb。 – mogelbrod

1

我有另一個inte休息解決方案(在這種情況下它適用於我)。我不想將polyfill導入每個文件,所以我通過WebpackProvidePlugin提供。

new webpack.ProvidePlugin({ 

     "Promise": "babel-polyfill", 
     'fetch': 'imports-loader?this=>global!exports-loader? 
        global.fetch!whatwg-fetch' 
    }) 

所以,現在我可以使用這些東西,而無需導入到每個文件。而且非常重要的一點。一些資源建議使用es6-promise而不是babel-polyfill,我試過使用它,但它不適用於我。看起來像es6-promise-polyfill在使用webpack + babel的情況下不起作用。所以我切換到babel-polyfill。在IE11測試,一切都很好。

希望它有幫助。

最好注意。 Velidan。

+0

你可以在你的Webpack配置中將babel-polyfill作爲第一項入口,就像'entry:['babel-polyfill','./src/App.js']'一樣,招。不需要執行'webpack.ProvidePlugin'。 –

+0

是的,你是對的,但在這種情況下,我在IE11中遇到了一些有趣的問題: '對象作爲React子項無效(找到:帶鍵{$$ typeof,type,key,ref,props,_owner ,_store})。如果您打算渲染一組兒童,請改用數組,或者使用React附加組件中的createFragment(object)來包裝對象。檢查'RedBoxError'的渲染方法。 發生這種情況的原因是React-DOM和React之後應該加載polyfill,實際上我改變了順序,但它不能以某種方式工作,所以我使用了ProvidePlugin。 – Velidan