J'utilise webpack pour regrouper mon code JavaScript. Je suis dépendant de modules tels que popsicle qui utilise any-promise .
Voici mon code:
var popsicle = require('popsicle');
popsicle.get('/').then(function() {
console.log('loaded URL');
});
Cela fonctionne bien dans les navigateurs où Promise
est disponible, mais IE 11 ne fournit pas Promise . Donc, je veux utiliser es6-promise comme polyfill.
J'ai essayé d'ajouter une ProvidePlugin
explicite à mon webpack.config.js
:
plugins: [
new webpack.ProvidePlugin({
'Promise': 'exports?global.Promise!es6-promise'
})
]
Mais je reçois toujours l’erreur dans IE 11: any-promise browser requires a polyfill or explicit registration e.g: require('any-promise/register/bluebird')
.
J'ai essayé de joindre explicitement un global:
global.Promise = global.Promise || require('es6-promise');
Mais IE 11 donne une erreur différente: Object doesn't support this action
.
J'ai aussi essayé explicitement d'enregistrer es6-promise:
require('any-promise/register/es6-promise');
var popsicle = require('popsicle');
Cela fonctionne, mais je dois le faire dans chaque fichier qui charge popsicle
. Je veux simplement attacher Promise
à window
.
Comment puis-je m'assurer que window.Promise
est toujours défini à l'aide de webpack?
Pour les personnes utilisant babel en combinaison avec webpack: vous pouvez utiliser babel-polyfill
Il suffit de faire npm install --save "babel-polyfill"
puis de l’ajouter comme point d’entrée dans votre webpack.config.js:
module.exports = {
entry: ['babel-polyfill', './app/js']
};
Ou, au lieu d'utiliser l'intégralité de babel-polyfill, vous pouvez installer core-js
et ne faire référence qu'au module dont vous avez besoin.
module.exports = {
entry: ['core-js/fn/promise', './app/js']
};
Option qui a fonctionné pour moi. es6-promise-promise est conçu pour être inclus directement dans les versions de webpack. Alors:
plugins: [
new webpack.ProvidePlugin({
Promise: 'es6-promise-promise'
})
]
Une version mise à jour et concise de la réponse de @ asiniy à l'aide de la fonction property
récemment ajoutée de ProvidePlugin , sans qu'il soit nécessaire de faire référence à es6-promise-promise
:
new webpack.ProvidePlugin({
Promise: ['es6-promise', 'Promise']
})
Pour que cela fonctionne, n'oubliez pas d’ajouter es6-promise
en tant que dépendance du projet que vous souhaitez polyfiller Promise
dans.
babel polyfill fonctionne généralement, mais cette fois pour un projet vuejs (webpack1), ne fonctionnant pas.
Heureusement, core-js fonctionne comme un charme.
npm install core-js --save
module.exports = {
entry: ['core-js/fn/promise', './app/js']
};
Mieux utiliser Bluebird
plugins: [
new webpack.ProvidePlugin({
Promise: 'bluebird'
}),
new webpack.NormalModuleReplacementPlugin(/es6-promise$/, 'bluebird'),
]
Avec Webpack 2, voici comment je le fais fonctionner.
Commencez par installer avec npm install babel-polyfill
. À partir de NPM 5, --save
peut être omis.
Puis modifiez la configuration du webpack avec:
entry: {
app: ['babel-polyfill', './src/main.js']
}
Bien sûr, ./src/main.js
est différent pour chaque application.
Vous avez presque compris - essayez ceci dans votre webpack.config.js
:
plugins: [
new webpack.ProvidePlugin({
Promise: 'imports?this=>global!exports?global.Promise!es6-promise'
})
]
Notez que vous devrez installer imports-loader
et exports-loader
:
npm install --save imports-loader exports-loader
Pour ceux qui utilisent CRA (create-react-app), vous pouvez utiliser le polyfill fourni par ceux-ci:
npm install react-app-polyfill
ou yarn add react-app-polyfill
index.js
: import 'react-app-polyfill/ie11';