Converting all of our modern JavaScript into ES5 compatible syntax is a great way to use modern features while targeting older browsers. What happens when the browsers natively support these language features? Then it no longer makes sense to transform that code or to include polyfills that will go unused. In this lesson, we’ll add the @babel/polyfill
package and configure babel-preset-env
css
To reduce the polyfill size, we can targeting morden browser by using browserlist:html
webpack.config.base.jsnode
const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { entry: './src/index.js', output: { path: path.join(__dirname, 'dist'), filename: 'app.bundle.js' }, module: { rules: [ { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/, options: { presets: [['@babel/preset-env', { targets: [ 'last 2 versions', 'not dead', 'not < 2%' ], useBuiltIns: 'entry' }], '@babel/preset-react'], plugins: [ 'react-hot-loader/babel', '@babel/plugin-proposal-class-properties' ] } }, { test: /\.css$/, use: ['style-loader', 'css-loader'], exclude: /node_modules/ } ] }, plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })] }
You can see the supported browserlist by running:react
npx browserlist "last 2 versions, not dead, not < 2%"
It will return a llst of supported browsers.webpack
Together with bundler-analyser we can see the bundle size:web
webpack.config.prod.jsbabel
const merge = require('webpack-merge') const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer') const baseConfig = require('./webpack.config.base') module.exports = merge(baseConfig, { mode: 'production', plugins: [new BundleAnalyzerPlugin({ analyzerMode: 'static', openAnalyzer: false, reportFilename: 'bundle_sizes.html' })], externals: { react: 'React', 'react-dom': 'ReactDOM' } })