[preset-env] all the core-js imports are removed
See original GitHub issueBug Report
Current behavior
No core-js polyfills in the final bundle.
Since https://github.com/babel/babel/pull/10862 the core-js polyfill paths always have .js
extension.
In shouldReplace
function https://github.com/babel/babel/blob/41085248560b1403b8d0f99f108491e679531c6c/packages/babel-preset-env/src/polyfills/corejs3/entry-plugin.js#L52-L64
the module path is compared with the source. In my application the comparison happens between core-js/modules/es.symbol
and core-js/modules/es.symbol.js
causing the function to return different value than expected.
- Repo to reproduce the problem: https://github.com/ertrzyiks/babel-loader-lost-polyfills-demo
Input Code
import 'core-js'
console.log([1, [2]].flat())
Expected behavior Importing core-js includes polyfill to the final bundle
Babel Configuration (babel.config.js, .babelrc, package.json#babel, cli command, .eslintrc)
- Filename:
babel.config.js
module.exports = {
mode: 'production',
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: false,
presets: [
['@babel/preset-env', { corejs: 3, useBuiltIns: 'entry' }],
'react-app'
]
}
}
}
]
}
};
Environment
npx envinfo --preset babel
npx: installed 1 in 1.147s
System:
OS: macOS 10.15.4
Binaries:
Node: 12.16.1 - ~/.nvm/versions/node/v12.16.1/bin/node
Yarn: 1.22.4 - ~/.nvm/versions/node/v12.16.1/bin/yarn
npm: 5.1.0 - ~/workspace/app/node_modules/.bin/npm
npmPackages:
@babel/core: ^7.0.0 => 7.12.10
@babel/preset-env: ^7.12.11 => 7.12.11
babel-loader: 8.2.2 => 8.2.2
babel-preset-react-app: ^10.0.0 => 10.0.0
webpack: ^4.44.2 => 4.44.2
- How you are using Babel: webpack
Possible Solution Make the comparison ignore module path extension. My application compiles correctly if I alter the condition to exclude the extension. (note hardcoded string slice)
function shouldReplace(source, modules) {
if (!modules) return false;
if (modules.length === 1 && polyfills.has(modules[0]) && available.has(modules[0]) && (0, _utils.getModulePath)(modules[0]).slice(0, -3) === source) {
return false;
}
return true;
}
Issue Analytics
- State:
- Created 3 years ago
- Reactions:1
- Comments:12 (4 by maintainers)
Top GitHub Comments
We could use this to handle both the cases:
I’m marking this as a good first issue since it shouldn’t be too hard to fix it, but it gives the opportunity to setup the repo and learn how our tests work, and fixing it has a good impact since currently the whole
useBuiltIns: "entry"
feature is probably broken.If it is the first time that you contribute to Babel, follow these steps: (you need to have
make
andyarn
available on your machine)git clone https://github.com/<YOUR_USERNAME>/babel.git && cd babel
make bootstrap
to install deps and setup the monorepomake watch
(ormake build
whenever you change a file)input.js
/input.mjs
;output.js
will be automatically generated)yarn jest preset-env
to run the testsoutput.js
files and run the tests againOVERWRITE=true yarn jest preset-env
and they will be automatically updated.make test
to run all the testsgit push
and open a PR!Thanks @nicolo-ribaudo , I can work on a PR tomorrow morning