How to Configure Electron with Webpack

Avatar

By squashlabs, Last Updated: Sept. 23, 2024

How to Configure Electron with Webpack

Overview of Configuring Electron with Bundling

Configuring Electron with Webpack combines the benefits of both technologies. Electron allows developers to build desktop applications using web technologies, while Webpack serves as a module bundler that optimizes the application for performance. The primary goal is to package JavaScript, CSS, images, and other assets into a single bundle that can be easily managed and served. This approach helps to streamline development, improve load times, and ensure that the application runs smoothly across all platforms.

Related Article: How to Set Up Webpack SCSS Loader

Setting Up Entry Points in Electron

Entry points define where Webpack starts when it bundles the application. For Electron, there are typically two main entry points: one for the main process and one for the renderer process.

Create a

webpack.config.js
webpack.config.js file in the root directory of your project. This file will define how Webpack processes your application.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// webpack.config.js
const path = require('path');
module.exports = {
entry: {
main: './src/main.js', // Main process
renderer: './src/renderer.js' // Renderer process
},
// Other configurations...
};
// webpack.config.js const path = require('path'); module.exports = { entry: { main: './src/main.js', // Main process renderer: './src/renderer.js' // Renderer process }, // Other configurations... };
// webpack.config.js
const path = require('path');

module.exports = {
  entry: {
    main: './src/main.js', // Main process
    renderer: './src/renderer.js' // Renderer process
  },
  // Other configurations...
};

The

main.js
main.js file runs the Electron application, while
renderer.js
renderer.js is responsible for the UI. This separation ensures that both processes are independently managed and bundled.

Configuring Output Settings

Output settings determine where Webpack will place the bundled files after processing. This is crucial for Electron applications, as the main and renderer processes need to be correctly referenced in the final build.

Add the output configuration to the

webpack.config.js
webpack.config.js file:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// webpack.config.js
output: {
filename: '[name].bundle.js', // Uses entry point names
path: path.resolve(__dirname, 'dist'), // Output directory
publicPath: './', // Ensures paths are relative
},
// webpack.config.js output: { filename: '[name].bundle.js', // Uses entry point names path: path.resolve(__dirname, 'dist'), // Output directory publicPath: './', // Ensures paths are relative },
// webpack.config.js
output: {
  filename: '[name].bundle.js', // Uses entry point names
  path: path.resolve(__dirname, 'dist'), // Output directory
  publicPath: './', // Ensures paths are relative
},

Webpack will now create

main.bundle.js
main.bundle.js and
renderer.bundle.js
renderer.bundle.js in the
dist
dist folder after bundling the application.

Managing Environment Variables

Environment variables allow configuration settings to change depending on the environment (development, production, etc.). This is helpful for API keys, database URLs, and other sensitive information.

Use the

dotenv
dotenv package to manage environment variables. Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install dotenv --save
npm install dotenv --save
npm install dotenv --save

Create a

.env
.env file in your project root:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
NODE_ENV=development
API_URL=https://api.example.com
NODE_ENV=development API_URL=https://api.example.com
NODE_ENV=development
API_URL=https://api.example.com

Load these variables in your

webpack.config.js
webpack.config.js:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// webpack.config.js
require('dotenv').config();
module.exports = {
// Other configurations...
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.API_URL': JSON.stringify(process.env.API_URL)
})
]
};
// webpack.config.js require('dotenv').config(); module.exports = { // Other configurations... plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), 'process.env.API_URL': JSON.stringify(process.env.API_URL) }) ] };
// webpack.config.js
require('dotenv').config();

module.exports = {
  // Other configurations...
  plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
      'process.env.API_URL': JSON.stringify(process.env.API_URL)
    })
  ]
};

This setup enables you to access

process.env.NODE_ENV
process.env.NODE_ENV and
process.env.API_URL
process.env.API_URL in your application.

Related Article: How to Compare Vite and Webpack for Your Project

Implementing Code Splitting

