-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bug Report: babel-preset-env feature-detection error with dynamic import() statements. #7402
Comments
Hey @jgerigmeyer! We really appreciate you taking the time to report an issue. The collaborators If you need any help, or just have general Babel or JavaScript questions, we have a vibrant Slack |
So this is because it doesn't know that Yeah you can even just do |
Yeah, that makes sense. At the very least it seems like a note about this should be added to the documentation, probably of @babel/plugin-syntax-dynamic-import? |
Just for future reference, IE required me to include promise and array iterator polyfills to make dynamic imports work. This is what I did in my webpack config. const config = {
entry: [
'core-js/modules/es6.promise',
'core-js/modules/es6.array.iterator',
path.resolve(__dirname, "src/main.js"),
],
// ...
} |
@nathanjisaac want to push a PR to the website repo adding this helpful tip? |
I'm encountering this same issue with transform-runtime. |
Babel doesn't run on the webpack runtime code, so |
It's not a problem to include |
### `@babel/runtime` - Added `@babel/runtime-corejs3` package and `corejs: 3` options to `@babel/plugin-transform-runtime`. - Added support of instance methods, fixes #8928. - Added flag `proposals` (in `corejs: { version: 3, proposals: true }` format) for support all proposals polyfills from `core-js`. - Used separate directories in runtime for `core-js` entry points with proposals and without. - Used `get-iterator-method` helper for getting iterators, fixes #2500. - As a cheap bonus, added support of IE8- (except some cases of `regenerator`). ### `@babel/polyfill` - Should be deprecated in favor of separate usage required features from `core-js` and `regenerator-runtime` with an informative message. ### `@babel/preset-env` - Uses for built-ins data from [`core-js-compat`](https://github.com/zloirock/core-js/tree/master/packages/core-js-compat) instead of `compat-table` since information from `compat-table` [is not enough](https://github.com/zloirock/core-js/tree/master/packages/core-js-compat). - `useBuilIns` now requires direct setting of `corejs` version option, without it will be used `2` by default and shown deprecation warning. - Added support of minor `core-js` versions for simplify updating in the future. - For preventing some order-related problems, polyfills in the both `core-js@3` plugins added on `post` stage in the order of `core-js-compat` data. - Divided plugins and polyfills parts of `preset-env`, instead of 2 internal plugins for adding polyfills, we have 6: usage and entry versions of plugins for `core-js@2`, ### Current state: `core-js@3`, `regenerator-runtime`. - Added support `samsung` target (for Samsung Internet) since `core-js-compat` and `compat-table` now contains mapping for this, fixes #6602. #### `useBuilIns: entry` with `corejs: 3` - No longer transforms `@babel/polyfill`. - Transforms **all possible** `core-js` entry points to import of related modules (based on data from [`core-js-compat`](https://unpkg.com/core-js-compat@3.0.0-beta.15/entries.json)). - Since of this, we no longer need `shippedProposals` / `proposals` flags with `useBuilIns: entry`. - Removes `regenerator-runtime/runtime` import where it's not required. #### `useBuilIns: usage` with `corejs: 3` - In addition to `shippedProposals`, added flag `proposals` (in `corejs: { version: 3, proposals: true }` format) for polyfill all proposals from `core-js`. - Fixed list of dependencies in built-in definitions. - Improved the way of determination method / built-in name and source of this method. - Adds import of required polyfills on `MemberExpression`, `ObjectPattern`, `in` operator. - Adds import of required polyfills on access to global object properties. - Adds import of all required common iterators on all syntax features which use iterators protocol (`for-of`, destructuring, spread, `yield` delegation, etc.). - Adds import of promises on syntax features which use promises (async functions/generators, dynamic import, etc.), fixes #9250, #7402, etc. ### `core-js@2` stuff I didn't want to tough `core-js@2`-related stuff, however - Fixed some serious errors in definitions which breaks `Object.getOwnPropertySymbols`, `Symbol.toStringTag` logic, `Promise#finally`, `Array#forEach`, etc. - `Array#flatMap` and trim methods moved to stable features as a part of ES2019 and loaded by deprecated `@babel/polyfill` and `@babel/preset-env` with `corejs: 2` option.
Edit: I was wrong it appears that this solution does not work. For future reference I modified my preset-env include instead of modifying my webpack config as It allows me to collocate everything related to IE support: {
presets: [
[
'@babel/env',
{
"useBuiltIns": "usage",
"corejs": {version: 3},
"include": [
// We need to include ie11 polyfills used by webpack dynamic import
// because webpack generated code does not go through babel
'es.promise',
'es.array.iterator'
],
"targets": [
'ie >= 11',
//...
]
}
],
]
} |
@sarod with |
@zloirock If I use a dynamic-import in my code it looks like "usage" does not include the promise automatically which would make sense according to @nicolo-ribaudo comment above given that the Promise is only used in webpack runtime code. In any case I can make it work on IE11 by either:
But if I remove them both IE11 fails to load with "Unhandled promise rejection TypeError: Target is not iterable" raised from core-js/internal/iterate.js. |
After more tests it appears I was wrong: adding the "include" config in preset does not help. I probably had a caching issue somewhere. Sorry about that. However I still need to modify my webpack entry even if I use core-js@3 & "useBuiltIns: usage" to include 'core-js/modules/es.array.iterator' |
Bug Report:
When using babel-preset-env with
useBuiltIns: 'usage'
and webpack's dynamic imports (e.g.import('my-module').then(...)
) -- along with@babel/plugin-syntax-dynamic-import
-- feature-detection fails to includees6.promise
, which is required for the code to work on IE11.Input Code
Compiled input code:
Elsewhere in the Webpack runtime:
Babel/Babylon Configuration (.babelrc, package.json, cli command)
Expected Behavior
No errors in IE 11.
Current Behavior
IE11 error:
'Promise' is undefined
Possible Solution
Not sure the ideal fix -- is this a bug in babel-loader, or @babel/preset-env, or @babel/plugin-syntax-dynamic-import, or even webpack? In the meantime, a workaround is to add either of the following in the input JS file:
or
Your Environment
The text was updated successfully, but these errors were encountered: