Pourquoi est-Objet.assign() nécessitent un polyfill lors de babel-chargeur est utilisé?
Je suis d'essayer d'utiliser Object.assign()
dans l'ES6 web app compilé par Babel avec webpack, mais j'obtiens une erreur:
Uncaught TypeError: Object.assign is not a function
Je suis déjà en utilisant babel-chargeur
à transpile ES6 à l'ES5, de sorte que tous mes autres ES6 code de travail. Pourtant, Object.assign()
ne fonctionne qu'après j'ai aussi import "babel-core/polyfill"
dans ma base de code. Je vois que je peux aussi corriger ce par l'importation de babel-runtime, mais je voudrais comprendre pourquoi Object.assign()
exige plus que ce babel-loader
effectue, — ne pas babel-loader
prétraitement de tout, y compris Object.assign()
?
- Juste une note pour les futurs lecteurs: le polyfill, appelée "babel-core/polyfill" au moment où cette question a été écrit, c'est maintenant "babel-polyfill", par la doc.
- Qui est maintenant juste
@babel/polyfill
en v7.
Vous devez vous connecter pour publier un commentaire.
Babel, via
babel-loader
, transpiles différences dans l'ES6 syntaxe. Babel sur sa propre n'a absolument rien à ajouter, dans l'ES6 bibliothèque standard de fonctionnalités (commeObject.assign
). Chargement de la polyfill des charges distinct polyfillbase-js
pour vous, mais vous pouvez charger n'importe polyfill vous le souhaitez.Même certains de la syntaxe des conversions dépendent de certains polyfill de la fonctionnalité des charges, puisque certains de la syntaxe s'appuie sur des algorithmes et des comportements mis en œuvre dans le code de bibliothèque. L'ES6 fonctionnalités sur http://babeljs.io/docs/learn-es2015/ chaque liste de ce que la bibliothèque standard les fonctionnalités sont supposés avoir été chargé.
Object.assign()
est une nouvelle API qui fait partie de l'ES6 spec, il n'est donc pas mis en œuvre dans la plupart des navigateurs encore. Voir: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assignAinsi, lorsque vous importez
babel-core/polyfill
, il ajoute polyfills pour cela, et d'autres nouvelles Api, de sorte que votre ES6 code peut les utiliser.babel-loader
est juste le transpiler qui convertit ES6 syntaxe à l'ES5 du code compatible.Si vous allez vers le bas de Compatibilité, vous pouvez voir IE 11 n'est pas pris en charge à la fois Web et Mobile pour l'objet.attribuer. Il vous donne également la pollyfill pour que.
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Si l'utilisation de Babel
https://babeljs.io/docs/plugins/transform-object-assign/
Si l'aide de MNP
https://www.npmjs.com/package/object-assign
J'ai connu le même problème. J'ai pensé que je suis sûr à utiliser tous les ES2015+ featues quand elle est soutenue par babel. Mais comme il a été mentionné ci-dessus, babel polyfills seulement la syntaxe, pas de fonctions (de l'Objet.céder, Tableau.comprend pour n'en nommer que quelques-uns).
Pour L'Objet.assigner je préfère ne pas utiliser de polyfill, mais l'utilisation de la propagation de l'opérateur. Dans ce cas babel fait polyfills Objet.attribuer si elle ne trouve pas. Regardez ce code:
Il sera tranpiled par babel à:
Pour la propagation de l'opérateur babel tente d'utiliser l'Objet natif.méthode d'assignation et à l'utilisation polyfill si elle n'a pas été trouvé.
Mais l'Objet explicite.attribuer la méthode reste inchangée \_(ツ)_/