Code splitting allows you to divide your code into separate bundles that can be loaded on demand. This reduces the initial loading time of your application, improving performance.

In Webpack, you can implement code splitting using dynamic imports. For example, in your

renderer.js
renderer.js, you might have:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// renderer.js
const loadModule = async () => {
const module = await import('./someModule.js');
module.init();
};
loadModule();
// renderer.js const loadModule = async () => { const module = await import('./someModule.js'); module.init(); }; loadModule();
// renderer.js
const loadModule = async () => {
  const module = await import('./someModule.js');
  module.init();
};

loadModule();

Webpack will automatically create a new bundle for

someModule.js
someModule.js and load it when needed.

Using Tree Shaking to Reduce Electron App Size

Tree shaking is a technique in Webpack that eliminates dead code from your bundles. This means any code that is not used in your application will not be included in the final output, reducing the size of the application.

To enable tree shaking, ensure that your Webpack configuration has the following:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// webpack.config.js
module.exports = {
mode: 'production', // Enable production mode
// Other configurations...
};
// webpack.config.js module.exports = { mode: 'production', // Enable production mode // Other configurations... };
// webpack.config.js
module.exports = {
  mode: 'production', // Enable production mode
  // Other configurations...
};

Additionally, ensure that all modules are written in ES6 format. For example:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// myModule.js
export const usedFunction = () => { /* some code */ };
export const unusedFunction = () => { /* some code */ };
// myModule.js export const usedFunction = () => { /* some code */ }; export const unusedFunction = () => { /* some code */ };
// myModule.js
export const usedFunction = () => { /* some code */ };
export const unusedFunction = () => { /* some code */ };

Only

usedFunction
usedFunction will be included in the final bundle if it is imported and used in your application.

Enabling Hot Module Replacement

Hot Module Replacement (HMR) allows you to update your application in real-time during development without needing a full reload. This provides a better development experience.

To enable HMR in Electron with Webpack, use the

webpack-dev-server
webpack-dev-server and
webpack-hot-middleware
webpack-hot-middleware. First, install the required packages:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install webpack-dev-server webpack-hot-middleware --save-dev
npm install webpack-dev-server webpack-hot-middleware --save-dev
npm install webpack-dev-server webpack-hot-middleware --save-dev

Modify your

webpack.config.js
webpack.config.js:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const webpack = require('webpack');
module.exports = {
// Other configurations...
plugins: [
new webpack.HotModuleReplacementPlugin(),
],
};
const webpack = require('webpack'); module.exports = { // Other configurations... plugins: [ new webpack.HotModuleReplacementPlugin(), ], };
const webpack = require('webpack');

module.exports = {
  // Other configurations...
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
  ],
};

In your

main.js
main.js, you can set up HMR like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
if (module.hot) {
module.hot.accept();
}
if (module.hot) { module.hot.accept(); }
if (module.hot) {
  module.hot.accept();
}

This allows the application to reflect changes instantly in the renderer process.

Using a Development Server

A development server provides a local environment for testing your application. It serves your app and automatically reloads when changes are made.

To set this up with Webpack, modify your

webpack.config.js
webpack.config.js to include a dev server configuration:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
devServer: {
contentBase: path.join(__dirname, 'dist'),
hot: true, // Enable HMR
port: 3000, // Port for the dev server
},
devServer: { contentBase: path.join(__dirname, 'dist'), hot: true, // Enable HMR port: 3000, // Port for the dev server },
devServer: {
  contentBase: path.join(__dirname, 'dist'),
  hot: true, // Enable HMR
  port: 3000, // Port for the dev server
},

You can then run the development server using:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npx webpack serve
npx webpack serve
npx webpack serve

This will start the server and serve your application at

http://localhost:3000
http://localhost:3000.

Related Article: How to Fix Angular Webpack Plugin Initialization Error

Loaders in Webpack transform files into modules as they are added to your application. For Electron projects, several loaders are commonly used:

1. babel-loader: Transpiles modern JavaScript to a version compatible with older browsers.

Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install babel-loader @babel/core @babel/preset-env --save-dev
npm install babel-loader @babel/core @babel/preset-env --save-dev
   npm install babel-loader @babel/core @babel/preset-env --save-dev

Configure it in

webpack.config.js
webpack.config.js:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] }
   module: {
     rules: [
       {
         test: /\.js$/,
         exclude: /node_modules/,
         use: {
           loader: 'babel-loader',
           options: {
             presets: ['@babel/preset-env']
           }
         }
       }
     ]
   }

2. css-loader: Allows you to import CSS files directly into your JavaScript.

Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install css-loader style-loader --save-dev
npm install css-loader style-loader --save-dev
   npm install css-loader style-loader --save-dev

Configure it in

webpack.config.js
webpack.config.js:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] }
   module: {
     rules: [
       {
         test: /\.css$/,
         use: ['style-loader', 'css-loader']
       }
     ]
   }

3. file-loader: Helps to manage image and font files by copying them to the output directory.

Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install file-loader --save-dev
npm install file-loader --save-dev
   npm install file-loader --save-dev

Configure it:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
module: {
rules: [
{
test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
use: {
loader: 'file-loader',
options: {
name: '[path][name].[ext]',
outputPath: 'assets/',
}
}
}
]
}
module: { rules: [ { test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/, use: { loader: 'file-loader', options: { name: '[path][name].[ext]', outputPath: 'assets/', } } } ] }
   module: {
     rules: [
       {
         test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
         use: {
           loader: 'file-loader',
           options: {
             name: '[path][name].[ext]',
             outputPath: 'assets/',
           }
         }
       }
     ]
   }

These loaders help to manage different types of assets within your Electron application.

Essential Plugins

Plugins extend the functionality of Webpack and are crucial in optimizing Electron applications. Here are some essential plugins:

1. HtmlWebpackPlugin: Simplifies the creation of HTML files that include your bundles.

Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install html-webpack-plugin --save-dev
npm install html-webpack-plugin --save-dev
   npm install html-webpack-plugin --save-dev

