Ich verwende Webpack, um mein JavaScript zu bündeln. Ich bin abhängig von Modulen wie popsicle , die Any-Promise verwenden.
Hier ist mein Code:
var popsicle = require('popsicle');
popsicle.get('/').then(function() {
console.log('loaded URL');
});
Dies funktioniert gut in Browsern, in denen Promise
verfügbar ist, aber IE 11 nicht Promise bietet. Ich möchte also es6-promise als Polyfill verwenden.
Ich habe versucht, eine explizite ProvidePlugin
zu meinem webpack.config.js
hinzuzufügen:
plugins: [
new webpack.ProvidePlugin({
'Promise': 'exports?global.Promise!es6-promise'
})
]
Ich bekomme aber immer noch den Fehler in IE 11: any-promise browser requires a polyfill or explicit registration e.g: require('any-promise/register/bluebird')
.
Ich habe explizit versucht, ein globales anzufügen:
global.Promise = global.Promise || require('es6-promise');
IE 11 gibt jedoch einen anderen Fehler aus: Object doesn't support this action
.
Ich habe auch versucht, es6-promise explizit zu registrieren:
require('any-promise/register/es6-promise');
var popsicle = require('popsicle');
Das funktioniert, aber ich muss es in jeder einzelnen Datei tun, die popsicle
lädt. Ich möchte nur Promise
an window
anhängen.
Wie kann ich sicherstellen, dass window.Promise
immer mithilfe von Webpack definiert wird?
Für Benutzer, die Babel in Kombination mit Webpack verwenden: Sie können Babel-Polyfill verwenden.
Machen Sie einfach npm install --save "babel-polyfill"
und fügen Sie ihn als Einstiegspunkt in Ihre webpack.config.js ein:
module.exports = {
entry: ['babel-polyfill', './app/js']
};
Anstatt den gesamten Babel-Polyfill zu verwenden, können Sie core-js
installieren und nur auf das Modul verweisen, das Sie benötigen.
module.exports = {
entry: ['core-js/fn/promise', './app/js']
};
Option, die für mich funktioniert hat. es6-Versprechen-Versprechen soll direkt in die Webpack-Builds aufgenommen werden. So:
plugins: [
new webpack.ProvidePlugin({
Promise: 'es6-promise-promise'
})
]
Eine aktualisierte und präzise Version von @ asiniys Antwort mit der kürzlich hinzugefügten property
-Funktion von ProvidePlugin , ohne auf es6-promise-promise
verweisen zu müssen:
new webpack.ProvidePlugin({
Promise: ['es6-promise', 'Promise']
})
Damit dies funktioniert, vergessen Sie nicht, es6-promise
als Abhängigkeit des Projekts hinzuzufügen, in das Sie Promise
polyfillen möchten.
babel polyfill funktioniert normalerweise, aber diesmal für ein vuejs (webpack1) -Projekt, das irgendwie nicht funktioniert.
Glücklicherweise wirkt core-js als Charme.
npm install core-js --save
module.exports = {
entry: ['core-js/fn/promise', './app/js']
};
Verwenden Sie besser Bluebird
plugins: [
new webpack.ProvidePlugin({
Promise: 'bluebird'
}),
new webpack.NormalModuleReplacementPlugin(/es6-promise$/, 'bluebird'),
]
Mit Webpack 2 habe ich es so zum Laufen gebracht.
Zuerst mit npm install babel-polyfill
installieren. Ab NPM 5 kann --save
weggelassen werden.
Dann ändern Sie die Webpack-Konfiguration mit:
entry: {
app: ['babel-polyfill', './src/main.js']
}
Natürlich unterscheidet sich ./src/main.js
für jede App.
Sie haben es fast geschafft - versuchen Sie es in Ihrem webpack.config.js
:
plugins: [
new webpack.ProvidePlugin({
Promise: 'imports?this=>global!exports?global.Promise!es6-promise'
})
]
Beachten Sie, dass Sie imports-loader
und exports-loader
installieren müssen:
npm install --save imports-loader exports-loader
Für diejenigen, die CRA (Create-React-App) verwenden, können Sie die von ihnen bereitgestellte Polyfill verwenden:
npm install react-app-polyfill
oder yarn add react-app-polyfill
index.js
-Datei: import 'react-app-polyfill/ie11';