Configure it:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html', // Template for your HTML file
filename: 'index.html', // Output file name
}),
],
const HtmlWebpackPlugin = require('html-webpack-plugin'); plugins: [ new HtmlWebpackPlugin({ template: './src/index.html', // Template for your HTML file filename: 'index.html', // Output file name }), ],
   const HtmlWebpackPlugin = require('html-webpack-plugin');

   plugins: [
     new HtmlWebpackPlugin({
       template: './src/index.html', // Template for your HTML file
       filename: 'index.html', // Output file name
     }),
   ],

2. CleanWebpackPlugin: Cleans the output directory before each build.

Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install clean-webpack-plugin --save-dev
npm install clean-webpack-plugin --save-dev
   npm install clean-webpack-plugin --save-dev

Configure it:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
plugins: [
new CleanWebpackPlugin(),
],
const { CleanWebpackPlugin } = require('clean-webpack-plugin'); plugins: [ new CleanWebpackPlugin(), ],
   const { CleanWebpackPlugin } = require('clean-webpack-plugin');

   plugins: [
     new CleanWebpackPlugin(),
   ],

3. MiniCssExtractPlugin: Extracts CSS into separate files, which is useful for production.

Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install mini-css-extract-plugin --save-dev
npm install mini-css-extract-plugin --save-dev
   npm install mini-css-extract-plugin --save-dev

Configure it:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
],
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); plugins: [ new MiniCssExtractPlugin({ filename: '[name].css', chunkFilename: '[id].css', }), ],
   const MiniCssExtractPlugin = require('mini-css-extract-plugin');

   plugins: [
     new MiniCssExtractPlugin({
       filename: '[name].css',
       chunkFilename: '[id].css',
     }),
   ],

These plugins help streamline the build process and improve application performance.

Handling Static Assets

Handling static assets like images, fonts, and other media files is essential in any Electron application. Loaders play a key role in this process.

For instance, to manage images and fonts, you can leverage the

file-loader
file-loader as mentioned previously. This loader enables you to import assets directly into your JavaScript files.

In your

renderer.js
renderer.js, you might have:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import logo from './assets/logo.png';
const img = document.createElement('img');
img.src = logo;
document.body.appendChild(img);
import logo from './assets/logo.png'; const img = document.createElement('img'); img.src = logo; document.body.appendChild(img);
import logo from './assets/logo.png';

const img = document.createElement('img');
img.src = logo;
document.body.appendChild(img);

Webpack processes the image and places it in the output directory, allowing you to reference it easily in your code.

Optimizing Size with Asset Management Techniques

Optimizing the size of your Electron application is crucial for performance and user experience. Techniques such as image optimization, compression, and minification can significantly reduce the size of your final bundle.

1. Image Optimization: Use tools like

image-webpack-loader
image-webpack-loader to optimize images during the build process. Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install image-webpack-loader --save-dev
npm install image-webpack-loader --save-dev
   npm install image-webpack-loader --save-dev

Configure it in

webpack.config.js
webpack.config.js:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192, // In bytes
},
},
{
loader: 'image-webpack-loader',
options: {
mozjpeg: {
progressive: true,
quality: 65,
},
// Other optimization options...
},
},
],
},
],
}
module: { rules: [ { test: /\.(png|jpg|gif)$/, use: [ { loader: 'url-loader', options: { limit: 8192, // In bytes }, }, { loader: 'image-webpack-loader', options: { mozjpeg: { progressive: true, quality: 65, }, // Other optimization options... }, }, ], }, ], }
   module: {
     rules: [
       {
         test: /\.(png|jpg|gif)$/,
         use: [
           {
             loader: 'url-loader',
             options: {
               limit: 8192, // In bytes
             },
           },
           {
             loader: 'image-webpack-loader',
             options: {
               mozjpeg: {
                 progressive: true,
                 quality: 65,
               },
               // Other optimization options...
             },
           },
         ],
       },
     ],
   }

2. Compression: Use the

compression-webpack-plugin
compression-webpack-plugin to compress your JavaScript bundles.

Install it with:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install compression-webpack-plugin --save-dev
npm install compression-webpack-plugin --save-dev
   npm install compression-webpack-plugin --save-dev

Configure it:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const CompressionWebpackPlugin = require('compression-webpack-plugin');
plugins: [
new CompressionWebpackPlugin({
algorithm: 'gzip',
test: /\.js$|\.css$|\.html$/,
threshold: 10240,
minRatio: 0.8,
}),
],
const CompressionWebpackPlugin = require('compression-webpack-plugin'); plugins: [ new CompressionWebpackPlugin({ algorithm: 'gzip', test: /\.js$|\.css$|\.html$/, threshold: 10240, minRatio: 0.8, }), ],
   const CompressionWebpackPlugin = require('compression-webpack-plugin');

   plugins: [
     new CompressionWebpackPlugin({
       algorithm: 'gzip',
       test: /\.js$|\.css$|\.html$/,
       threshold: 10240,
       minRatio: 0.8,
     }),
   ],

These techniques help reduce the overall application size, leading to faster loading times and better performance.

Related Article: How To Define A Plugin In Webpack

Module Federation

Module Federation allows multiple Webpack builds to share code, enabling greater flexibility and reusability. This is particularly useful in large applications or micro-frontend architectures.

To set up Module Federation, you will need to configure your

webpack.config.js
webpack.config.js as follows:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
plugins: [
new ModuleFederationPlugin({
name: 'app1',
filename: 'remoteEntry.js',
remotes: {
app2: 'app2@http://localhost:3001/remoteEntry.js',
},
exposes: {
'./Component': './src/Component',
},
shared: {
react: { singleton: true, eager: true },
'react-dom': { singleton: true, eager: true },
},
}),
],
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); plugins: [ new ModuleFederationPlugin({ name: 'app1', filename: 'remoteEntry.js', remotes: { app2: 'app2@http://localhost:3001/remoteEntry.js', }, exposes: { './Component': './src/Component', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), ],
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

plugins: [
  new ModuleFederationPlugin({
    name: 'app1',
    filename: 'remoteEntry.js',
    remotes: {
      app2: 'app2@http://localhost:3001/remoteEntry.js',
    },
    exposes: {
      './Component': './src/Component',
    },
    shared: {
      react: { singleton: true, eager: true },
      'react-dom': { singleton: true, eager: true },
    },
  }),
],

In this example,

app1
app1 can consume components from
app2
app2, enhancing modularity and maintaining a clean architecture.

Best Practices for Configuring Electron with Bundling

Following best practices ensures a smooth development experience and a high-quality application. Here are some best practices:

1. Keep Processes Separate: Maintain distinct entry points for the main and renderer processes to keep concerns separated.

2. Use Production Mode: Always set Webpack to production mode for builds to enable optimizations like minification and tree shaking.

3. Version Control: Use version control for your configuration files to track changes and revert if necessary.

4. Regular Updates: Keep Webpack and its plugins up to date to benefit from the latest features and security patches.

5. Testing: Implement automated testing to ensure that changes do not break existing functionality.

Configuring Production Builds for Electron Applications

Configuring production builds is essential for deploying a stable version of your Electron application. Use the following configurations in your

webpack.config.js
webpack.config.js:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
mode: 'production',
optimization: {
minimize: true,
minimizer: [new TerserPlugin()],
},
output: {
path: path.resolve(__dirname, 'build'),
filename: '[name].[contenthash].js',
},
};
const TerserPlugin = require('terser-webpack-plugin'); module.exports = { mode: 'production', optimization: { minimize: true, minimizer: [new TerserPlugin()], }, output: { path: path.resolve(__dirname, 'build'), filename: '[name].[contenthash].js', }, };
const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  mode: 'production',
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: '[name].[contenthash].js',
  },
};

In production builds, ensure that the application is minified and optimized for performance. Use the

TerserPlugin
TerserPlugin to minimize JavaScript files, and utilize content hashes in filenames for better caching strategies.

Following these guidelines will help create a robust Electron application that is optimized for performance and scalability.

Additional Resources



- Setting Up Webpack with Electron

- Recommended Loaders for Electron Apps with Webpack

- Essential Webpack Plugins for Electron Projects

You May Also Like

How to Use the Webpack CLI Option -d

The Webpack CLI option -d is essential for setting the development mode in your build process. This mode optimizes the development experience by enab… read more

How to Fix webpack Build Cannot Find Name ‘vi’ Vitest

This guide addresses the common issue of webpack not recognizing the 'vi' identifier in Vitest builds. It covers practical solutions and configuratio… read more

How to Use webpack -d for Development Mode

This guide provides a clear overview of using webpack with the -d flag to enable development mode. It covers essential topics such as setting up a de… read more

How to Optimize CSS Assets with Webpack Plugin

Optimizing CSS assets is crucial for improving web performance and user experience. This guide focuses on using a Webpack plugin to streamline CSS ma… read more

How to Configure SVGR with Webpack

This guide provides a clear path to setting up SVGR with Webpack for converting SVG files into React components. It covers the essential steps and co… read more

How to Bypass a Router with Webpack Proxy

Bypassing a router using a Webpack proxy allows developers to streamline their local development experience while interacting with APIs. This guide b… read more

How to Configure DevServer Proxy in Webpack

This guide provides a clear path to configuring the DevServer proxy in Webpack. It covers essential topics such as setting up the development server,… read more

How to Use Environment Variables in Webpack

Environment variables play a crucial role in managing configuration settings for applications built with Webpack. This guide provides a clear path fo… read more

How To Exclude Test Files In Webpack Builds

Excluding test files from your Webpack build process is crucial for optimizing performance and reducing bundle size. This guide covers the essential … read more

How to Use Webpack Manifest Plugin

The Webpack Manifest Plugin is a tool that generates a manifest file for your assets, allowing you to map your original asset names to their output f… read more